SpringBoot整合Mybatis-Plus多数据源

一、前言

随着业务的不断扩展和复杂度的增加,我们在开发过程中往往需要访问多个数据库。比如:我们可能需要同时访问主数据库和从数据库,或者访问多个独立的数据库来处理不同的业务逻辑。这时候,我们就需要使用多数据源来实现对多个数据库的操作。

MyBatis-Plus则是一个优秀的ORM框架,它为我们封装了大量的数据库操作细节,简化了我们的开发工作,同时也提供了多数据源方案。

  • dynamic-datasource 开源文档付费,属于组织参与者小锅盖发起的项目。
  • mybatis-mate 企业级付费授权,资料文档免费。

今天我们以第一种方案来具体说一下怎么实现!

MyBatis-Plus多数据源官网:https://baomidou.com/pages/a61e1b/#dynamic-datasource。

二、简单搭建测试

1、准备工作

我们先把一些使用的版本列举一下,方便大家看!

  • Spring Boot:2.7.4
  • dynamic-datasource:3.5.1
  • mybatis-plus:3.5.1

数据库方面这里就不演示了,我们准备好两个mysql数据库:

2、添加依赖

<dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.24</version></dependency><dependency>    <groupId>com.baomidou</groupId>    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>    <version>3.5.1</version></dependency><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency><!-- Druid --><dependency>    <groupId>com.alibaba</groupId>    <artifactId>druid-spring-boot-starter</artifactId>    <version>1.2.15</version></dependency><!-- mysql --><dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId></dependency><!-- mybatis-plus --><dependency>    <groupId>com.baomidou</groupId>    <artifactId>mybatis-plus-boot-starter</artifactId>    <version>3.5.1</version></dependency>

3、yml配置

spring:  datasource:    #使用阿里的Druid    type: com.alibaba.druid.pool.DruidDataSource    driver-class-name: com.mysql.cj.jdbc.Driver    dynamic:      primary: master #设置默认的数据源或者数据源组,默认值即为master      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源      datasource:        master:          url: jdbc:mysql://127.0.0.1:3306/test?serverTimeznotallow=Asia/Shanghai          username: root          password:        slave_1:          url: jdbc:mysql://127.0.0.1:3306/test1?serverTimeznotallow=Asia/Shanghai          username: root          password:

「补充:」

可以继续多种模式,咱们以简单的进行演示!

# 多主多从                      纯粹多库(记得设置primary)                   混合配置
spring:                               spring:                               spring:
  datasource:                           datasource:                           datasource:
    dynamic:                              dynamic:                              dynamic:
      datasource:                           datasource:                           datasource:
        master_1:                             mysql:                                master:
        master_2:                             oracle:                               slave_1:
        slave_1:                              sqlserver:                            slave_2:
        slave_2:                              postgresql:                           oracle_1:
        slave_3:                              h2:                                   oracle_2:

4、实体类

@Data
public class Test {

    @TableId
    private Integer id;
    private String name;
    private Integer age;
    private LocalDateTime time;
    private LocalDateTime createdAt;
}

5、多数据源配置Mapper

使用 @DS 切换数据源。@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解。

注解

结果

没有@DS

默认数据源

@DS(“dsName”)

dsName可以为组名也可以为具体某个库的名称

public interface TestDbMapper extends BaseMapper<Test> {
}
@DS("slave_1")
public interface TestDb2Mapper extends BaseMapper<Test> {
}

注意:

这里@DS可以添加在service中的方法上来切换数据源,也可以像小编一样加在Mapper接口上!

他们各有优缺点,我们需要权衡利弊进行选择:

如果一个Service只需要使用一个数据源,或者多个Service方法都需要使用相同的数据源,则建议将@DS注解添加到Mapper接口或XML文件上;如果需要根据不同的业务场景动态切换数据源,则可以选择在Service方法上使用@DS注解。

当然还有一种情况,一个service方法操作不同的数据源,表结构一样的话可以使用一个mapper。

在service内部进行切换,我们看到官方注释,「非必要不要这么使用」!

// 设置当前线程数据源 如非必要不要手动调用,调用后确保最终清除
DynamicDataSourceContextHolder.push("slave_1");
// 获得当前线程数据源
DynamicDataSourceContextHolder.peek();
// 强制清空本地线程 防止内存泄漏,如手动调用了push可调用此方法确保清除
DynamicDataSourceContextHolder.poll();

完整代码块:

@Override
public Result saveTest() {
    Test test = new Test();
    test.setId(1993);
    test.setName("add方法");
    // 切换指定数据源
    DynamicDataSourceContextHolder.push("slave_1");
    testDbMapper.insert(test);
    //查看当前数据源
    log.info(DynamicDataSourceContextHolder.peek());
    //移除数据源,恢复master数据源
    DynamicDataSourceContextHolder.clear();
    testDbMapper.insert(test);
    return Result.success("222");
}

数据库展示:

6、测试

我们还是以把@DS放在mapper类上来进行演示:

@Autowired
private TestDbMapper testDbMapper;
@Autowired
private TestDb2Mapper testDb2Mapper;
@Override
public Result saveTest() {
    Test test = new Test();
    test.setId(1994);
    test.setName("add方法");
    testDbMapper.insert(test);
    testDb2Mapper.insert(test);
    return Result.success("222");
}

数据库正常保存到两个库,测试通过!

7、事务问题

在使用多数据源的同时,也带来了一下事务问题,如果一个方法添加了@Transactional(rollbackFor = Exception.class)事务,默认查询只会从默认库来查询。

这个问题是要解决的,这里小编给几个思路大家可以试一下!

  • Spring Boot提供了一个基于Atomikos的JTA实现。
  • 可以配置多个DataSourceTransactionManager进行管理事务。

能分开系统来进行数据源的隔离,需要查询数据可以使用feign来获取!小编还没在企业中使用多数据源,缺乏一下关于事务方面的分享,大家有想法或者熟悉的可以留言分享一下自己的经验!

三、总结

希望这篇博客能够帮助读者更好地理解和掌握Spring Boot和MyBatis-Plus多数据源的使用方法,并应用到实际项目中去。同时,也提醒读者在使用多数据源的时候要注意事项,比如事务管理、连接池配置等,以确保系统的稳定性和可靠性。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/265300.html<

(0)
管理的头像管理
上一篇2025-05-05 10:34
下一篇 2025-05-05 10:35

相关推荐

  • 高防服务器的防御原理是什么,如何选择高防服务器?

    高防服务器的防御原理,简单说就是通过流量清洗、防火墙规则和黑洞路由等机制,在攻击流量到达业务服务器之前将其过滤或阻断,从而保障正常访问,流量清洗机制是核心防线高防服务器对抗DDoS攻击,靠的不是单一技术,而是一套组合动作,最常见的攻击类型是流量型攻击,比如UDP洪水、SYN洪水、ICMP放大等,核心思路是耗尽带……

    2026-07-26
    0
  • BGP线路到底是什么意思呢,有什么优势?

    BGP线路是一种通过边界网关协议实现多运营商网络互联的接入方式,能自动选择最优路径,极大提升跨网访问速度和稳定性,是解决国内南北网络瓶颈的核心方案,什么是BGP线路BGP,全称Border Gateway Protocol,边界网关协议,是互联网核心路由协议之一,它负责在自治系统之间交换网络可达性信息,BGP线……

    2026-07-26
    0
  • 增值电信业务经营许可证对IDC有多重要,如何办理?

    增值电信业务经营许可证是IDC服务商合法运营的核心凭证,它直接决定了机房能否接入骨干网、客户能否放心托管业务,以及服务商自身能否长期稳定发展,许可证是IDC进入市场的硬门槛互联网数据中心业务属于增值电信业务中的B1类,依据工信部《电信业务经营许可管理办法》,任何从事服务器托管、虚拟主机、云服务等业务的企业,必须……

    2026-07-26
    0
  • 站群服务器一个IP放几个网站合适?,怎么选

    站群服务器一个IP放3-5个网站是大多数情况下的最佳平衡点,但具体数量需根据网站权重、内容质量及IP资源成本灵活调整,这个结论基于搜索引擎对同IP站点的关联判定逻辑,以及站群运营的长期实践,如果你刚接触站群,可能会纠结于IP分配,但核心原则是:不要让搜索引擎轻易识别出这些网站属于同一实体,站群IP分配的底层逻辑……

    2026-07-26
    0
  • DDoS攻击和CC攻击有什么区别,怎么防御?

    DDoS攻击和CC攻击最核心的区别在于攻击目标不同:DDoS攻击主要消耗网络带宽和基础设施资源,而CC攻击专门针对应用层逻辑,耗尽服务器CPU和数据库连接数,两者从原理到防御手段完全不同,攻防视角下的本质差异攻击目标:一个砸门,一个撬锁DDoS攻击(分布式拒绝服务)瞄准的是网络层和传输层,通过大量伪造数据包或畸……

    2026-07-26
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注