环境:
- 动态数据源
- spring-boot 2.7.15
- mybatis-plus 3.5.2
yaml配置:
XML
spring:
datasource:
db100:
username: xxx
password: xxx
jdbc-url: jdbc:kingbase8://xxx.xxx.xxx.xxx:54321/100
driver-class-name: com.kingbase8.Driver
# url: jdbc:postgresql://xxx.xxx.xxx.xxx:54321/100?serverTimezone=Asia/Shanghai&useSSL=false
# driverClassName: org.postgresql.Driver
db101:
username: xxx
password: xxx
jdbc-url: jdbc:kingbase8://xxx.xxx.xxx.xxx:54321/101
driver-class-name: com.kingbase8.Driver
db104:
username: xxx
password: xxx
jdbc-url: jdbc:kingbase8://xxx.xxx.xxx.xxx:54321/104
driver-class-name: com.kingbase8.Driver
mybatis-plus:
mapper-locations: classpath*:**mapper/*.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
实际运行的时候,发现mybatis-plus相关的配置都失效了。
这是因为我们自定义SqlSessionFactoryBean
java
@Bean
public MybatisSqlSessionFactoryBean dynamicDataSourceSqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dynamicDataSource) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dynamicDataSource);
return sqlSessionFactoryBean;
}
解决方式:
java
@Bean
@Scope("prototype")
@ConfigurationProperties(prefix = "mybatis-plus.global-config")
public GlobalConfig globalConfig(){
return new GlobalConfig();
}
@Bean
//@Scope("prototype")
@ConfigurationProperties(prefix = "mybatis-plus.configuration")
public MybatisConfiguration mybatisConfiguration(){
return new MybatisConfiguration();
}
SqlSessionFactoryBean修改:
java
@MapperScan(basePackages = "com.etoak.wsdhla.mapper", sqlSessionFactoryRef = "dynamicDataSourceSqlSessionFactory")
@Configuration
public class DataSourceConfig {
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource.db100")
public DataSource dataSource100() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.db101")
public DataSource dataSource101() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.db104")
public DataSource dataSource104() {
return DataSourceBuilder.create().build();
}
@Bean
@Scope("prototype")
@ConfigurationProperties(prefix = "mybatis-plus.global-config")
public GlobalConfig globalConfig(){
return new GlobalConfig();
}
@Bean
//@Scope("prototype")
@ConfigurationProperties(prefix = "mybatis-plus.configuration")
public MybatisConfiguration mybatisConfiguration(){
return new MybatisConfiguration();
}
/**
* 将动态代理数据源对象放入Spring容器中
*/
@Bean
public DynamicDataSource dynamicDataSource(@Qualifier("dataSource100") DataSource dataSource100, @Qualifier("dataSource101") DataSource dataSource101, @Qualifier("dataSource104") DataSource dataSource104) {
// 这个地方是比较核心的targetDataSource 集合是我们数据库和名字之间的映射
Map<Object, Object> targetDataSource = new HashMap<>();
targetDataSource.put("db100", dataSource100);
targetDataSource.put("db101", dataSource101);
targetDataSource.put("db104", dataSource104);
DynamicDataSource dataSource = new DynamicDataSource();
// 设置所有的数据源
dataSource.setTargetDataSources(targetDataSource);
// 设置默认使用的数据源对象
dataSource.setDefaultTargetDataSource(dataSource100);
return dataSource;
}
@Bean
public MybatisSqlSessionFactoryBean dynamicDataSourceSqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dynamicDataSource) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dynamicDataSource);
// 设置数据库mapper的xml文件路径
sqlSessionFactoryBean .setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));
sqlSessionFactoryBean.setConfiguration(mybatisConfiguration());
sqlSessionFactoryBean.setGlobalConfig(globalConfig());
return sqlSessionFactoryBean;
}
}