精心整理了最新的面试资料和简历模板,有需要的可以自行获取
MyBatis Plus多数据源实现教程
一、背景说明
在实际项目中,可能遇到需要同时操作多个数据库的场景,例如:
- 主从数据库读写分离
- 多租户系统隔离数据源
- 跨不同数据库类型(MySQL/Oracle等)操作
MyBatis Plus本身不直接支持多数据源,但可通过第三方扩展库dynamic-datasource-spring-boot-starter
快速实现。
二、实现步骤
1. 添加依赖
<!-- MyBatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
<!-- 多数据源核心依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.6.1</version>
</dependency>
2. 配置数据源
在application.yml
中配置多个数据源:
spring:
datasource:
dynamic:
primary: master # 设置默认数据源
strict: false # 是否严格匹配数据源
datasource:
master:
url: jdbc:mysql://localhost:3306/master_db?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
slave1:
url: jdbc:mysql://localhost:3306/slave1_db?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
3. 创建数据源配置类(可选)
@Configuration
public class DataSourceConfig {
// 自动配置已由starter完成
}
4. 使用注解切换数据源
通过@DS
注解指定要使用的数据源:
Service层示例
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 默认使用master数据源
@DS("slave1") // 指定使用slave1数据源
@Override
public List<User> getSlaveUsers() {
return baseMapper.selectList(null);
}
}
Mapper层示例
@DS("slave1") // 整个Mapper使用slave1数据源
public interface OrderMapper extends BaseMapper<Order> {
@DS("master") // 单个方法覆盖使用master
Order selectMasterOrder(Long id);
}
三、高级配置
1. 多数据源事务管理
使用@DSTransactional
注解:
@Service
public class OrderService {
@DSTransactional // 开启多数据源事务
public void multiDataSourceTx() {
// 操作master数据源
masterMapper.update(...);
// 操作slave1数据源
slave1Mapper.insert(...);
}
}
2. 动态切换数据源
通过编程方式切换:
DynamicDataSourceContextHolder.push("slave2"); // 切换到slave2
// 执行数据库操作
DynamicDataSourceContextHolder.poll(); // 移除当前数据源
四、注意事项
-
数据源优先级:
- 方法注解 > 类注解 > 默认数据源
-
事务限制:
- 一个事务方法内不能切换数据源
- 需要分布式事务时建议使用Seata
-
性能优化:
- 建议配置连接池(如HikariCP)
- 避免频繁切换数据源
-
配置建议:
spring: datasource: dynamic: hikari: max-lifetime: 1800000 connection-timeout: 5000 max-pool-size: 15 min-idle: 5
五、完整示例代码结构
src/main/java
├── config
│ └── DataSourceConfig.java
├── entity
│ ├── User.java
│ └── Order.java
├── mapper
│ ├── UserMapper.java
│ └── OrderMapper.java
└── service
└── UserService.java
六、常见问题
Q1: 如何验证数据源切换成功?
A1: 在SQL日志中观察使用的数据源连接信息
Q2: 出现"No qualifying bean of type ‘javax.sql.DataSource’"错误?
A2: 检查yml配置缩进是否正确,确保数据源名称一致
Q3: 如何支持多个不同数据库类型?
A3: 配置不同driver-class-name即可,如同时配置MySQL和Oracle驱动
通过本文方案,可以快速实现以下特性:
- 基于注解的数据源切换
- 多数据源事务管理
- 动态数据源扩展
- 连接池优化配置
可根据实际需求选择适合的配置方式,建议在开发环境下通过日志验证数据源切换行为。