问题:
在实际开发过程中,会遇到调用两个数据库的操作,开发到一半,不能将配置文件大改,要不改变原开发模式的情况下,动态调用另一个数据库。
做法:
设置一个主数据库,在什么也不写的情况下,调用的是主数据库。如果调用另一个数据库,则加上一句说明即可。

1.修改配置文件

  1. #---------------------------------------------------------------------------------
  2. #master 数据源配置
  3. master.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  4. master.datasource.url=jdbc:mysql://xxx:3306/xxx?useSSL=false&serverTimezone=GMT%2B8
  5. master.datasource.username=xxx
  6. master.datasource.password=xxx
  7. #assert 数据源配置
  8. assert.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  9. assert.datasource.url=jdbc:mysql://yyy:3306/yyy?useSSL=false&serverTimezone=GMT%2B8
  10. assert.datasource.username=yyy
  11. assert.datasource.password=yyy

2.修改mybatis加载类

修改主数据库的配置类

  1. @Value("${master.datasource.driver-class-name}")
  2. private String driverClassName;
  3. @Value("${master.datasource.url}")
  4. private String url;
  5. @Value("${master.datasource.username}")
  6. private String username;
  7. @Value("${master.datasource.password}")
  8. private String password;
  9. @Bean(name = "masterDataSource")
  10. @Primary
  11. public DataSource dataSource() {
  12. DruidDataSource dataSource = new DruidDataSource();
  13. dataSource.setDriverClassName(this.driverClassName);
  14. dataSource.setUrl(this.url);
  15. dataSource.setUsername(this.username);
  16. dataSource.setPassword(this.password);
  17. return dataSource;
  18. }
  19. //设置主数据库
  20. @Bean(name = "masterSqlSessionFactory")
  21. @Primary
  22. public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
  23. SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
  24. factory.setDataSource(dataSource);
  25. factory.setTypeAliasesPackage(MODEL_PACKAGE);
  26. //配置分页插件,详情请查阅官方文档
  27. PageHelper pageHelper = new PageHelper();
  28. Properties properties = new Properties();
  29. properties.setProperty("pageSizeZero", "true");//分页尺寸为0时查询所有纪录不再执行分页
  30. properties.setProperty("reasonable", "true");//页码<=0 查询第一页,页码>=总页数查询最后一页
  31. properties.setProperty("supportMethodsArguments", "true");//支持通过 Mapper 接口参数来传递分页参数
  32. pageHelper.setProperties(properties);
  33. //添加插件
  34. factory.setPlugins(new Interceptor[]{pageHelper});
  35. //添加XML目录
  36. ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
  37. factory.setMapperLocations(resolver.getResources("classpath*:mapper/*.xml"));
  38. factory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
  39. return factory.getObject();
  40. }
  41. //设置主事务
  42. @Bean(name = "masterTransactionManager")
  43. @Primary
  44. public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
  45. return new DataSourceTransactionManager(dataSource);
  46. }

增加另一个数据库的配置类

  1. import javax.sql.DataSource;
  2. @Configuration
  3. public class MyBatisAssertConfigurer {
  4. @Value("${assert.datasource.driver-class-name}")
  5. private String driverClassName;
  6. @Value("${assert.datasource.url}")
  7. private String url;
  8. @Value("${assert.datasource.username}")
  9. private String username;
  10. @Value("${assert.datasource.password}")
  11. private String password;
  12. @Bean(name = "assertDataSource")
  13. public DataSource dataSource() {
  14. DruidDataSource dataSource = new DruidDataSource();
  15. dataSource.setDriverClassName(this.driverClassName);
  16. dataSource.setUrl(this.url);
  17. dataSource.setUsername(this.username);
  18. dataSource.setPassword(this.password);
  19. return dataSource;
  20. }
  21. @Bean(name = "assertSqlSessionFactory")
  22. public SqlSessionFactory sqlSessionFactory(@Qualifier("assertDataSource") DataSource dataSource) throws Exception {
  23. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  24. bean.setDataSource(dataSource);
  25. bean.setMapperLocations(
  26. new PathMatchingResourcePatternResolver().getResources("classpath*:assert/*.xml"));
  27. return bean.getObject();
  28. }
  29. @Bean(name = "assertTransactionManager")
  30. public DataSourceTransactionManager transactionManager(@Qualifier("assertDataSource") DataSource dataSource) {
  31. return new DataSourceTransactionManager(dataSource);
  32. }
  33. }

修改mybatis的动态加载

  1. @Configuration
  2. public class MapperScanConfigurer {
  3. @Bean
  4. public MapperScannerConfigurer primaryMapperScannerConfigurer() {
  5. MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
  6. mapperScannerConfigurer.setSqlSessionFactoryBeanName("masterSqlSessionFactory");
  7. mapperScannerConfigurer.setBasePackage(MAPPER_PACKAGE);
  8. buildProperties(mapperScannerConfigurer);
  9. return mapperScannerConfigurer;
  10. }
  11. @Bean
  12. public MapperScannerConfigurer assertMapperScannerConfigurer() {
  13. MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
  14. mapperScannerConfigurer.setSqlSessionFactoryBeanName("assertSqlSessionFactory");
  15. mapperScannerConfigurer.setBasePackage("com.bonc.fengxing.assertdao");
  16. buildProperties(mapperScannerConfigurer);
  17. return mapperScannerConfigurer;
  18. }
  19. private void buildProperties(MapperScannerConfigurer mapperScannerConfigurer) {
  20. //初始化扫描器的相关配置,这里我们要创建一个Mapper的父类
  21. Properties properties = new Properties();
  22. properties.setProperty("mappers", MAPPER_INTERFACE_REFERENCE);
  23. properties.setProperty("notEmpty", "false");//insert、update是否判断字符串类型!='' 即 test="str != null"表达式内是否追加 and str != ''
  24. properties.setProperty("IDENTITY", "MYSQL");
  25. mapperScannerConfigurer.setProperties(properties);
  26. }
  27. }

3.实际使用

创建一个assertdao跟dao同级,以及xml资源文件。目录结构如下:
image.png
在项目中使用时
image.png
直接引用即可