Spring Boot实现多数据源整合Mybatis版

Posted 守夜人爱吃兔子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot实现多数据源整合Mybatis版相关的知识,希望对你有一定的参考价值。

前言

本篇博客只讲如何从零到壹地再Spring Boot项目中实现多数据源配置,不谈源码(后续上Spring Boot自动配置等源码)。

本篇博客内容基于Spring Boot Version 2.5.1

背景

一个项目中需要连接多个数据源,我们需要在 业务 层不同的接口访问不同的数据源,此时我们就需要整合项目适配多数据源,本篇博客由此展开。

实现步骤

1、配置文件中配置多个数据源参数

在datasource之后添加标识对应数据源的字符,如我案例中的action、quotation,下面贴详细代码

Notice: 这里的url 配置项这里必须写 jdbc-url,否则会报参数不合法异常。

 spring:
   datasource:
     # 行情中心
     quotation:
       driver-class-name: com.mysql.cj.jdbc.Driver
       jdbc-url: jdbc:mysql://10.253.49.32:3306/quotation_test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
       username: root
       password: 123456
     # 实战项目对应数据库
     action:
       driver-class-name: com.mysql.cj.jdbc.Driver
       jdbc-url: jdbc:mysql://localhost:3306/stupid_kid_action?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
       username: root
       password: 123456

2、定义访问不同数据源对应的接口和xml文件

  1. 访问不同数据源的接口按照目录分开,单独存放,如图所示

  2. 访问不同数据源的XML文件按照目录分开,单独存放,如图所示

3、创建各个数据源的配置类

  1. 创建一个配置类,引入对应的配置参数创建多个数据源对象,下附完整代码。

    • @Bean(name = "action-datasource"):定义创建的数据源对象名称,后面会用到
    • @ConfigurationProperties(prefix = "spring.datasource.action"):声明配置文件中数据源参数来源
     @Configuration
     public class DataSourceConfig 
         @Bean(name = "action-datasource")
         @ConfigurationProperties(prefix = "spring.datasource.action")
         public DataSource actionDbDataSource() 
             return DataSourceBuilder.create().build();
         
     ​
         @Bean(name = "quotation-datasource")
         @ConfigurationProperties(prefix = "spring.datasource.quotation")
         public DataSource quotaDbDataSource() 
             return DataSourceBuilder.create().build();
         
     
  2. 依据不同的数据源创建对应的SqlSessionFactory对象、SqlSessionTemplate对象,下附完整代码。

    • @Qualifier("action-datasource"):注入对应的数据源
    • @MapperScan(basePackages = "com.tree.action.multidatasource.mapper.action", sqlSessionFactoryRef = "actionSqlSessionFactoryDb"):配置对应访问对应数据源的dao层接口位置和引用actionSqlSessionFactory的方法名
    • getResources("classpath:mapping/action/*.xml")):配置获取资源文件位置
     @Configuration // 此处如果不添加该注解会导致bean之间相互调用出错
     @MapperScan(basePackages = "com.tree.action.multidatasource.mapper.action",
         sqlSessionFactoryRef = "actionSqlSessionFactoryDb")
     public class ActionDbConfig 
         @Autowired
         @Qualifier("action-datasource")
         private DataSource actionDataSourceDb;
     ​
         @Bean
         public SqlSessionFactory actionSqlSessionFactoryDb() throws Exception 
             SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
             factoryBean.setDataSource(actionDataSourceDb);
             factoryBean.setMapperLocations(
                 new PathMatchingResourcePatternResolver().getResources("classpath:mapping/action/*.xml"));
             return factoryBean.getObject();
         
     ​
         @Bean
         public SqlSessionTemplate actionSqlSessionTemplateDb() throws Exception 
             return new SqlSessionTemplate(actionSqlSessionFactoryDb());
         
     
     ​
     ​
     @Configuration // 此处如果不添加该注解会导致bean之间相互调用出错
     @MapperScan(basePackages = "com.tree.action.multidatasource.mapper.quotation",
         sqlSessionFactoryRef = "quotationSqlSessionFactoryDb")
     public class QuotationDbConfig 
     ​
         @Autowired
         @Qualifier("quotation-datasource")
         private DataSource actionDataSourceDb;
     ​
         @Bean
         public SqlSessionFactory quotationSqlSessionFactoryDb() throws Exception 
             SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
             factoryBean.setDataSource(actionDataSourceDb);
             factoryBean.setMapperLocations(
                 new PathMatchingResourcePatternResolver().getResources("classpath:mapping/quotation/*.xml"));
             return factoryBean.getObject();
         
     ​
         @Bean
         public SqlSessionTemplate quotationSqlSessionTemplateDb() throws Exception 
             return new SqlSessionTemplate(quotationSqlSessionFactoryDb());
         
     

4、对应目录下开发测试接口,测试看效果

  1. 开发对应的接口,调用接口

  2. 调用接口测试效果

提示

如果是从单数据源切换过来的,需要把启动类上的注解@MapperScan删除,否则会生成两遍对应的dao层接口bean(可以这么理解一下,多数据源环境下,自己声明了对应的dao层位置,启动类上又配置了自动扫描装配可不就是两遍嘛),这种情况下会报如下警告:

反思和收获

就如同我今天和一个朋友讲的一样,通过整合这个多数据源的触碰到了一个小点,也就是整合多数据源之后要把之前在启动类中配置的默认自动装配注解删除,否则会报重复创建bean的警告

以上是关于Spring Boot实现多数据源整合Mybatis版的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot实现多数据源整合Mybatis版

Spring Boot实现多数据源整合Mybatis版

Spring Boot 整合 Mybatis 实现 Druid 多数据源详解

Spring Boot 整合 MyBatis Plus实现多数据源的两种方式

Spring Boot 整合 MyBatis Plus实现多数据源的两种方式

Spring-boot-route整合JPA操作数据库+多数据源切换