玩转 MyBatis-Plus 多数据源配置,Spring Boot 项目快速实现多库操作

玩转 MyBatis-Plus 多数据源配置,Spring Boot 项目快速实现多库操作

Luca Ju
2026-01-13 / 0 评论 / 3 阅读 / 正在检测是否收录...

在实际开发中,我们经常会遇到一个 Spring Boot 项目需要操作多个数据库的场景,比如从 Oracle 拉取数据同步到 MySQL。如果手动管理多个数据源的连接和切换,不仅开发效率低,还容易出现数据源混淆的问题。

而 MyBatis-Plus 提供的 dynamic-datasource-spring-boot-starter 依赖,能够帮助我们快速实现多数据源的配置和动态切换,极大简化多库操作的开发流程。本文就来详细讲解 Spring Boot 整合 MyBatis-Plus 多数据源的具体实现步骤。

一、核心依赖引入

首先,我们需要在项目的 pom.xml 文件中引入 MyBatis-Plus 多数据源的核心依赖。这里以 3.1.0 版本为例(可根据项目实际情况选择兼容版本):

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>4.2.0</version>
</dependency>
注意:如果项目中已经引入了 MyBatis-Plus 的核心依赖,无需重复引入,该 starter 已包含相关依赖。

二、多数据源配置(application.yml)

接下来,在 Spring Boot 的核心配置文件 application.yml 中配置多个数据源的连接信息。本文以 1 个 MySQL 数据源 + 2 个 Oracle 数据源为例,配置如下:

spring:
  datasource:
    dynamic:
      # 设置默认的数据源,默认数据源的 key 需与下方 datasource 中的配置一致
      primary: mysql-ocr
      # 严格模式:默认 true,未匹配到指定数据源时抛异常,false 则使用默认数据源
      strict: true
      # 配置多个数据源,key 自定义(建议与业务相关,便于区分)
      datasource:
        # MySQL 数据源:ocr 业务库
        mysql-ocr:
          url: jdbc:mysql://ip:port/ocr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
          username: username
          password: password
          driver-class-name: com.mysql.cj.jdbc.Driver
        # Oracle 数据源1:orcl 业务库
        oracle-orcl:
          url: jdbc:oracle:thin:@ip:port:helowin
          username: username
          password: password
          driver-class-name: oracle.jdbc.OracleDriver
        # Oracle 数据源2:cbxx 业务库
        oracle-cbxx:
          url: jdbc:oracle:thin:@ip:port:helowin
          username: username
          password: password
          driver-class-name: oracle.jdbc.OracleDriver

配置参数说明

参数作用
primary指定默认数据源,当不指定数据源时,默认使用该配置的数据源
strict严格模式开关,开启后若调用不存在的数据源会抛出异常,关闭则默认使用主数据源
datasource多数据源的具体配置节点,每个子节点对应一个数据源,key 为自定义的数据源名称

三、Mapper 层目录结构与数据源注解配置

为了更清晰地管理不同数据源对应的 Mapper 接口,我们可以按照数据源划分包结构,同时通过 @DS 注解指定 Mapper 对应的数据源。

1. Mapper 层目录结构

推荐按照数据源名称创建独立的包,将不同数据源的 Mapper 接口分类存放,便于后期维护:

src/main/java/com/xxx/mapper
├── cbxx                  // oracle-cbxx 数据源对应的 Mapper 包
│   └── VOcrCbxxMapper.java
├── ocr                   // mysql-ocr 数据源对应的 Mapper 包
│   └── OcrCmMapper.java
└── orcl                  // oracle-orcl 数据源对应的 Mapper 包
    └── VOcrMeterMapper.java

2. @DS 注解指定数据源

@DS 注解是 MyBatis-Plus 多数据源的核心注解,用于指定当前 Mapper 接口或方法对应的数据源,支持类级别和方法级别,遵循就近原则(方法上的注解优先级高于类上的注解)。

在 Mapper 接口上添加 @DS 注解,指定该接口下所有方法都使用对应的数据源,也可以在方法上单独添加 @DS 注解,优先级更高:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.xxx.entity.VOcrCbxx;
import org.springframework.stereotype.Repository;

/**
 * oracle-cbxx 数据源对应的 Mapper 接口
 * @DS 注解指定数据源名称,与 application.yml 中配置的 key 一致
 */
@DS("oracle-cbxx")
@Mapper
public interface VOcrCbxxMapper extends BaseMapper<VOcrCbxx> {

    /**
     * 自定义查询方法:根据日期查询数据
     * 该方法默认使用类上指定的 oracle-cbxx 数据源
     */
    default List<VOcrCbxx> selectByBqcbr(String date) {
        QueryWrapper<VOcrCbxx> wrapper = new QueryWrapper<>();
        // 适配 Oracle 日期函数,匹配年月日
        wrapper.apply("TRUNC(bqcbr) = TO_DATE({0}, 'YYYY-MM-DD')", date);
        return selectList(wrapper);
    }
  
      /**
     * 自定义方法:使用 oracle-orcl 数据源查询
     * 方法级别 @DS 注解优先级高于类级别
     */
    @DS("oracle-orcl")
    List<VOcrCbxx> selectFromOrclByCondition(String condition);
}

四、核心使用说明

  1. 注解优先级:方法上的 @DS 注解 > 类上的 @DS 注解 > 全局默认数据源。
  2. 事务支持:多数据源下的事务需要使用 @DSTransactional 注解(而非 Spring 原生的 @Transactional),该注解能保证同一数据源内的事务一致性;跨数据源事务需结合分布式事务方案(如 TCC)。
  3. 避免数据源混用:建议严格按照包结构划分 Mapper,避免不同数据源的 Mapper 混杂,降低维护成本。
  4. 动态切换数据源:除了通过 @DS 注解静态指定数据源,还可以通过 DynamicDataSourceContextHolder 类手动切换数据源,适用于动态选择数据源的业务场景:

    // 手动切换到 mysql-ocr 数据源
    DynamicDataSourceContextHolder.push("mysql-ocr");
    // 执行数据库操作
    ocrCmMapper.selectById(1L);
    // 清空当前数据源上下文
    DynamicDataSourceContextHolder.clear();

五、总结

通过 MyBatis-Plus 的 dynamic-datasource-spring-boot-starter,我们可以在 Spring Boot 项目中零侵入式地实现多数据源配置,核心步骤总结如下:

  1. 引入多数据源核心依赖;
  2. application.yml 中配置多数据源连接信息,指定默认数据源;
  3. 按数据源划分 Mapper 包结构,通过 @DS 注解指定 Mapper/方法对应的数据源;
  4. 业务层直接注入 Mapper 接口使用,无需关心数据源切换细节。

这种配置方式简洁高效,极大降低了多数据源开发的复杂度,非常适合需要操作多个异构数据库的业务场景。

0

评论 (0)

取消