SpringBoot整合Mybatis-Plus多数据源

news2024/12/23 9:50:04

一、前言

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

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

  • dynamic-datasource 开源文档付费,属于组织参与者小锅盖发起的项目

  • mybatis-mate 企业级付费授权,资料文档免费

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

MyBatis-Plus多数据源官网

二、简单搭建测试

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?serverTimezone=Asia/Shanghai
          username: root
          password:
        slave_1:
          url: jdbc:mysql://127.0.0.1:3306/test1?serverTimezone=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多数据源的使用方法,并应用到实际项目中去。同时,也提醒读者在使用多数据源的时候要注意事项,比如事务管理、连接池配置等,以确保系统的稳定性和可靠性。

特别要注意事务!!!
特别要注意事务!!!
特别要注意事务!!!


看到这里了,还请动一下您的发财小手,关注一下公众号哈!!谢谢您的关注!!文章首发看!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/615338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python脚本】编写

这里写自定义目录标题 欢迎使用python来编写脚本环境搭建 欢迎使用python来编写脚本 测试方向&#xff0c;测试报告&#xff0c;单元测试 环境搭建 python环境搭建 下载地址 https://www.python.org/ 文档 https://docs.python.org/3/ pycharm的环境 使用chatgpt来实现代码功…

来了解一下白盒测试,黑盒测试,灰盒测试吧(超详解~)

根据被测对象的不同&#xff0c;软件测试可以分为白盒测试、黑盒测试、灰盒测试三种方式。那么&#xff0c;这三种测试方式具体是如何运行的&#xff1f;各有什么特点&#xff1f;下面&#xff0c;跟着静姐一起了解一下吧&#xff01; 01、白盒测试 WHITE BOX ●概念&#x…

实训第二天

创建数据库指定字符集 create database firstdb default character set utf8; 主键约束&#xff08;primary key&#xff09;不能为空&#xff0c;唯一约束(unique key)可以为空&#xff0c;但只允许一个空值 查看表结构 desc 表名 主表从表 被引用的表是主表 比如班级…

管理类联考•逻辑——解题技巧汇总

管理类联考•逻辑——解题技巧汇总 第一部分 形式逻辑 第1章 复言命题 母题1 充分与必要 充分条件 A是B的充分条件,记作A→B,读作“A推B”,是指假如事件A发生了,事件B一定发生。典型关联词: “如果…那么…。” 必要条件 A是B的必要条件,记作B→A,说明A的发生对于B的发生是…

电脑如何通过手机上网?

有时我们的电脑会出现没有网络&#xff0c;或者断网的现象&#xff0c;这时如果必须使用电脑&#xff0c;我们可以通过手机流量来上网&#xff0c;那么要如何操作呢&#xff1f;下面我们就来了解一下。 方法1. 电脑连接手机热点上网 该方法适用于笔记本电脑和有无线网卡的台式…

安全响应中心 — 垃圾邮件事件报告(6.5)

2023年6月 第二周 样本概况 ✅ 类型1&#xff1a; 携带钓鱼链接的伪造传票邮(URLPhish) 近期&#xff0c;安全团队捕获到一类新的伪造51某票的钓鱼邮件&#xff0c;内容上为伪造的律师事务所传票信息&#xff0c;并诱导收件人点击钓鱼链接。代表样本如下&#xff1a; 结合情…

医院检验系统LIS系统源码

医院检验系统LIS是HIS系统的一个重要的组成部分&#xff0c;其主要功能是将检验的实验仪器传出的检验数据经分析后&#xff0c;生成检验报告&#xff0c;通过网络存储在数据库中&#xff0c;使医生能够方便、及时的看到患者的检验结果&#xff0c;从现在的应用来看&#xff0c;…

开发物联网平台需要多少费用?

物联网开发技术是当今最热门的技术之一&#xff0c;在许多领域都有巨大的商业价值。随着物联网技术的迅速发展&#xff0c;这对企业来说是一个很好的机会&#xff0c;可以充分利用这些技术来提高其效率和生产力。 那么&#xff0c;开发物联网平台需要多少钱呢&#xff1f;答案是…

Linux工具之htop(含移植到arm-linux系统)

文章目录 介绍安装使用一些参数讲解功能键说明一些快捷键一些指令参数 拓展&#xff1a;Linux进程PRI与NI值拓展&#xff1a;VIRT(虚拟内存)RES(常驻内存)和SHR(共享内存)拓展&#xff1a;编译成应用放到开发板上使用源码下载解压编译 介绍 Htop是一个免费的&#xff08;GPL&a…

毕业2年,月薪就有30K,太卷了吧......

想起两年前交流过的一个应届生&#xff0c;当时他刚毕业技术水平不高&#xff0c;进了一个小公司做软件测试实习工作。最近联系上了&#xff0c;不问不知道&#xff0c;一问吓一跳&#xff0c;他现在已经进了某一线大厂&#xff0c;月薪30K。这位朋友其实也没比别人强多少&…

708教室使用方法

一、教室平面图 708教室的布局如下&#xff0c;重要的设备已经在图中标出。总开关、一体机和机柜。   二、使用方法 2.1 房间机器上电 进门后首先走到“总开关位置”&#xff0c;将电匝闭合。 原来的开关如图所示&#xff0c;有3组开关&#xff0c;1号组开关用于控制插座、…

小程序自动化测试

背景 近期团队打算做一个小程序自动化测试的工具&#xff0c;期望能够做到业务人员操作一遍小程序后&#xff0c;自动还原之前的操作路径&#xff0c;并且捕获操作过程中发生的异常&#xff0c;以此来判断这次发布是否会影响小程序的基础功能。 上述描述看似简单&#xff0c;…

为什么黑客要攻击你的网站?如何才能保护网站不被攻击?

根据2023年一季度应用程序安全状况报告所披露的报告&#xff0c;今年来全球已经累计有超过1400多万个网站遭受了超过10亿次网络攻击&#xff0c;网络的安全风险依然在逐年不断提升。 几乎每个网站都面临风险&#xff0c;无论是简单的博客论坛、投资平台、小型的独立电商网站还是…

无需服务器,5分钟在公众号中接入ChatGPT

前言 在原先使用openAI的接口分别实现过微信聊天&#xff0c;语音对话等功能的基础上&#xff0c;我又将矛头指向了公众号&#xff0c;最近在github中找到了一个挺好玩的案例&#xff1a;公众号机器人&#xff0c;于是打算分享一下整个搭建过程 准备工作 微信公众号AirCode账…

三、基尔霍夫定理

目录 基本概念 基尔霍夫电流定理&#xff08;KCL&#xff09; 基尔霍夫电压定理&#xff08;KVL&#xff09; 总结 基本概念 1.支路 定义1&#xff1a;电路中每一个两端元件就称为一条支路 定义2&#xff1a;电路中通过同一电流的分支 2.结点 定义1&#xff1a;元件的连接…

spring实例化bean之循环依赖

serviceA里注入了serviceB&#xff0c;serviceB里又注入了serviceA&#xff0c;这样在实例化serviceA时&#xff0c;在doCreateBean时的populateBean时会先实例化serviceB&#xff0c;然后实例化serviceB&#xff0c;在serviceB的doCreateBean方法的populateBean又会去找servci…

什么是Linux shell—一个简单的案例

一句话概括&#xff1a;简单来说脚本就是将需要执行的命令保存到文本中&#xff0c;按照顺序执行&#xff08;由上往下执行&#xff09;&#xff0c;shell脚本:shell脚本就是一些命令的集合。 一、创建第一个Shell脚本&#xff1a;输出helloworld 1&#xff0e;脚本格式 脚本…

(转载)基于遗传模拟退火的聚类算法(matlab实现)

1 理论基础 1.1 模糊聚类分析 模糊聚类是目前知识发现以及模式识别等诸多领域中的重要研究分支之一。随着研究范围的拓展&#xff0c;不管是科学研究还是实际应用&#xff0c;都对聚类的结果从多方面提出了更高的要求。模糊C-均值聚类(FCM)是目前比较流行的一种聚类方法。该…

【不单调的代码】还在嫌弃Ubuntu终端?快来试试做些Ubuntu终端的花式玩法。

&#x1f38a;专栏【​​​​​​​不单调的代码】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Love Story】 &#x1f970;大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 注意&#xff1a; 本文是在…

【Protobuf速成指南】Protobuf快速上手

文章目录 1.0版本一、编写.proto文件1.文件规范&#xff1a;2.注释方式&#xff1a;3.指定proto3语法&#xff1a;4.package申明符5.定义message6.编写消息字段①类型对照表②唯一编号 二、编译.proto文件1. 编译指令2.源码分析 三、序列化和反序列化的使用四、小结 1.0版本 本…