问题:
在实际开发过程中,会遇到调用两个数据库的操作,开发到一半,不能将配置文件大改,要不改变原开发模式的情况下,动态调用另一个数据库。
做法:
设置一个主数据库,在什么也不写的情况下,调用的是主数据库。如果调用另一个数据库,则加上一句说明即可。
1.修改配置文件
#---------------------------------------------------------------------------------
#master 数据源配置
master.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
master.datasource.url=jdbc:mysql://xxx:3306/xxx?useSSL=false&serverTimezone=GMT%2B8
master.datasource.username=xxx
master.datasource.password=xxx
#assert 数据源配置
assert.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
assert.datasource.url=jdbc:mysql://yyy:3306/yyy?useSSL=false&serverTimezone=GMT%2B8
assert.datasource.username=yyy
assert.datasource.password=yyy
2.修改mybatis加载类
修改主数据库的配置类
@Value("${master.datasource.driver-class-name}")
private String driverClassName;
@Value("${master.datasource.url}")
private String url;
@Value("${master.datasource.username}")
private String username;
@Value("${master.datasource.password}")
private String password;
@Bean(name = "masterDataSource")
@Primary
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(this.driverClassName);
dataSource.setUrl(this.url);
dataSource.setUsername(this.username);
dataSource.setPassword(this.password);
return dataSource;
}
//设置主数据库
@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setTypeAliasesPackage(MODEL_PACKAGE);
//配置分页插件,详情请查阅官方文档
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("pageSizeZero", "true");//分页尺寸为0时查询所有纪录不再执行分页
properties.setProperty("reasonable", "true");//页码<=0 查询第一页,页码>=总页数查询最后一页
properties.setProperty("supportMethodsArguments", "true");//支持通过 Mapper 接口参数来传递分页参数
pageHelper.setProperties(properties);
//添加插件
factory.setPlugins(new Interceptor[]{pageHelper});
//添加XML目录
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
factory.setMapperLocations(resolver.getResources("classpath*:mapper/*.xml"));
factory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return factory.getObject();
}
//设置主事务
@Bean(name = "masterTransactionManager")
@Primary
public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
增加另一个数据库的配置类
import javax.sql.DataSource;
@Configuration
public class MyBatisAssertConfigurer {
@Value("${assert.datasource.driver-class-name}")
private String driverClassName;
@Value("${assert.datasource.url}")
private String url;
@Value("${assert.datasource.username}")
private String username;
@Value("${assert.datasource.password}")
private String password;
@Bean(name = "assertDataSource")
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(this.driverClassName);
dataSource.setUrl(this.url);
dataSource.setUsername(this.username);
dataSource.setPassword(this.password);
return dataSource;
}
@Bean(name = "assertSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("assertDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath*:assert/*.xml"));
return bean.getObject();
}
@Bean(name = "assertTransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("assertDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
修改mybatis的动态加载
@Configuration
public class MapperScanConfigurer {
@Bean
public MapperScannerConfigurer primaryMapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setSqlSessionFactoryBeanName("masterSqlSessionFactory");
mapperScannerConfigurer.setBasePackage(MAPPER_PACKAGE);
buildProperties(mapperScannerConfigurer);
return mapperScannerConfigurer;
}
@Bean
public MapperScannerConfigurer assertMapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setSqlSessionFactoryBeanName("assertSqlSessionFactory");
mapperScannerConfigurer.setBasePackage("com.bonc.fengxing.assertdao");
buildProperties(mapperScannerConfigurer);
return mapperScannerConfigurer;
}
private void buildProperties(MapperScannerConfigurer mapperScannerConfigurer) {
//初始化扫描器的相关配置,这里我们要创建一个Mapper的父类
Properties properties = new Properties();
properties.setProperty("mappers", MAPPER_INTERFACE_REFERENCE);
properties.setProperty("notEmpty", "false");//insert、update是否判断字符串类型!='' 即 test="str != null"表达式内是否追加 and str != ''
properties.setProperty("IDENTITY", "MYSQL");
mapperScannerConfigurer.setProperties(properties);
}
}
3.实际使用
创建一个assertdao跟dao同级,以及xml资源文件。目录结构如下:
在项目中使用时
直接引用即可