MyBatis Plus多数据源实现教程

精心整理了最新的面试资料和简历模板,有需要的可以自行获取

点击前往百度网盘获取
点击前往夸克网盘获取


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(); // 移除当前数据源

四、注意事项

  1. 数据源优先级

    • 方法注解 > 类注解 > 默认数据源
  2. 事务限制

    • 一个事务方法内不能切换数据源
    • 需要分布式事务时建议使用Seata
  3. 性能优化

    • 建议配置连接池(如HikariCP)
    • 避免频繁切换数据源
  4. 配置建议

    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驱动


通过本文方案,可以快速实现以下特性:

  • 基于注解的数据源切换
  • 多数据源事务管理
  • 动态数据源扩展
  • 连接池优化配置

可根据实际需求选择适合的配置方式,建议在开发环境下通过日志验证数据源切换行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘵奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值