动态数据源自定义SqlSessionFactoryBean时mybatis plus配置失效

环境:

  • 动态数据源
  • 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;
    }
}
相关推荐
码云骑士19 小时前
MyBatis-Plus从入门到实战,Lambda查询+注解配置+SpringBoot整合全解析
mybatis
IronMurphy1 天前
Redis拷打第六讲
redis·spring·mybatis
那个失眠的夜1 天前
SpringBoot
java·开发语言·spring boot·spring·mvc·mybatis
接着奏乐接着舞1 天前
springboot mybatis
spring·tomcat·mybatis
Devin~Y1 天前
大厂Java面试实录:Spring Boot/Cloud、JVM、Redis、Kafka、MyBatis 到 RAG/Agent 的三轮连环问(含答案详解)
java·jvm·spring boot·redis·spring cloud·kafka·mybatis
Mr_pyx2 天前
面试题记录
jvm·数据结构·算法·spring·mybatis
摇滚侠2 天前
Mybatis 面试题 真正的 offer 偏方 Java 基础 Java 高级
java·开发语言·mybatis
Devin~Y2 天前
大厂Java面试实录:Spring Boot/Cloud + Redis + Kafka + JVM + RAG(Spring AI)三轮追问(小Y翻车版)
java·jvm·spring boot·redis·spring cloud·kafka·mybatis
月落归舟2 天前
一篇文章了解Redis内存淘汰机制与过期Key清理
数据库·redis·mybatis
Devin~Y3 天前
大厂Java面试实录:Spring Boot/WebFlux、JVM调优、Redis/Kafka、Spring Cloud 与 RAG/Agent 追问
java·jvm·spring boot·maven·mybatis·jpa·spring webflux