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

环境:

  • 动态数据源
  • spring-boot 2.7.15
  • mybatis-plus 3.5.2

yaml配置:

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

    @Bean
    public MybatisSqlSessionFactoryBean dynamicDataSourceSqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dynamicDataSource) throws Exception {
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dynamicDataSource);
        return sqlSessionFactoryBean;
    }

解决方式:

    @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修改:

@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 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;
    }
}

你可能感兴趣的:(mybatis-plus,mybatis,dynamic,DataSource,config,SqlSession)