• mybatis-plus多数据源配置


    这里结合了springboot的多数据源配置,主要是手动创建数据源,再手动设置配置一些配置参数。

    其中DateSource和transactionManager是关于数据源和事务的配置。SqlSessionTemplate和sqlSessionFactory是mybatis-plus框架的配置,通过@MapperScan注解的属性关联。

    多数据源事务参考多数据源事务(非分布式)_SomeOtherTime的博客-CSDN博客_多数据源事务

    参考源码分析 - MyBatis Plus 多数据源踩坑 - 知乎

    mybatis多数据源的驼峰命名法_mybatis 多个数据源名称驼峰-CSDN博客

    yml: 

    1. ## 部署环境
    2. server:
    3. port: 8210
    4. spring:
    5. datasource:
    6. #不同数据配置名会变,以下是HikariDataSource
    7. one:
    8. driver-class-name: org.postgresql.Driver
    9. jdbc-url: jdbc:postgresql://192.168.2.89:5435/la_water_river
    10. username: postgres
    11. password:
    12. minimum-idle: 10
    13. maximum-pool-size: 5
    14. two:
    15. driver-class-name: com.kingbase8.Driver
    16. jdbc-url: jdbc:kingbase8://172.16.1.28:54321/la_water_monitor?currentSchema=PUBLIC
    17. username: kingbases
    18. password:
    19. minimum-idle: 5
    20. maximum-pool-size: 20
    21. # redis 配置
    22. redis:
    23. host: 192.168.2.76
    24. port: 6379
    25. password:
    26. database: 10
    27. timeout: 10s
    28. cache:
    29. type: redis
    30. redis:
    31. time-to-live: 20000 #缓存超时时间ms
    32. cache-null-values: false #是否缓存空值
    33. management:
    34. endpoints:
    35. web:
    36. base-path: /actuator
    37. exposure:
    38. include: "*"
    39. endpoint:
    40. health:
    41. show-details: always
    42. security:
    43. enabled: false
    44. swagger:
    45. enable: true
    46. logging:
    47. config: classpath:logback-spring-dev.xml
    48. mybatis-plus:
    49. type-handlers-package: com.zjzy.mapper.typehandler
    50. configuration:
    51. map-underscore-to-camel-case: true
    52. auto-mapping-behavior: full
    53. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    54. mapper-locations: classpath*:mapper/**/*Mapper.xml #多数据源下该配置失效,配置在代码中

    数据源1:

    1. package com.wisdomcity.laian.river.config.datasource;
    2. import com.baomidou.mybatisplus.core.config.GlobalConfig;
    3. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    4. import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
    5. import com.wisdomcity.laian.river.config.MybatisPlusConfig;
    6. import com.wisdomcity.laian.river.config.UpdateMetaObjectHandler;
    7. import org.apache.ibatis.session.SqlSessionFactory;
    8. import org.apache.ibatis.type.TypeHandler;
    9. import org.mybatis.spring.SqlSessionTemplate;
    10. import org.mybatis.spring.annotation.MapperScan;
    11. import org.springframework.beans.factory.annotation.Autowired;
    12. import org.springframework.beans.factory.annotation.Qualifier;
    13. import org.springframework.boot.context.properties.ConfigurationProperties;
    14. import org.springframework.boot.jdbc.DataSourceBuilder;
    15. import org.springframework.context.annotation.Bean;
    16. import org.springframework.context.annotation.Configuration;
    17. import org.springframework.context.annotation.Primary;
    18. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    19. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    20. import javax.sql.DataSource;
    21. @Configuration
    22. @MapperScan(basePackages = "com.wisdomcity.laian.river.mapper.water",sqlSessionFactoryRef = "sqlSessionFactoryOne",sqlSessionTemplateRef = "sqlSessionTemplateOne")
    23. public class DatasourceConfigOne {
    24. //
    25. // @Autowired
    26. // @Qualifier("globalConfig")
    27. // private GlobalConfig globalConfig;
    28. @Autowired
    29. MybatisPlusInterceptor mybatisPlusInterceptor;
    30. @Bean(name = "dataSourceOne")
    31. @ConfigurationProperties(prefix = "spring.datasource.one")
    32. @Primary
    33. public DataSource dataSource() {
    34. return DataSourceBuilder.create().build();
    35. }
    36. @Primary
    37. @Bean(name = "sqlSessionFactoryOne")
    38. public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSourceOne") DataSource dataSource) throws Exception {
    39. //SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    40. MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
    41. bean.setDataSource(dataSource);
    42. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/water/*.xml"));
    43. // bean.setGlobalConfig(globalConfig);
    44. bean.setGlobalConfig(globalConfig());
    45. bean.setPlugins(mybatisPlusInterceptor);
    46. //https://blog.csdn.net/weixin_41785851/article/details/119739897
    47. MybatisConfiguration configuration = new MybatisConfiguration();
    48. configuration.setMapUnderscoreToCamelCase(true);
    49. // 配置打印sql语句
    50. configuration.setLogImpl(StdOutImpl.class);
    51. bean.setConfiguration(configuration);
    52. return bean.getObject();
    53. }
    54. @Primary
    55. @Bean(name = "transactionManagerOne")
    56. public DataSourceTransactionManager transactionManager(@Qualifier("dataSourceOne") DataSource dataSource) {
    57. return new DataSourceTransactionManager(dataSource);
    58. }
    59. @Primary
    60. @Bean(name = "sqlSessionTemplateOne")
    61. public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactoryOne") SqlSessionFactory sqlSessionFactory) {
    62. return new SqlSessionTemplate(sqlSessionFactory);
    63. }
    64. // /** 全局自定义配置 */
    65. // @Bean(name = "globalConfigMP")
    66. // @ConfigurationProperties(prefix = "mybatis-plus")
    67. // public GlobalConfig globalConfig(){
    68. // return new GlobalConfig();
    69. // }
    70. /**
    71. * 自动插入创建和更新时间
    72. * 多数据源下要创建多个,或者不创建,不然saveBatch等批量操作方法会报错,因为save方法是获取baseMapper,而批量操作的saveBatch方法是从全局配置 GlobalConfig 里获取的。
    73. */
    74. @Bean("waterGlobalConfig")
    75. public GlobalConfig globalConfig() {
    76. GlobalConfig globalConfig = new GlobalConfig();
    77. globalConfig.setMetaObjectHandler(new UpdateMetaObjectHandler());
    78. return globalConfig;
    79. }
    80. }

    数据源2:

    1. package com.wisdomcity.laian.river.config.datasource;
    2. import com.baomidou.mybatisplus.core.config.GlobalConfig;
    3. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    4. import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
    5. import com.wisdomcity.laian.river.config.UpdateMetaObjectHandler;
    6. import org.apache.ibatis.session.SqlSessionFactory;
    7. import org.mybatis.spring.SqlSessionTemplate;
    8. import org.mybatis.spring.annotation.MapperScan;
    9. import org.springframework.beans.factory.annotation.Autowired;
    10. import org.springframework.beans.factory.annotation.Qualifier;
    11. import org.springframework.boot.context.properties.ConfigurationProperties;
    12. import org.springframework.boot.jdbc.DataSourceBuilder;
    13. import org.springframework.context.annotation.Bean;
    14. import org.springframework.context.annotation.Configuration;
    15. import org.springframework.context.annotation.Primary;
    16. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    17. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    18. import javax.sql.DataSource;
    19. @Configuration
    20. @MapperScan(basePackages = "com.wisdomcity.laian.river.mapper.monitor",sqlSessionFactoryRef = "sqlSessionFactoryTwo",sqlSessionTemplateRef = "sqlSessionTemplateTwo")
    21. public class DatasourceConfigTwo {
    22. // @Autowired
    23. // @Qualifier("globalConfig")
    24. // private GlobalConfig globalConfig;
    25. @Autowired
    26. MybatisPlusInterceptor mybatisPlusInterceptor;
    27. @Bean(name = "dataSourceTwo")
    28. @ConfigurationProperties(prefix = "spring.datasource.two")
    29. public DataSource dataSource() {
    30. return DataSourceBuilder.create().build();
    31. }
    32. @Bean(name = "sqlSessionFactoryTwo")
    33. public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSourceTwo") DataSource dataSource) throws Exception {
    34. //SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    35. MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
    36. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/monitor/*.xml"));
    37. // bean.setGlobalConfig(globalConfig);
    38. bean.setGlobalConfig(globalConfig());
    39. bean.setPlugins(mybatisPlusInterceptor);
    40. bean.setDataSource(dataSource);
    41. //https://blog.csdn.net/weixin_41785851/article/details/119739897
    42. MybatisConfiguration configuration = new MybatisConfiguration();
    43. configuration.setMapUnderscoreToCamelCase(true);
    44. // 配置打印sql语句
    45. configuration.setLogImpl(StdOutImpl.class);
    46. bean.setConfiguration(configuration);
    47. return bean.getObject();
    48. }
    49. @Bean(name = "transactionManagerTwo")
    50. public DataSourceTransactionManager transactionManager(@Qualifier("dataSourceTwo") DataSource dataSource) {
    51. return new DataSourceTransactionManager(dataSource);
    52. }
    53. @Bean(name = "sqlSessionTemplateTwo")
    54. public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactoryTwo") SqlSessionFactory sqlSessionFactory) {
    55. return new SqlSessionTemplate(sqlSessionFactory);
    56. }
    57. /**
    58. * 自动插入创建和更新时间
    59. * 多数据源下要创建多个,或者不创建,不然saveBatch等批量操作方法会报错,因为save方法是获取baseMapper,而批量操作的saveBatch方法是从全局配置 GlobalConfig 里获取的。
    60. */
    61. @Bean("monitorGlobalConfig")
    62. public GlobalConfig globalConfig() {
    63. GlobalConfig globalConfig = new GlobalConfig();
    64. globalConfig.setMetaObjectHandler(new UpdateMetaObjectHandler());
    65. return globalConfig;
    66. }
    67. }

    分页配置

    1. package com.wisdomcity.laian.river.config;
    2. import com.baomidou.mybatisplus.annotation.DbType;
    3. import com.baomidou.mybatisplus.core.config.GlobalConfig;
    4. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    5. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
    6. import org.springframework.context.annotation.Bean;
    7. import org.springframework.context.annotation.Configuration;
    8. /**
    9. * MybatisPlus分页配置
    10. */
    11. @Configuration
    12. public class MybatisPlusConfig {
    13. /**
    14. * 分页插件
    15. */
    16. @Bean
    17. public MybatisPlusInterceptor mybatisPlusInterceptor() {
    18. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    19. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
    20. return interceptor;
    21. }
    22. }

    jpa配置思路类似

    1. @Configuration
    2. @EntityScan(basePackages = "com.zjzy.po.sqlserver")
    3. //1、实体扫描
    4. //2、实体管理ref
    5. //3、事务管理
    6. @EnableJpaRepositories(
    7. basePackages = "com.zjzy.repository.sqlserver",
    8. entityManagerFactoryRef = "secondaryEntityManagerFactoryBean",
    9. transactionManagerRef = "secondaryTransactionManager")
    10. @EnableTransactionManagement
    11. public class SqlDataSourceConfig {
    12. /**
    13. * sqlserver第二个数据源,可以不加Qualifier
    14. */
    15. @Autowired
    16. @Qualifier("sqlDataSource")
    17. private DataSource dataSource;
    18. /**
    19. * jpa其他参数配置
    20. */
    21. @Autowired
    22. private JpaProperties jpaProperties;
    23. /**
    24. * 实体管理工厂builder
    25. */
    26. @Autowired
    27. private EntityManagerFactoryBuilder factoryBuilder;
    28. /**
    29. * 配置第二个实体管理工厂的bean
    30. * @return
    31. */
    32. @Bean(name = "secondaryEntityManagerFactoryBean")
    33. public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
    34. return factoryBuilder.dataSource(dataSource)
    35. //这一行的目的是加入jpa的其他配置参数比如(ddl-auto: update等)
    36. //当然这个参数配置可以在事务配置的时候也可以
    37. // .properties(jpaProperties.getHibernateProperties(new HibernateSettings()))
    38. .packages("com.zjzy.po.sqlserver")
    39. .persistenceUnit("secondaryPersistenceUnit")
    40. .build();
    41. }
    42. /**
    43. * EntityManager不过解释,用过jpa的应该都了解
    44. * @return
    45. */
    46. @Bean(name = "secondaryEntityManager")
    47. public EntityManager entityManager() {
    48. return entityManagerFactoryBean().getObject().createEntityManager();
    49. }
    50. /**
    51. * jpa事务管理
    52. * @return
    53. */
    54. @Bean(name = "secondaryTransactionManager")
    55. public JpaTransactionManager transactionManager() {
    56. JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
    57. jpaTransactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());
    58. return jpaTransactionManager;
    59. }
    60. }
    dynamicDataSource的配置方法
    1. @Configuration
    2. //@MapperScan(basePackages = "com.zjzy.emergencyservice.dao")
    3. @MapperScan(basePackages = "com.zjzy.emergencyservice.dao",sqlSessionFactoryRef = "sqlSessionFactoryZero",sqlSessionTemplateRef = "sqlSessionTemplateZero")
    4. public class DataSourceConfig {
    5. //
    6. @Bean(name = "sqlSessionFactoryZero")
    7. public SqlSessionFactory sqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dataSource) throws Exception {
    8. //SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    9. // SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    10. SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
    11. sessionFactoryBean.setDataSource(dataSource);
    12. //mybatis多数据源添加驼峰命名https://blog.csdn.net/qq_37752382/article/details/120769453
    13. org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
    14. configuration.setMapUnderscoreToCamelCase(true);
    15. sessionFactoryBean.setConfiguration(configuration);
    16. String locationPattern = "classpath*:/mapper/*.xml";
    17. PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    18. sessionFactoryBean.setMapperLocations(resolver.getResources(locationPattern));
    19. return sessionFactoryBean.getObject();
    20. }
    21. @Bean(name = "transactionManagerZero")
    22. public DataSourceTransactionManager transactionManager(@Qualifier("dynamicDataSource") DataSource dataSource) {
    23. return new DataSourceTransactionManager(dataSource);
    24. }
    25. @Bean(name = "sqlSessionTemplateZero")
    26. public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactoryZero") SqlSessionFactory sqlSessionFactory) {
    27. return new SqlSessionTemplate(sqlSessionFactory);
    28. }
    29. @Bean("dataSource1")
    30. @ConfigurationProperties(prefix = "spring.datasource.db1")
    31. public DataSource dataSource1(){
    32. return DataSourceBuilder.create().build();
    33. }
    34. @Bean("dataSource2")
    35. @ConfigurationProperties(prefix = "spring.datasource.db2")
    36. public DataSource dataSource2(){
    37. return DataSourceBuilder.create().build();
    38. }
    39. @Bean("dataSource3")
    40. @ConfigurationProperties(prefix = "spring.datasource.db3")
    41. public DataSource dataSource3(){
    42. return DataSourceBuilder.create().build();
    43. }
    44. @Bean("dataSource4")
    45. @ConfigurationProperties(prefix = "spring.datasource.db4")
    46. public DataSource dataSource4(){
    47. return DataSourceBuilder.create().build();
    48. }
    49. /**
    50. * 动态数据源: 通过AOP在不同数据源之间动态切换
    51. * @return
    52. */
    53. // @Primary
    54. @Bean(name = "dynamicDataSource")
    55. @Primary
    56. public DataSource dynamicDataSource() {
    57. DynamicDataSource dynamicDataSource = new DynamicDataSource();
    58. // 默认数据源
    59. dynamicDataSource.setDefaultTargetDataSource(dataSource1());
    60. // 配置多数据源
    61. Map<Object, Object> dsMap = new HashMap();
    62. dsMap.put(DataSourceEnum.MASTER_DATA_SOURCE_NAME.getDataSource(), dataSource1());
    63. dsMap.put(DataSourceEnum.CLUSTER_DATA_SOURCE_NAME.getDataSource(), dataSource2());
    64. dsMap.put(DataSourceEnum.POSTGRES_DATA_SOURCE_NAME.getDataSource(), dataSource3());
    65. dsMap.put(DataSourceEnum.MYSQL_DATA_SOURCE_NAME.getDataSource(), dataSource4());
    66. dynamicDataSource.setTargetDataSources(dsMap);
    67. return dynamicDataSource;
    68. }
    69. /**
    70. * 配置@Transactional注解事物
    71. * @return
    72. */
    73. @Bean
    74. public PlatformTransactionManager transactionManager() {
    75. return new DataSourceTransactionManager(dynamicDataSource());
    76. }
    77. }

  • 相关阅读:
    【计算机网络笔记】网络层服务模型——数据报网络
    驱动开发:内核枚举ShadowSSDT基址
    【电源专题】LDO的电源抑制比(PSRR)
    【漏洞复现】OneThink前台注入漏洞
    windows部署java环境
    查询三级数据结构sql语句
    华为机试真题 C++ 实现【火星文计算】
    打开 Chrome 的 「内存节省程序」开关和关闭硬件加速
    2022-08-20-网易笔试题
    springboot集成kafka详解
  • 原文地址:https://blog.csdn.net/yaoct/article/details/128145307