springboot+MybatisPlus在配置多数据源时需要注意首先屏蔽springboot的自动配置,默认情况下会把扫描spring.datasource下的数据源配置,如果不配置会报错。屏蔽自动配置方式:
spring:
autoconfigure:
exclude: #也可以用‘,’分隔
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration #数据源的自动配置
- org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration #事务的自动配置
- com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure #druid连接池的自动化配置
- com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration #mybatisPlus的自动配置
动态指定数据源时需要添加依赖:
- dynamic-datasource-spring-boot-starter # 版本与mybatis-plus的版本对应
- seate-all # 可能还需要这个包,dynamic-datasource-spring-boot-starter内部依赖了它
配置
spring:
datasource:
dynamic:
primary: bizdb # 配置默认数据库
datasource:
bizdb: # 业务库
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@10.8.101.50:1521:orcl
username: HT
password: Admin123
masterdb: # 主数据库
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@10.169.12.170:1521:orcl
username: JT_HT_MDM
password: HTMDM$SDP
因为之前已经把默认的的数据源配置给pass掉了,所以这里需要自行手动加载配置数据源。多个数据源需要指定一个主数据源作为在没有指定数据源时的默认数据源,直接注解@Primary给安排上,在这里需要指定这个配置的包扫描配置。
数据源一:
@Configuration
@MapperScan(basePackages = "com.dhcc.contract.push.biz.*.mapper",sqlSessionFactoryRef = "bizSqlSessionFactory")
public class BizDataSourceConfig {
@Bean(name = "bizDataSourceProperties")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.bizdb")
public DataSourceProperties bizDataSourceProperties() {
return new DataSourceProperties();
}
@Bean(name = "bizDataSource")
@Primary
public DataSource bizDataSource(@Qualifier("bizDataSourceProperties")DataSourceProperties bizDataSourceProperties ) {
return bizDataSourceProperties.initializeDataSourceBuilder().build();
}
@Bean(name = "bizSqlSessionFactory")
@Primary
public SqlSessionFactory bizSqlSessionFactory(@Qualifier("bizDataSource") DataSource bizDataSource)
throws Exception {
MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
sessionFactoryBean.setDataSource(bizDataSource);
sessionFactoryBean.setTypeAliasesPackage("com.dhcc.contract.push.biz.entity");
return sessionFactoryBean.getObject();
}
@Primary
@Bean(name = "bizTransactionManager")
public DataSourceTransactionManager bizTransactionManager(@Qualifier("bizDataSource") DataSource bizDataSource) {
return new DataSourceTransactionManager(bizDataSource);
}
@Primary
@Bean(name = "bizSqlSessionTemplate")
public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("bizSqlSessionFactory") SqlSessionFactory bizSqlSessionFactory){
return new SqlSessionTemplate(bizSqlSessionFactory);
}
}
数据源二:
@Configuration
@MapperScan(basePackages = "com.dhcc.contract.push.master.*.mapper",sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {
@Bean(name = "masterDataSourceProperties")
@ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.masterdb")
public DataSourceProperties masterDataSourceProperties() {
return new DataSourceProperties();
}
@Bean(name = "masterDataSource")
public DataSource bizDataSource(@Qualifier("masterDataSourceProperties") DataSourceProperties masterDataSourceProperties) {
return masterDataSourceProperties.initializeDataSourceBuilder().build();
}
@Bean(name = "masterSqlSessionFactory")
public SqlSessionFactory masterSqlSessionFactory(@Autowired @Qualifier("masterDataSource") DataSource masterDataSource)
throws Exception {
MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
sessionFactoryBean.setDataSource(masterDataSource);
sessionFactoryBean.setTypeAliasesPackage("com.dhcc.contract.push.master.entity");
return sessionFactoryBean.getObject();
}
@Bean(name = "masterTransactionManager")
public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource masterSqlSessionFactory) {
return new DataSourceTransactionManager(masterSqlSessionFactory);
}
@Bean(name = "masterSqlSessionTemplate")
public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
至此多数据源已配置完毕。另外,在本地调试的时候一般需要在console中将日志(例如:SQL)打印出来,在多数据源的情况下,就需要添加如下配置来对不同的数据源进行日志级别的控制
logging:
level:
com:
dhcc:
contract:
push:
master:
mapper: debug
biz:
mapper: debug
com.dhcc.contract.push.master.mapper 和 com.dhcc.contract.push.biz.mapper 为我的mapper路径。