在实际开发中,我们经常会遇到一个 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.java2. @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);
}四、核心使用说明
- 注解优先级:方法上的
@DS注解 > 类上的@DS注解 > 全局默认数据源。 - 事务支持:多数据源下的事务需要使用
@DSTransactional注解(而非 Spring 原生的@Transactional),该注解能保证同一数据源内的事务一致性;跨数据源事务需结合分布式事务方案(如 TCC)。 - 避免数据源混用:建议严格按照包结构划分 Mapper,避免不同数据源的 Mapper 混杂,降低维护成本。
动态切换数据源:除了通过
@DS注解静态指定数据源,还可以通过DynamicDataSourceContextHolder类手动切换数据源,适用于动态选择数据源的业务场景:// 手动切换到 mysql-ocr 数据源 DynamicDataSourceContextHolder.push("mysql-ocr"); // 执行数据库操作 ocrCmMapper.selectById(1L); // 清空当前数据源上下文 DynamicDataSourceContextHolder.clear();
五、总结
通过 MyBatis-Plus 的 dynamic-datasource-spring-boot-starter,我们可以在 Spring Boot 项目中零侵入式地实现多数据源配置,核心步骤总结如下:
- 引入多数据源核心依赖;
- 在
application.yml中配置多数据源连接信息,指定默认数据源; - 按数据源划分 Mapper 包结构,通过
@DS注解指定 Mapper/方法对应的数据源; - 业务层直接注入 Mapper 接口使用,无需关心数据源切换细节。
这种配置方式简洁高效,极大降低了多数据源开发的复杂度,非常适合需要操作多个异构数据库的业务场景。
评论 (0)