问题:
在实际开发过程中,会遇到调用两个数据库的操作,开发到一半,不能将配置文件大改,要不改变原开发模式的情况下,动态调用另一个数据库。
做法:
设置一个主数据库,在什么也不写的情况下,调用的是主数据库。如果调用另一个数据库,则加上一句说明即可。
1.修改配置文件
#---------------------------------------------------------------------------------#master 数据源配置master.datasource.driver-class-name=com.mysql.cj.jdbc.Drivermaster.datasource.url=jdbc:mysql://xxx:3306/xxx?useSSL=false&serverTimezone=GMT%2B8master.datasource.username=xxxmaster.datasource.password=xxx#assert 数据源配置assert.datasource.driver-class-name=com.mysql.cj.jdbc.Driverassert.datasource.url=jdbc:mysql://yyy:3306/yyy?useSSL=false&serverTimezone=GMT%2B8assert.datasource.username=yyyassert.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")@Primarypublic 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")@Primarypublic 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")@Primarypublic DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
增加另一个数据库的配置类
import javax.sql.DataSource;@Configurationpublic 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的动态加载
@Configurationpublic class MapperScanConfigurer {@Beanpublic MapperScannerConfigurer primaryMapperScannerConfigurer() {MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();mapperScannerConfigurer.setSqlSessionFactoryBeanName("masterSqlSessionFactory");mapperScannerConfigurer.setBasePackage(MAPPER_PACKAGE);buildProperties(mapperScannerConfigurer);return mapperScannerConfigurer;}@Beanpublic 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资源文件。目录结构如下:
在项目中使用时
直接引用即可
