🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
> 本节采用的多数据源的实现方式,仍然是分包策略。即:操作接口分包存放,Spring扫描不同的包,自动注入不同的数据源。这种方式实现简单,也是一种“约定大于配置”思想的典型应用。 ## 一、修改application.yml为双数据源 在application.yml配置双数据源,第一个数据源访问testdb库,第二个数据源访问testdb2库 ~~~ spring: datasource: primary: jdbc-url: jdbc:mysql://192.168.1.91:3306/testdb?useUnicode=true&characterEncoding=utf-8&useSSL=false username: test password: 4rfv$RFV driver-class-name: com.mysql.jdbc.Driver secondary: jdbc-url: jdbc:mysql://192.168.1.91:3306/testdb2?useUnicode=true&characterEncoding=utf-8&useSSL=false username: test password: 4rfv$RFV driver-class-name: com.mysql.jdbc.Driver ~~~ ## 二、主数据源配置 去掉SpringBoot程序主入口上的@MapperScan注解,将注解移到下面的MyBatis专用配置类上方。 DataSource数据源、SqlSessionFactory、TransactionManager事务管理器、SqlSessionTemplate依据不同的数据源分别配置。第一组是primary,第二组是secondary。 ~~~ @Configuration @MapperScan(basePackages = "com.zimug.bootlaunch.generator.testdb", //数据源primary-testdb库接口存放目录 sqlSessionTemplateRef = "primarySqlSessionTemplate") public class PrimaryDataSourceConfig { @Bean(name = "primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") //数据源primary配置 @Primary public DataSource testDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "primarySqlSessionFactory") @Primary public SqlSessionFactory testSqlSessionFactory( @Qualifier("primaryDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //设置XML文件存放位置,如果参考上一篇Mybatis最佳实践,将xml和java放在同一目录下,这里不用配置 //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml")); return bean.getObject(); } @Bean(name = "primaryTransactionManager") @Primary public DataSourceTransactionManager testTransactionManager( @Qualifier("primaryDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "primarySqlSessionTemplate") @Primary public SqlSessionTemplate testSqlSessionTemplate( @Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } } ~~~ ## 三、第二个数据源配置 参照primary配置,书写第二份secondary数据源配置的代码。 ~~~ @Configuration @MapperScan(basePackages = "com.zimug.bootlaunch.generator.testdb2", //注意这里testdb2目录 sqlSessionTemplateRef = "secondarySqlSessionTemplate") public class SecondaryDataSourceConfig { @Bean(name = "secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") //注意这里secondary配置 public DataSource testDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondarySqlSessionFactory") public SqlSessionFactory testSqlSessionFactory( @Qualifier("secondaryDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml")); return bean.getObject(); } @Bean(name = "secondaryTransactionManager") public DataSourceTransactionManager testTransactionManager( @Qualifier("secondaryDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "secondarySqlSessionTemplate") public SqlSessionTemplate testSqlSessionTemplate( @Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } } ~~~ ## 四、 测试用例 将自动生成的代码(自己写Mapper和实体类也可以),分别存放于testdb和testdb2两个文件夹 ![](https://box.kancloud.cn/a96cb8e34c72b97cfd56f7322a2613e3_445x293.png) 在Service层测试代码 ~~~ @Override @Transactional public ArticleVO saveArticle(ArticleVO article) { Article articlePO = dozerMapper.map(article,Article.class); articleMapper.insert(articlePO); Message message = new Message(); message.setName("kobe"); message.setContent("退役啦"); messageMapper.insert(message); return article; } ~~~ 将上面的代码,写入service接口,在同一个函数中构造article和message对象,并将对象数据调用Mapper插入数据库中。如果article数据插入testdb库的article表中,message数据插入testdb2库的message表中,就表示我们的多数据源配置正确了。