当前位置:   article > 正文

mybatis-plus多数据源配置_mybatisplus多数据源配置

mybatisplus多数据源配置

这里结合了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. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号