SpringBoot整合Mybatis-Plus多数据源

news/2024/11/28 11:52:41/

一、前言

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

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:#使用阿里的Druidtype: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverdynamic:primary: master #设置默认的数据源或者数据源组,默认值即为masterstrict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源datasource:master:url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghaiusername: rootpassword:slave_1:url: jdbc:mysql://127.0.0.1:3306/test1?serverTimezone=Asia/Shanghaiusername: rootpassword:

补充:

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

# 多主多从                      纯粹多库(记得设置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 {@TableIdprivate 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.ppmy.cn/news/241560.html

相关文章

通过Visual Studio诊断工具定位软件CPU瓶颈

通过VS诊断工具定位软件CPU瓶颈 前情提示&#xff1a;正常情况下我们使用调试模式会看不到诊断工具窗口&#xff0c;控制台会报“无法启动标准收集器。请尝试修复 Visual Studio 的安装。 (HRESULT: 0xe1110002)”这样的错误。 解决方式&#xff1a;通过[Downloads - Visual St…

联想yoga13s锐龙版和酷睿版 哪个好

联想yoga13s两个版本的屏幕都是一样的&#xff0c;都采用了13.3英寸的尺寸大小的屏幕&#xff0c;分辨率都是2.5k&#xff0c;色域为100%sRGB高色域&#xff0c;屏幕占比比较高&#xff0c;为全面屏设计&#xff0c;两个版本的屏幕素质不错&#xff0c;是目前轻薄本市场中第一梯…

联想拯救者y7学计算机可以用吗,2018什么笔记本电脑好 联想拯救者y7000评测

如今&#xff0c;爱好网游的年轻朋友非常多&#xff0c;尤其是热衷于端游的人较多。为了使自己在玩游戏时不出现卡顿的现象&#xff0c;越来越多的朋友都选择购买游戏本。于是&#xff0c;许多电脑品牌纷纷推出游戏本&#xff0c;当然联想也不例外。那么下面小编就来给大家具体…

联想拯救者r720适合java么_联想拯救者哪个型号好 联想拯救者r720怎么样【详解】...

目前&#xff0c;联想这一品牌旗下的笔记本或者电脑在我们生活中出现的频率很高&#xff0c;因为其产品质量一直以来都让广大消费者十分放心。针对一些游戏爱好者&#xff0c;联想推出了一系列的游戏本&#xff0c;拯救者就是其中比较热门的系列。但是&#xff0c;究竟 联想拯救…

学计算机r7000和y7000哪个好,分析看看联想拯救者r7000和y7000区别是什么?哪个好?真相评测揭秘...

这两款联想拯救者r7000和y7000区别不是很大的哈&#xff0c;款式和配置是差不多的&#xff0c;只是说联想拯救者y7000p大气一些的&#xff0c;看个人喜欢吧&#xff0c;我自己用的是联想拯救者y7000p&#xff0c;这款性价比蛮高的&#xff0c;质感蛮强的&#xff0c;电脑贼棒.外…

学计算机r7000和y7000哪个好,联想拯救者r7000p和y7000p哪个好-联想拯救者r7000p和y7000p评测对比...

联想拯救者r7000p 2020最近开放上架了&#xff0c;那么这款搭载了AMD处理器的游戏本对标y7000p又有哪些不同之处呢&#xff0c;两款笔记本是否体验不同&#xff0c;究竟哪一款更好&#xff0c;哪一款更香&#xff0c;哪一款更实在&#xff0c;快来了解一下吧&#xff0c;也许能…

当开发同事辞职,接手到垃圾代码怎么办?

目录 一、前言 二、开发中的另一种选择 三、低代码概念 四、低代码在开发中的优势 01、开发效率提高 02、开发成本减少 03、维护性更高 五、有低代码后就不要开发了? 一、前言 事实上&#xff0c;垃圾项目是日积月累而成的&#xff0c;所谓冰冻三尺非一日之寒&#xf…

【JavaEE】HTTPS加密原理

HTTPS加密原理✿✿ヽ(▽)ノ✿ 文章目录 JavaEE & HTTPS加密原理1. 为什么要加密2. HTTPS加密原理2.1 初始想法2.2 引入非对称加密2.3 中间人攻击2.4 引入证书 JavaEE & HTTPS加密原理 1. 为什么要加密 例子&#xff1a;&#xff08;运营商劫持&#xff09; 你可能经常…