最近项目需要接入多数据源,进行以下改造。项目已上线,请放心食用!
下一篇:SpringBoot项目配置多数据源-Transcational事务篇-CSDN博客
开发流程步骤
1、存在原有的mybatis-plus配置,需要剔除
2、引入相关依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2、Spring配置文件编写多数据源配置
spring:
datasource:
db01:
jdbc-url: xxx
username: xxx
password: xxx
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
maximum-pool-size: 50
minimum-idle: 20
connection-timeout: 60000
idle-timeout: 600000
max-lifetime: 640000
connection-test-query: SELECT 1 from dual
db02:
jdbc-url: xxx
username: xxx
password: xxx
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
maximum-pool-size: 50
minimum-idle: 20
connection-timeout: 60000
idle-timeout: 600000
max-lifetime: 640000
connection-test-query: SELECT 1 from dual
3、新增注册类,区分多数据源
插件配置,比如分页插件,如果项目没用到可不配置
@Configuration
public class MybatisPlusConfig
{
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor()
{
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
paginationInnerInterceptor.setDbType(DbType.MYSQL);
paginationInnerInterceptor.setOverflow(true);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}
数据源1
@Configuration
@MapperScan(basePackages = "com.example.xxx.xxx01.mapper", sqlSessionFactoryRef = "db01SqlSessionFactory")
public class DataSourceConfigDB01 {
@Resource
MybatisPlusInterceptor mybatisPlusInterceptor;
@Primary
@Bean("db01DataSource")
@ConfigurationProperties(prefix = "spring.datasource.db01")
public DataSource getDB01DataSource(){
//使用默认的Hikari连接池时,用默认的DataSourceBuilder:
return DataSourceBuilder.create().build();
}
@Primary
@Bean("db01SqlSessionFactory")
public SqlSessionFactory db01SqlSessionFactory(@Qualifier("db01DataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
MybatisConfiguration configuration = new MybatisConfiguration();
// 枚举类型与数据库值的转换,比如在code属性上加@EnumValue
configuration.setDefaultEnumTypeHandler(MybatisEnumTypeHandler.class);
// 扫描的mapper.xml配置,多数据源需要区分开
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db01/*.xml"));
bean.setConfiguration(configuration);
// 配置插件拦截器(比如PaginationInnerInterceptor,缺失配置,插件将会不生效并且会引发其他问题)
bean.setPlugins(mybatisPlusInterceptor);
return bean.getObject();
}
@Primary
@Bean("db01SqlSessionTemplate")
public SqlSessionTemplate db01SqlSessionTemplate(@Qualifier("db01SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
数据源2
@Configuration
@MapperScan(basePackages = "com.example.xxx.xxx02.mapper", sqlSessionFactoryRef = "db02SqlSessionFactory")
public class DataSourceConfigDB02 {
@Resource
MybatisPlusInterceptor mybatisPlusInterceptor;
@Bean("db02DataSource")
@ConfigurationProperties(prefix = "spring.datasource.db02")
public DataSource getDB02DataSource(){
//使用默认的Hikari连接池时,用默认的DataSourceBuilder:
return DataSourceBuilder.create().build();
}
@Bean("db02SqlSessionFactory")
public SqlSessionFactory db02SqlSessionFactory(@Qualifier("db02DataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setDefaultEnumTypeHandler(MybatisEnumTypeHandler.class);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db02/*.xml"));
bean.setConfiguration(configuration);
bean.setPlugins(mybatisPlusInterceptor);
return bean.getObject();
}
@Bean("db02SqlSessionTemplate")
public SqlSessionTemplate db02SqlSessionTemplate(@Qualifier("db02SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
注意
dao、mapper、mapper.xml 需要关联起来,每个数据各一套,别混用。
总结
添加配置类
使用@MapperScan扫描Mapper接口
配置DataSource,使用Hikari连接池(市面上还有 C3P0等)
把DataSource注入SqlSessionFactory。SqlSessionFactory作用大,功能强劲,事务|插件(分页等)|枚举类型与数据库值的转换
把SqlSessionFactory注入SqlSessionTemplate模板
第二个也是这样配置,用命名区分即可