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


    环境:

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

    yaml配置:

    1. spring:
    2. datasource:
    3. db100:
    4. username: xxx
    5. password: xxx
    6. jdbc-url: jdbc:kingbase8://xxx.xxx.xxx.xxx:54321/100
    7. driver-class-name: com.kingbase8.Driver
    8. # url: jdbc:postgresql://xxx.xxx.xxx.xxx:54321/100?serverTimezone=Asia/Shanghai&useSSL=false
    9. # driverClassName: org.postgresql.Driver
    10. db101:
    11. username: xxx
    12. password: xxx
    13. jdbc-url: jdbc:kingbase8://xxx.xxx.xxx.xxx:54321/101
    14. driver-class-name: com.kingbase8.Driver
    15. db104:
    16. username: xxx
    17. password: xxx
    18. jdbc-url: jdbc:kingbase8://xxx.xxx.xxx.xxx:54321/104
    19. driver-class-name: com.kingbase8.Driver
    20. mybatis-plus:
    21. mapper-locations: classpath*:**mapper/*.xml
    22. configuration:
    23. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

    实际运行的时候,发现mybatis-plus相关的配置都失效了。

    这是因为我们自定义SqlSessionFactoryBean

    1. @Bean
    2. public MybatisSqlSessionFactoryBean dynamicDataSourceSqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dynamicDataSource) throws Exception {
    3. MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
    4. sqlSessionFactoryBean.setDataSource(dynamicDataSource);
    5. return sqlSessionFactoryBean;
    6. }

    解决方式:

    1. @Bean
    2. @Scope("prototype")
    3. @ConfigurationProperties(prefix = "mybatis-plus.global-config")
    4. public GlobalConfig globalConfig(){
    5. return new GlobalConfig();
    6. }
    7. @Bean
    8. //@Scope("prototype")
    9. @ConfigurationProperties(prefix = "mybatis-plus.configuration")
    10. public MybatisConfiguration mybatisConfiguration(){
    11. return new MybatisConfiguration();
    12. }

    SqlSessionFactoryBean修改:

    1. @MapperScan(basePackages = "com.etoak.wsdhla.mapper", sqlSessionFactoryRef = "dynamicDataSourceSqlSessionFactory")
    2. @Configuration
    3. public class DataSourceConfig {
    4. @Bean
    5. @Primary
    6. @ConfigurationProperties(prefix = "spring.datasource.db100")
    7. public DataSource dataSource100() {
    8. return DataSourceBuilder.create().build();
    9. }
    10. @Bean
    11. @ConfigurationProperties(prefix = "spring.datasource.db101")
    12. public DataSource dataSource101() {
    13. return DataSourceBuilder.create().build();
    14. }
    15. @Bean
    16. @ConfigurationProperties(prefix = "spring.datasource.db104")
    17. public DataSource dataSource104() {
    18. return DataSourceBuilder.create().build();
    19. }
    20. @Bean
    21. @Scope("prototype")
    22. @ConfigurationProperties(prefix = "mybatis-plus.global-config")
    23. public GlobalConfig globalConfig(){
    24. return new GlobalConfig();
    25. }
    26. @Bean
    27. //@Scope("prototype")
    28. @ConfigurationProperties(prefix = "mybatis-plus.configuration")
    29. public MybatisConfiguration mybatisConfiguration(){
    30. return new MybatisConfiguration();
    31. }
    32. /**
    33. * 将动态代理数据源对象放入Spring容器中
    34. */
    35. @Bean
    36. public DynamicDataSource dynamicDataSource(@Qualifier("dataSource100") DataSource dataSource100, @Qualifier("dataSource101") DataSource dataSource101, @Qualifier("dataSource104") DataSource dataSource104) {
    37. // 这个地方是比较核心的targetDataSource 集合是我们数据库和名字之间的映射
    38. Map targetDataSource = new HashMap<>();
    39. targetDataSource.put("db100", dataSource100);
    40. targetDataSource.put("db101", dataSource101);
    41. targetDataSource.put("db104", dataSource104);
    42. DynamicDataSource dataSource = new DynamicDataSource();
    43. // 设置所有的数据源
    44. dataSource.setTargetDataSources(targetDataSource);
    45. // 设置默认使用的数据源对象
    46. dataSource.setDefaultTargetDataSource(dataSource100);
    47. return dataSource;
    48. }
    49. @Bean
    50. public MybatisSqlSessionFactoryBean dynamicDataSourceSqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dynamicDataSource) throws Exception {
    51. MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
    52. sqlSessionFactoryBean.setDataSource(dynamicDataSource);
    53. // 设置数据库mapper的xml文件路径
    54. sqlSessionFactoryBean .setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));
    55. sqlSessionFactoryBean.setConfiguration(mybatisConfiguration());
    56. sqlSessionFactoryBean.setGlobalConfig(globalConfig());
    57. return sqlSessionFactoryBean;
    58. }
    59. }

  • 相关阅读:
    C Primer Plus(6) 中文版 第3章 数据和C 3.4 C语言基本数据类型
    OpenCV DNN 活体检测项目环境配置等各阶段tips
    C语言实验七 二维数组程序设计
    软件测试/测试开发/人工智能丨 利用ChatGPT编写测试用例
    杰理AC632定时任务接口sys_timer_add和usr_timer_add区别详述
    Day46-50:统计图表项目总结
    Python干货|time模块和datetime模块打印时间的特殊用法
    鼓楼夜市管理wpf+sqlserver
    QGroundControl源码编译的三种方法
    把a文件里面的内容全部给b文件里面去
  • 原文地址:https://blog.csdn.net/wsdhla/article/details/133880358