diff --git a/src/main/java/com/dsic/gj_erp/config/DynamicDataSourceConfig.java b/src/main/java/com/dsic/gj_erp/config/DynamicDataSourceConfig.java new file mode 100644 index 0000000..7ba5509 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/config/DynamicDataSourceConfig.java @@ -0,0 +1,26 @@ +package com.dsic.gj_erp.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + +@Configuration +public class DynamicDataSourceConfig { + @Primary + @Bean("masterDataSource") + @ConfigurationProperties("spring.datasource.master") + public DataSource masterDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean("jiuzhouDataSource") + @ConfigurationProperties("spring.datasource.jiuzhou") + public DataSource jiuzhouDataSource() { + return DataSourceBuilder.create().build(); + } + +} diff --git a/src/main/java/com/dsic/gj_erp/config/JapConfig.java b/src/main/java/com/dsic/gj_erp/config/JapConfig.java new file mode 100644 index 0000000..b87d107 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/config/JapConfig.java @@ -0,0 +1,96 @@ +package com.dsic.gj_erp.config; + +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.boot.model.naming.PhysicalNamingStrategy; +import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.init.DataSourceInitializer; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; +import java.util.Properties; + +@Configuration +@EnableJpaRepositories( + basePackages = "com.dsic.gj_erp", + entityManagerFactoryRef = "manEntityManagerFactory", + transactionManagerRef = "manTransactionManager" +) +public class JapConfig { + @Autowired + private Environment env; //1 + + @Bean + @ConfigurationProperties(prefix = "spring.datasource.master") + public DataSourceProperties japDataSourceProperties() { + return new DataSourceProperties(); + } + + @Bean("jpaDataSource") + public DataSource jpaDataSource() { + DataSourceProperties manDataSourceProperties = japDataSourceProperties(); + return DataSourceBuilder.create() + .driverClassName(manDataSourceProperties.getDriverClassName()) + .url(manDataSourceProperties.getUrl()) + .username(manDataSourceProperties.getUsername()) + .password(manDataSourceProperties.getPassword()) + .build(); + } + + @Bean + public PlatformTransactionManager manTransactionManager() { //4 + EntityManagerFactory factory = manEntityManagerFactory().getObject(); + return new JpaTransactionManager(factory); + } + + @Bean + public PhysicalNamingStrategy physicalNamingStrategy() { + return new PhysicalNamingStrategyStandardImpl() { + @Override + public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) { + return Identifier.toIdentifier(StringUtils.camelToUnderline(name.getText())); + } + }; + } + + @Bean + public LocalContainerEntityManagerFactoryBean manEntityManagerFactory() { + LocalContainerEntityManagerFactoryBean factory = + new LocalContainerEntityManagerFactoryBean(); + factory.setDataSource(jpaDataSource()); + factory.setPackagesToScan("com.dsic.gj_erp"); + factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); + Properties jpaProperties = new Properties(); + //设置控制台打印sql + jpaProperties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql")); + //字段驼峰转下划线 + jpaProperties.put("hibernate.physical_naming_strategy", env.getProperty("hibernate.naming.physical_strategy")); + factory.setJpaProperties(jpaProperties); + return factory; + } + + @Bean + public DataSourceInitializer manDataSourceInitializer() {//6 + DataSourceInitializer dsInitializer = new DataSourceInitializer(); + dsInitializer.setDataSource(jpaDataSource()); + ResourceDatabasePopulator dbPopulator = new ResourceDatabasePopulator(); + dsInitializer.setDatabasePopulator(dbPopulator); + dsInitializer.setEnabled(env.getProperty("spring.datasource.master.initialize", + Boolean.class, false)); + return dsInitializer; + } +} diff --git a/src/main/java/com/dsic/gj_erp/config/MyBatisPlusConfigJiuZhou.java b/src/main/java/com/dsic/gj_erp/config/MyBatisPlusConfigJiuZhou.java new file mode 100644 index 0000000..3b8bd63 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/config/MyBatisPlusConfigJiuZhou.java @@ -0,0 +1,64 @@ +package com.dsic.gj_erp.config; + +import com.baomidou.mybatisplus.core.MybatisConfiguration; +import com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver; +import com.baomidou.mybatisplus.core.config.GlobalConfig; +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; +import com.github.jeffreyning.mybatisplus.base.MppSqlInjector; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.type.JdbcType; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; + +import javax.sql.DataSource; + +@MapperScan(basePackages = {"com.dsic.gj_erp.jiuzhoumapper"}, sqlSessionTemplateRef = "jiuzhouSqlSessionTemplate") +@Configuration +public class MyBatisPlusConfigJiuZhou { + @Bean("jiuzhouSqlSessionFactory") + public SqlSessionFactory jiuzhouSqlSessionFactory(@Qualifier("jiuzhouDataSource") DataSource dataSource, MppSqlInjector mppSqlInjector) throws Exception { + MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean(); + + sqlSessionFactory.setDataSource(dataSource); + + MybatisConfiguration configuration = new MybatisConfiguration(); + configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class); + configuration.setJdbcTypeForNull(JdbcType.NULL); + configuration.setMapUnderscoreToCamelCase(true); + sqlSessionFactory.setConfiguration(configuration); + + sqlSessionFactory.setTypeAliasesPackage("com.dsic.gj_erp.bean"); + sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver(). + getResources("classpath:mappers/*/*.xml")); + sqlSessionFactory.setPlugins(new PaginationInterceptor()); + sqlSessionFactory.setGlobalConfig(globalConfig(mppSqlInjector)); + + return sqlSessionFactory.getObject(); + } + + + @Bean(name = "jiuzhouTransactionManager") + public DataSourceTransactionManager jiuzhouTransactionManager(@Qualifier("jiuzhouDataSource") DataSource dataSource) { + return new DataSourceTransactionManager(dataSource); + } + + @Bean(name = "jiuzhouSqlSessionTemplate") + public SqlSessionTemplate jiuzhouSqlSessionTemplate(@Qualifier("jiuzhouSqlSessionFactory") SqlSessionFactory sqlSessionFactory) { + return new SqlSessionTemplate(sqlSessionFactory); + } + + public GlobalConfig globalConfig(MppSqlInjector mppSqlInjector) { + GlobalConfig globalConfig = new GlobalConfig(); + GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig(); + globalConfig.setDbConfig(dbConfig); + globalConfig.setSqlInjector(mppSqlInjector); + globalConfig.setBanner(false); + return globalConfig; + } +} diff --git a/src/main/java/com/dsic/gj_erp/config/MyBatisPlusConfigMaster.java b/src/main/java/com/dsic/gj_erp/config/MyBatisPlusConfigMaster.java new file mode 100644 index 0000000..ac21bae --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/config/MyBatisPlusConfigMaster.java @@ -0,0 +1,68 @@ +package com.dsic.gj_erp.config; + +import com.baomidou.mybatisplus.core.MybatisConfiguration; +import com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver; +import com.baomidou.mybatisplus.core.config.GlobalConfig; +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; +import com.github.jeffreyning.mybatisplus.base.MppSqlInjector; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.type.JdbcType; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; + +import javax.sql.DataSource; + +@MapperScan(basePackages = {"com.dsic.gj_erp.mapper"}, sqlSessionTemplateRef = "masterSqlSessionTemplate") +@Configuration +public class MyBatisPlusConfigMaster { + @Primary + @Bean("masterSqlSessionFactory") + public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource, MppSqlInjector mppSqlInjector) throws Exception { + MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean(); + + sqlSessionFactory.setDataSource(dataSource); + + MybatisConfiguration configuration = new MybatisConfiguration(); + configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class); + configuration.setJdbcTypeForNull(JdbcType.NULL); + configuration.setMapUnderscoreToCamelCase(true); + sqlSessionFactory.setConfiguration(configuration); + + sqlSessionFactory.setTypeAliasesPackage("com.dsic.gj_erp.bean"); + sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver(). + getResources("classpath:mappers/*/*.xml")); + sqlSessionFactory.setPlugins(new PaginationInterceptor()); + sqlSessionFactory.setGlobalConfig(globalConfig(mppSqlInjector)); + + return sqlSessionFactory.getObject(); + } + + + @Primary + @Bean(name = "masterTransactionManager") + public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) { + return new DataSourceTransactionManager(dataSource); + } + + @Primary + @Bean(name = "masterSqlSessionTemplate") + public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) { + return new SqlSessionTemplate(sqlSessionFactory); + } + + public GlobalConfig globalConfig(MppSqlInjector mppSqlInjector) { + GlobalConfig globalConfig = new GlobalConfig(); + GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig(); + globalConfig.setDbConfig(dbConfig); + globalConfig.setSqlInjector(mppSqlInjector); + globalConfig.setBanner(false); + return globalConfig; + } +} diff --git a/src/main/java/com/dsic/gj_erp/config/MyPhysicalNamingStrategy.java b/src/main/java/com/dsic/gj_erp/config/MyPhysicalNamingStrategy.java new file mode 100644 index 0000000..4e2707c --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/config/MyPhysicalNamingStrategy.java @@ -0,0 +1,39 @@ +package com.dsic.gj_erp.config; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.boot.model.naming.PhysicalNamingStrategy; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; + +public class MyPhysicalNamingStrategy implements PhysicalNamingStrategy { + @Override + public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment jdbcEnvironment) { + return name; + } + + @Override + public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment jdbcEnvironment) { + return name; + } + + @Override + public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) { + return name; + } + + @Override + public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEnvironment) { + return name; + } + + @Override + public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment) { + //用数组列出所有大写字母 + String[] chars = new String[]{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}; + if (StrUtil.startWithAny(name.getText(), chars)) { + return name; + } + return Identifier.toIdentifier(StringUtils.camelToUnderline(name.getText())); + } +}