1、mybatis多數據源的使用場景: 操作同一台服務器上不同的數據庫,或者多地機器上的相同或不相同數據庫。 進行跨庫操作、多數據源進行分離數據; 使得程序得以擴展,當一台或者部分服務器宕機,不影響整個應用的服務; 2、多數據源配置的思路: 數據隔離,把數據分別存放在test、test02這兩個數據庫中; 創建數據源Datasource指定使用的哪個數據源配置,並將其注入到SqlSessionFactory 會話工廠; 創建事務TransactionManager,需把數據源注入; 把SqlSessionFactory 注入,創建sqlSessionTemplate模板,使用模板操作mapper接口; 把模板放到mapper 路徑下,並 @MapperScan注解 聲明mapper接口位置;
1,在application.yml中配置兩個數據源的信息
#配置多數據源 spring.datasource.iam.jdbc-url: jdbc:mysql://localhost:3306/iam spring.datasource.iam.username: root spring.datasource.iam.password: root spring.datasource.iam.driver-class-name: com.mysql.cj.jdbc.Driver spring.datasource.appstore.jdbc-url: jdbc:mysql://localhost:3306/appstore spring.datasource.appstore.username: root spring.datasource.appstore.password: root spring.datasource.appstore.driver-class-name: com.mysql.cj.jdbc.Driver
2,創建並配置兩個數據源的datasourceConfig
2.1 iamDataSourceConfig配置
/** * 創建iam庫的數據源 */ @Configuration @MapperScan(basePackages = "com.primeton.tags.mapper.iam",sqlSessionTemplateRef = "iamSqlSessionTemplate") public class IamDataSourceConfig { /** * 加載配置數據源 * @return * @Primary 是指具有默認值 */ @Bean(name="iamDataSource") //作用在方法上,注入;一般和@Qualifier配合使用 @ConfigurationProperties(prefix = "spring.datasource.iam") //指定加載哪個數據庫配置 @Primary //是指默認值,多個數據源只能存在一個默認值,及僅能一個數據源使用該注解 public DataSource iamDataSource() { return DataSourceBuilder.create().build(); } /** * 創建會話工廠SqlSessionFactory * @param dataSource * @return * @throws Exception */ @Bean(name="iamSqlSessionFactory") @Primary public SqlSessionFactory iamSqlSessionFactory(@Qualifier("iamDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity"); //設置mybatis別名 sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/iam/*.xml")); return sqlSessionFactoryBean.getObject(); } /** * 創建事務 TransactionManager * @param dataSource * @return */ @Bean(name="iamTransactionManager") @Primary public DataSourceTransactionManager testTransactionManager(@Qualifier("iamDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } /** * 創建SqlSessionTemplate模版 * @param sqlSessionFactory * @return */ @Bean(name="iamSqlSessionTemplate") @Primary public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("iamSqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); } }
2.2 AppstoreDataSourceConfig配置
@Configuration @MapperScan(basePackages = "com.primeton.tags.mapper.appstore",sqlSessionTemplateRef = "appstoreSqlSessionTemplate") public class AppstoreDataSourceConfig { @Bean(name="appstoreDataSource") @ConfigurationProperties(prefix = "spring.datasource.appstore") public DataSource appstoreDataSource() { return DataSourceBuilder.create().build(); } @Bean(name="appstoreSqlSessionFactory") public SqlSessionFactory appstoreSqlSessionFactory(@Qualifier("appstoreDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity"); sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/appstore/*.xml")); return sqlSessionFactoryBean.getObject(); } @Bean(name="appstoreTransactionManager") public DataSourceTransactionManager testTransactionManager(@Qualifier("appstoreDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name="appstoreSqlSessionTemplate") public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("appstoreSqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); } }
3,編寫mapper接口和對應的xml(跟單庫時一樣);
@Mapper public interface TagMapper { List<Tag> selectAllTag(); }
<mapper namespace="com.primeton.tags.mapper.iam.TagMapper"> <select id="selectAllTag" resultType="tag"> select * from tag_tb t </select> </mapper>
4,單元測試
@SpringBootTest public class MultiDataSourceTest { @Autowired private TagMapper tagMapper; @Autowired private Tag2Mapper tag2Mapper; @Test public void testSelectAll() { List<Tag> tagList = tagMapper.selectAllTag(); List<Tag> tag2List = tag2Mapper.selectAllTag(); System.out.println("tagList:"+tagList); System.out.println("tag2List:"+tag2List); } }
開發中遇到的問題:
1,使用多數據源后別名失效;
博客:https://blog.csdn.net/xiaoxiao48/article/details/105725009
解決辦法:在多數據源的配置中設置別名:
sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity"); //設置mybatis別名
2,使用多數據源后mybatis日志失效:
博客:https://blog.csdn.net/qq_40791070/article/details/100665502
解決辦法:
1,在yml中添加mybatis日志配置
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2,在某一個自定義的多數據源配置中進行配置;
注意:不能在每個多數據源配置中都添加,否則會報錯。
@Bean(name="iamSqlSessionFactory") @Primary public SqlSessionFactory iamSqlSessionFactory(@Qualifier("iamDataSource") DataSource dataSource, MybatisProperties mybatisProperties) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity"); //設置mybatis別名 sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/iam/*.xml")); sqlSessionFactoryBean.setConfiguration(mybatisProperties.getConfiguration()); return sqlSessionFactoryBean.getObject(); }
3,在配置了多數據源后,mybatis-plus分頁功能失效
博客:https://blog.csdn.net/qq_22008739/article/details/88885732
解決辦法:集成多數據源的時候需要手動配置分頁插件
3.1 mybatis-plus分頁配置
@Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }
3.2 在多數據源配置中進行配置
@Bean(name="iamSqlSessionFactory") @Primary public SqlSessionFactory iamSqlSessionFactory(@Qualifier("iamDataSource") DataSource dataSource, MybatisProperties mybatisProperties) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity"); //設置mybatis別名 sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/iam/*.xml")); sqlSessionFactoryBean.setConfiguration(mybatisProperties.getConfiguration()); //配置多數據源后打印日志 MybatisConfiguration config = new MybatisConfiguration(); config.addInterceptor(new PaginationInterceptor()); sqlSessionFactoryBean.setConfiguration(config); //解決配置多數據源后mybatis-plus分頁失效問題 return sqlSessionFactoryBean.getObject(); }
1,在application.yml中配置兩個數據源的信息
#配置多數據源spring.datasource.iam.jdbc-url: jdbc:mysql://localhost:3306/iamspring.datasource.iam.username: rootspring.datasource.iam.password: rootspring.datasource.iam.driver-class-name: com.mysql.cj.jdbc.Driver
spring.datasource.appstore.jdbc-url: jdbc:mysql://localhost:3306/appstorespring.datasource.appstore.username: rootspring.datasource.appstore.password: rootspring.datasource.appstore.driver-class-name: com.mysql.cj.jdbc.Driver123456789102,創建並配置兩個數據源的datasourceConfig2.1 iamDataSourceConfig配置
/** * 創建iam庫的數據源 */@Configuration@MapperScan(basePackages = "com.primeton.tags.mapper.iam",sqlSessionTemplateRef = "iamSqlSessionTemplate")public class IamDataSourceConfig {
/** * 加載配置數據源 * @return * @Primary 是指具有默認值 */ @Bean(name="iamDataSource") //作用在方法上,注入;一般和@Qualifier配合使用 @ConfigurationProperties(prefix = "spring.datasource.iam") //指定加載哪個數據庫配置 @Primary //是指默認值,多個數據源只能存在一個默認值,及僅能一個數據源使用該注解 public DataSource iamDataSource() { return DataSourceBuilder.create().build(); }
/** * 創建會話工廠SqlSessionFactory * @param dataSource * @return * @throws Exception */ @Bean(name="iamSqlSessionFactory") @Primary public SqlSessionFactory iamSqlSessionFactory(@Qualifier("iamDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity"); //設置mybatis別名 sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/iam/*.xml")); return sqlSessionFactoryBean.getObject(); }
/** * 創建事務 TransactionManager * @param dataSource * @return */ @Bean(name="iamTransactionManager") @Primary public DataSourceTransactionManager testTransactionManager(@Qualifier("iamDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); }
/** * 創建SqlSessionTemplate模版 * @param sqlSessionFactory * @return */ @Bean(name="iamSqlSessionTemplate") @Primary public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("iamSqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); }}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657582.2 AppstoreDataSourceConfig配置
@Configuration@MapperScan(basePackages = "com.primeton.tags.mapper.appstore",sqlSessionTemplateRef = "appstoreSqlSessionTemplate")public class AppstoreDataSourceConfig {
@Bean(name="appstoreDataSource") @ConfigurationProperties(prefix = "spring.datasource.appstore") public DataSource appstoreDataSource() { return DataSourceBuilder.create().build(); }
@Bean(name="appstoreSqlSessionFactory") public SqlSessionFactory appstoreSqlSessionFactory(@Qualifier("appstoreDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity"); sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/appstore/*.xml")); return sqlSessionFactoryBean.getObject(); }
@Bean(name="appstoreTransactionManager") public DataSourceTransactionManager testTransactionManager(@Qualifier("appstoreDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); }
@Bean(name="appstoreSqlSessionTemplate") public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("appstoreSqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); }}12345678910111213141516171819202122232425262728293,編寫mapper接口和對應的xml(跟單庫時一樣);
@Mapperpublic interface TagMapper { List<Tag> selectAllTag();}1234<mapper namespace="com.primeton.tags.mapper.iam.TagMapper"> <select id="selectAllTag" resultType="tag"> select * from tag_tb t </select></mapper>12345674,單元測試
@SpringBootTestpublic class MultiDataSourceTest { @Autowired private TagMapper tagMapper; @Autowired private Tag2Mapper tag2Mapper;
@Test public void testSelectAll() { List<Tag> tagList = tagMapper.selectAllTag(); List<Tag> tag2List = tag2Mapper.selectAllTag(); System.out.println("tagList:"+tagList); System.out.println("tag2List:"+tag2List); }}123456789101112131415開發中遇到的問題:
1,使用多數據源后別名失效;博客:https://blog.csdn.net/xiaoxiao48/article/details/105725009
解決辦法:在多數據源的配置中設置別名:
sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity"); //設置mybatis別名12,使用多數據源后mybatis日志失效:博客:https://blog.csdn.net/qq_40791070/article/details/100665502解決辦法:1,在yml中添加mybatis日志配置
mybatis: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl1232,在某一個自定義的多數據源配置中進行配置;注意:不能在每個多數據源配置中都添加,否則會報錯。
@Bean(name="iamSqlSessionFactory") @Primary public SqlSessionFactory iamSqlSessionFactory(@Qualifier("iamDataSource") DataSource dataSource, MybatisProperties mybatisProperties) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity"); //設置mybatis別名 sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/iam/*.xml")); sqlSessionFactoryBean.setConfiguration(mybatisProperties.getConfiguration()); return sqlSessionFactoryBean.getObject(); }123456789103,在配置了多數據源后,mybatis-plus分頁功能失效
博客:https://blog.csdn.net/qq_22008739/article/details/88885732解決辦法:集成多數據源的時候需要手動配置分頁插件3.1 mybatis-plus分頁配置
@Configurationpublic class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); }}12345673.2 在多數據源配置中進行配置
@Bean(name="iamSqlSessionFactory") @Primary public SqlSessionFactory iamSqlSessionFactory(@Qualifier("iamDataSource") DataSource dataSource, MybatisProperties mybatisProperties) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity"); //設置mybatis別名 sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/iam/*.xml")); sqlSessionFactoryBean.setConfiguration(mybatisProperties.getConfiguration()); //配置多數據源后打印日志 MybatisConfiguration config = new MybatisConfiguration(); config.addInterceptor(new PaginationInterceptor()); sqlSessionFactoryBean.setConfiguration(config); //解決配置多數據源后mybatis-plus分頁失效問題 return sqlSessionFactoryBean.getObject(); }————————————————版權聲明:本文為CSDN博主「qiaosaifei」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/qiaosaifei/article/details/117743659