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. 访问不同数据源的接口按照目录分开,单独存放,如图所示

    image-20210826221544209.png

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

    image-20210826221614376.png

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. 开发对应的接口,调用接口

    image-20210826223822488.png

  2. 调用接口测试效果

    image-20210826224019245.png

提示

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

image-20210826224704504.png

反思和收获

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值