Springboot中使用mabatis_plus拓展包多数据源配置

2023-11-01

1.需求

使用Springboot进行项目开发时,需要访问多个数据库,每个数据库都有各自的作用,需要将数据分开建表存储。

1)多数据源配置:两个库业务互不相干,a方法使用a库的数据,b方法使用b库的数据;

2)动态数据源配置:两个库业务有关联,如读写分离库。

2.解决

有两种方式:1)利用@MapperScan(basePackages = {"mapper文件路径的方式"}, sqlSessionFactoryRef = "sqlSessionFactory")实现,具体方法和步骤参见https://www.cnblogs.com/niumoo/p/14209663.htmlb

本文推荐第二种方式,可根据自身情况自由选择。

2)使用Mabatis-plus的拓展多数据源包可以轻松实现多数据源的配置,且不需要变换已经建好的项目目录结构和configration。

3.Mabatis-plus多数据源配置

1)关于Mybatis-plus

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。所以不必担心已经建好的项目使用Mabatis-plus会影响原来的的方法。

2)步骤

2.1 依赖删除:

引入 MyBatis-Plus 之后再次引入 MyBatis 以及 MyBatis-Spring,会因版本差异导致的问题,所以先将依赖库中的Mabatis依赖删除。

2.1 依赖引入:

1)mabatis-plus依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.0</version>
</dependency>

版本号选用最新版本,这里我使用3.3.0;

2)多数据源拓展包引入

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  <version>3.3.0</version>
</dependency>

2.2 创建配置类:

@Configuration
@MapperScan("com.example.demo.mapper")
public class MyBatisConfiguration {

}

让Springboot扫描到项目的mapper接口文件夹,如果在加入依赖前已有配置类则无需改动,保持不变即可。

2.3 在application.yml文件中配置datasource连接

1)新建application.yml文件

如果之前一直使用的时properties文件,则新建 application.yml文件,两个文件都会对项目进行配置。

2)在yml文件中添加如下数据源配置

spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        slave_1:
          url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
        slave_2:
          url: ENC(xxxxx) # 内置加密,使用请查看详细文档
          username: ENC(xxxxx)
          password: ENC(xxxxx)
          driver-class-name: com.mysql.jdbc.Driver
       #......省略
       #以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2

3)配置模式

# 多主多从                      纯粹多库(记得设置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:

2.4 使用 @DS 切换数据源

 示例:在进行数据库操作的mapper接口上加注解即可实现对应数据库的操作。

@Repository
public interface IExhibitContentMapper {
    
    @DS("exhibit_content")
    int createExhibitContentTable(String tableName);

    @DS("exhibit_content")
    int insertExhibitContent(@Param("tableName") String table,@Param("part") String content);

    @DS("exhibit_content")
    int deleteExhibitContent(@Param("tableName") String table);

    @DS("exhibit_content")
    List<ExhibitContentVO> getExhibitContent(@Param("tableName") String table);
}

4.Mabatis-plus拓展多数据源使用规范

1)本框架只做 切换数据源 这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何CRUD。

2)配置文件所有以下划线 _ 分割的数据源 首部 即为组的名称,相同组名称的数据源会放在一个组下。

3)切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。

4)默认的数据源名称为 master ,你可以通过 spring.datasource.dynamic.primary 修改。

5)方法上的注解优先于类上注解。

6)DS支持继承抽象类上的DS,暂不支持继承接口上的DS。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot中使用mabatis_plus拓展包多数据源配置 的相关文章

  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • 如何使用chatGPT生成小红书种草文案

    如何使用chatGPT生成小红书种草文案 小红书拥有超千万的日活用户 为商家提供了广阔的变现空间和机会 成为商家选择在小红书上推广的原因之一 小红书种草文案 例如具有影响力的热门话题 产品使用方法等内容可以让消费者迅速了解产品为品牌带来更多
  • nginx转发后如何获取真实的ip地址

    前言 最近做一个团队的打卡系统 需要通过连接实验室WiFi来判是否人在实验室 网上千篇一律的获取主机ip的方法由于我使用了nginx反向代理 导致获取到的ip地址为127 0 0 1 这肯定是不符合我们验证标准的 还有就是失去了校验的意义了
  • 人工智能笔记

    第一章 绪论 1956年正式提出人工智能 artificial intelligence AI 这个术语并把它作为一门新兴科学的名称 20世纪三大科学技术成就 空间技术 原子能技术 人工智能 智能是知识与智力的总和 知识是一切智能行为的基础
  • Flutter 在MAC环境下jenkins+fastlane+gitlab实现自动打包部署(看这一篇就够了,小而精)

    实现办公局域网下的jenkins服务 Flutter配置 文档 jenkins安装 通过homebrew安装 1 安装homebrew bin bash c curl fsSL https raw githubusercontent com
  • 谷歌播客Google PodCasts解析脚本

    解析某个频道 全部的结果 import json import requests feed url https podcasts google com feed aHR0cHM6Ly93d3cueGltYWxheWEuY29tL2FsYnV
  • 我的LLVM学习笔记——OLLVM混淆研究之FLA篇

    因为要做代码保护 所以抽时间研究了下OLLVM中的三种保护方案 BCF Bogus Control Flow 中文名虚假控制流 FLA Control Flow Flattening 中文名控制流平坦化 SUB Instructions S
  • vue使用wangEditor

    vue版本2 0 editor5 1 23版本 editor for vue 1 0 2版本 api文档入口 效果图 点击查看如何封装 安装步骤入口 npm install wangeditor editor save npm instal
  • 多路选择器MUX总结-IC学习笔记(八)

    多路复用器是一种组合电路 它从许多输入信号中选择一个作为输出 本文先介绍两个MUX的简单应用 主要关于如何将verilog与物理实现对应 第二当MUX作为时钟切换电路时如何避免毛刺 glitch 文章目录 1 1 MUX code与物理实现
  • grafana配置MySQL持久化存储并配置HTTPS

    Grafana 配置 MySQL 数据持久化存储 一 mysql8 0 30 安装 1 1 解压并初始化 MySQL8 0 30 查询是否存在 MariaDB 和 MySQL 存在需要删除后进行安装 rpm qa grep MariaDB
  • 目标检测VOC标注格式中,将斜框标注转化为水平框

    目标检测VOC格式数据集obb标注向hbb标注的转换 polygon 2 bndbox polygon obb 和bndbox hbb 介绍 polygon obb bndbox hbb polygon2bndbox转换原理 polygon
  • unturned服务器修改空投频率,unturned 服务器设置

    unturned 服务器设置 内容精选 换一换 区块链服务状态为 弹性IP异常 排查项 弹性公网IP已 解绑 或被释放 在BCS控制台 服务管理页面中的目标服务卡片中 单击 更多 gt 更新访问地址 查看弹性公网IP 登录网络控制台 查找目
  • ajax success function(data)后的data数据无法使用Uncaught TypeError: Cannot read property ‘xxx‘ of undefined

    问题描述 前端小白 在不了解ajax机制的情况下误使用函数返回ajax中需要时间完成的ajax函数 导致return后的data无法在后面的script代码块中正常使用 function getData ajax type get url
  • procfs使用及字符设备

    以下内容由chatgpt给出 以下是一个使用procfs接口创建设备节点的示例代码 include
  • Android Kotlin SharedFlow

    SharedFlow 会从其中收集值得所有使用方法中发出数据 简而言之就是 像普通的流只可以一方发送 一方接受 而这个流可以一方发送 多方接受 下面上代码演示 SharedFlowFragment package com example a
  • 【C#】-属性(Property)和字段(Field)的区别

    导读 近期学习过程中发现了一些问题 我的学习只是学习 敲代码就是敲代码 没有加入思考 也不问为什么就直接去敲人家写好的例子去敲 把知识都学死了 逐渐散失了思考能力 所以学习的兴趣大打折扣 正如那句话 学而不思则罔 思而不学则殆 在设计模式中
  • c语言 学生信息管理系统设计,大一C语言结课设计之《学生信息管理系统》

    第一次写这么长的程序 代码仅供参考 有问题请留言 学生信息管理系统 IDE Dev Cpp 4 9 9 2 2014 6 15 include include include include include using std sort u
  • 【Redis】回顾Redis知识点之事务机制

    回顾Redis知识点之事务机制 Redis事务机制 为什么 Redis 不支持回滚 roll back 假如事务执行一半的时候Redis宕机怎么办 为什么需要内存回收 上一篇回顾下Redis基础知识点中有简单介绍Redis与Memcache
  • python 一行代码 将小数变成百分数

    数据表 将人数占比和金额占比设置成百分数 先将数据变成保留4位小数点的数 方法一 最简单 result 人数占比 round 4 result 金额占比 round 4 方法二 lambda函数 把数据变成4位小数点的数 写lambda函数
  • 云服务器和传统IDC物理机有什么区别?

    为什么选腾讯云服务器不选传统IDC物理机 云服务器弹性计算使用灵活 上云是趋势 并且性价比高 支持一键升级配置或降级配置 一键部署搭建应用程序环境 一键调整公网带宽 一键镜像复制到另一台服务器 并且支持退款 可以实现分分钟创建多台云服务器实
  • Springboot中使用mabatis_plus拓展包多数据源配置

    1 需求 使用Springboot进行项目开发时 需要访问多个数据库 每个数据库都有各自的作用 需要将数据分开建表存储 1 多数据源配置 两个库业务互不相干 a方法使用a库的数据 b方法使用b库的数据 2 动态数据源配置 两个库业务有关联