当前位置: 首页 > news >正文

MyBatis-Plus 多数据源配置与读写分离实战

一、引言

在实际的项目开发中,我们常常会遇到需要操作多个数据库的情况,比如纯粹多库、读写分离、一主多从、混合模式等。本文将详细介绍如何使用 MyBatis-Plus 实现纯粹多库的场景,并探讨读写分离的实现思路。

二、环境准备

  • 开发工具:IntelliJ IDEA
  • 数据库:MySQL
  • 框架:Spring Boot、MyBatis-Plus
  • 依赖管理:Maven

三、纯粹多库场景模拟

1. 创建数据库及表

首先,我们要创建两个数据库,分别是 mybatis_plus(原库保持不变)和 mybatis_plus_1(新建),并将 mybatis_plus 库的 product 表移到 mybatis_plus_1 库。

sql

-- 创建数据库 mybatis_plus_1
CREATE DATABASE `mybatis_plus_1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `mybatis_plus_1`;-- 创建 product 表
CREATE TABLE product
(id      BIGINT(20) NOT NULL COMMENT '主键 ID',name    VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称 ',price   INT(11) DEFAULT 0 COMMENT '价格 ',version INT(11) DEFAULT 0 COMMENT '乐观锁版本号 ',PRIMARY KEY (id)
);-- 添加测试数据
INSERT INTO product (id, NAME, price) VALUES (1, '外星人笔记本 ', 100);-- 删除 mybatis_plus 库中的 product 表
-- 请先连接到 mybatis_plus 数据库
USE mybatis_plus;
DROP TABLE IF EXISTS product;

2. 引入依赖

在 pom.xml 中添加 dynamic-datasource-spring-boot-starter 依赖:

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

3. 配置多数据源

在 application.yml 中配置多数据源:

yaml

spring:# 配置数据源信息datasource:dynamic:# 设置默认的数据源或者数据源组 ,默认值即为 masterprimary: master# 严格匹配数据源 ,默认 false.true 未匹配到指定数据源时抛异常 ,false 使用默认数据源strict: falsedatasource:master:url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=falsedriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456slave_1:url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&useSSL=falsedriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456

4. 创建用户 Service

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;// 指定所操作的数据源
@DS("master") 
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

5. 创建商品 Service

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;@DS("slave_1")
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
}

6. 测试

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class DynamicDataSourceTest {@Autowiredprivate UserService userService;@Autowiredprivate ProductService productService;@Testpublic void testDynamicDataSource() {System.out.println(userService.getById(1L));System.out.println(productService.getById(1L));}
}

如果测试时能顺利获取到用户对象和商品对象,那就表明多库模拟成功。

四、读写分离思路

如果要实现读写分离,可把写操作方法加上主库数据源,读操作方法加上从库数据源,这样就能自动切换。

示例代码

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {// 写操作使用主库@DS("master")@Overridepublic boolean save(User user) {return super.save(user);}// 读操作使用从库@DS("slave_1")@Overridepublic User getById(Serializable id) {return super.getById(id);}
}

相关文章:

MyBatis-Plus 多数据源配置与读写分离实战

一、引言 在实际的项目开发中&#xff0c;我们常常会遇到需要操作多个数据库的情况&#xff0c;比如纯粹多库、读写分离、一主多从、混合模式等。本文将详细介绍如何使用 MyBatis-Plus 实现纯粹多库的场景&#xff0c;并探讨读写分离的实现思路。 二、环境准备 开发工具&…...

pip install cryptacular卡住,卡在downloading阶段

笔者安装pip install cryptacular卡在downloading阶段&#xff0c;但不知道为何 Collecting cryptacularCreated temporary directory: /tmp/pip-unpack-qfbl8f08http://10.170.22.41:8082 "GET http://repo.huaweicloud.com/repository/pypi/packages/42/69/34d478310d6…...

Baklib解析企业内容管理与内容中台核心差异

企业内容管理技术架构解析 在企业数字化进程中&#xff0c;企业内容管理系统&#xff08;ECM&#xff09;以结构化技术框架为核心&#xff0c;通过文档全生命周期管理与元数据控制实现内容资产的高效治理。其架构通常包含分布式存储引擎、多层级权限体系及标准化工作流模块&am…...

力扣每日一题:2716——最小化字符串长度

2716——最小化字符串长度 题目示例示例 1示例 2示例 3 题解理解 题目 给你一个下标从 0 开始的字符串 s &#xff0c;重复执行下述操作任意次&#xff1a; 在字符串中选出一个下标i &#xff0c;并使 c 为字符串下标i处的字符。并在 i 左侧&#xff08;如果有&#xff09;和…...

掌握正则表达式:从基础到实用示例

目录 一、简单谈谈正则 二、基础知识学习 &#xff08;一&#xff09;正则元字符 1.特殊单字符 2.空白符 3.量词 4.范围备和选项 综合练习 &#xff08;二&#xff09;贪婪、非贪婪与独占模式 1.贪婪模式 2.非贪婪模式&#xff08;懒惰模式&#xff09; 3.独占模式…...

Python 中列表(List)、元组(Tuple)、集合(Set)和字典(Dict)四大数据结构的完整对比

以下是 Python 中列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;、集合&#xff08;Set&#xff09;和字典&#xff08;Dict&#xff09;四大数据结构的完整对比分析&#xff0c;结合了核心特性、操作方式和应用场景的深度总结&#xff1a; 一、核心特性…...

LK光流和特征点的关系

uv方程 光流有两个假设&#xff1a; 1.亮度恒定&#xff0c;即图像相同位置的灰度短时不变。两帧中对应像素灰度/亮度相同 2.时间持续性&#xff08;微小移动&#xff09;&#xff0c;这意味着时间的变化不会引起像素位置的剧烈变化&#xff0c;这样像素的灰度值才能对位置求…...

Rocky Linux 9.5中完美迁移mysql5.6.17到mysql5.7.11

首先Rocky Linux 9.5中&#xff0c;默认官方建议使用的是mysql8.0&#xff0c;项目要兼容以往数据&#xff0c;经过测试跟mysql5.7.11能做兼容。 一&#xff1a;工具准备以及安装步骤 1、官网下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 下载版本…...

练习题:113

目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 定义列表&#xff1a; for 循环遍历列表&#xff1a; 输出元素&#xff1a; 运行思路 结束语 Python题目 题目 使用for循环遍历一个列表并输出每个元素。 题目分析 需求理…...

文件上传存储安全OSS 对象分站解析安全解码还原目录执行

# 文件 - 解析方案 - 执行权限 & 解码还原 1 、执行权限 文件上传后存储目录不给执行权限 2 、解码还原 数据做存储&#xff0c;解析固定(固定协议&#xff09;&#xff08;文件后缀名无关&#xff09; 文件上传后利用编码传输解码还原 # 文件 - 存储方案 - 分站存储…...

NUUO摄像头debugging_center_utils命令执行漏洞

免责声明&#xff1a;本号提供的网络安全信息仅供参考&#xff0c;不构成专业建议。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权&#xff0c;请及时与我联系&#xff0c;我将尽快处理并删除相关内容。 漏洞描述 NUUO NVR是中国台湾省NUUO公司旗…...

华为OD机试2025A卷 - 正则表达式替换(Java Python JS C++ C )

最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 为了便于业务互交,约定一个对输入的字符串中的下划线做统一替换。 具体要求如下: 输入字符串,将其中包含的每一个下划线“_”,使用特殊字符串(^|$|[,+])替换,并输出替换后的结果…...

2025-3-30算法打卡

一&#xff0c;小明的彩灯 1.题目描述&#xff1a; 题目描述 小明拥有 NN 个彩灯&#xff0c;第 ii 个彩灯的初始亮度为 aiai​。 小明将进行 QQ 次操作&#xff0c;每次操作可选择一段区间&#xff0c;并使区间内彩灯的亮度 xx&#xff08;xx 可能为负数&#xff09;。 求…...

【今日半导体行业分析】2025年3月30日

今日探针卡行业分析&#xff1a;把握机遇&#xff0c;应对挑战 一、引言 在半导体产业的精密制造流程中&#xff0c;探针卡作为晶圆测试环节的核心设备&#xff0c;犹如一颗精密的 “心脏”&#xff0c;承担着芯片封装前电学性能测试与筛选的重任。其性能的优劣直接关系到芯片…...

深度学习Note.5(机器学习2)

多项式回归 1.与线性回归联系&#xff1a; 与线性回归大体相似&#xff0c;代码部分复用性高&#xff0c;不同点&#xff1a;公式中为x的次方&#xff0c;可能要规范化处理。 2.paddle的API paddle.sin(x, nameNone) 功能&#xff1a;计算输入的正弦值。 输入&#xff1a;输入…...

三、分类模块,通用组件顶部导航栏Navbar

1.封装通用组件顶部导航栏Navbar 不同效果 Component export struct MkNavbar {Prop title: string Prop leftIcon: ResourceStr $r("app.media.ic_public_left")ProprightIcon: ResourceStr $r("app.media.ic_public_more")PropshowLeftIcon: boolean…...

PipeWire 音频设计与实现分析三——日志子系统

日志子系统 PipeWire 的日志子系统的设计分为多个层次。PipeWire 用 struct spa_log 对象描述日志组件&#xff0c;用 struct spa_log_methods 对象描述日志组件打印各层级日志的多个方法。PipeWire 为日志子系统添加了 topic 机制&#xff0c;不同文件中的日志按功能以不同的…...

playwright解决重复登录问题,通过pytest夹具自动读取storage_state用户状态信息

playwright解决重复登录问题&#xff0c;通过pytest夹具自动读取storage_state用户状态信息 conftest.py文件下封装两个夹具夹具一&#xff1a;将storage_state登录状态导出为json文件夹具二&#xff1a;重写夹具browser_context_args&#xff0c;添加storage_state登录状态登录…...

Codeforces Round 1014 (Div. 2)(A-D)

题目链接&#xff1a;Dashboard - Codeforces Round 1014 (Div. 2) - Codeforces A. Kamilka and the Sheep 思路 最大值-最小值 代码 void solve(){int n;cin>>n;vi a(n10);int mx0;int miinf;for(int i1;i<n;i){cin>>a[i];mimin(mi,a[i]);mxmax(mx,a[i])…...

vulhub靶场—— Tomcat8

目录 一、漏洞描述 二、靶场搭建 三、漏洞复现 1、弱密码 2、文件上传 一、漏洞描述 环境描述&#xff1a; Tomcat 支持后台部署 war 文件&#xff0c;可以直接将 webshell 部署到 web 目录下。tomcat 默认的管理页面 manager 使用 basic 认证用户名和密码登录&#xff0…...

c# ftp上传下载 帮助类

工作中FTP的上传和下载还是很常用的。如下载打标数据,上传打标结果等。 这个类常用方法都有了:上传,下载,判断文件夹是否存在,创建文件夹,获取当前目录下文件列表(不包括文件夹) ,获取当前目录下文件列表(不包括文件夹) ,获取FTP文件列表(包括文件夹), 获取当前目…...

Redis 哈希表结构详解

Redis 哈希表结构详解 相关链接 redis中 hashtable的 sizemask理解 一、核心结构体定义与作用 Redis 的哈希表实现基于 链表法解决冲突&#xff0c;并采用 渐进式 rehash 策略。其核心结构体包括 dictEntry、dictht 和 dict&#xff0c;三者协作实现高效的键值对存储。 二、结…...

接口等幂处理

介绍 ✅ 什么是等幂&#xff08;Idempotency&#xff09;&#xff1f; 等幂 无论这个操作被执行多少次&#xff0c;结果都是一样的&#xff0c;不会因为多次执行而产生副作用。 通俗一点说&#xff1a;“点一次和点一百次&#xff0c;效果是一样的。” ✅ 在接口中&#xff0…...

华为配置篇-BGP实验

BGP 一、简述二、常用命令总结三、实验 一、简述 二、常用命令总结 display bgp peer #查看 BGP 对等体 display bgp routing-table #查看 BGP 路由表#在R1上通过 network 命令发布路由 [R1]bgp 64513 [R1-bgp] network 10.1.1.1 24#在R2上将路由的下一跳地址修改为自身 [R2]…...

【Tauri2】008——简单说说配置文件

前言 配置文件&#xff0c;即tauri.conf.json Configuration Files | Taurihttps://tauri.app/zh-cn/develop/configuration-files/这个文件的作用 该文件由 Tauri 运行时和 Tauri CLI 使用。你可以定义构建设置&#xff08;例如在 tauri build 或 tauri dev 启动前运行的命令…...

Java学习笔记1——编程基础

一、整数类型变量 注意&#xff1a;每个字符型常量占两个字节 二、自动类型转换和强制类型转换 ​​​三、算术运算符 四、赋值运算符 五、比较运算符 六、逻辑运算符 七、运算符的优先级 运算符的优先级可以通过以下口诀来记忆&#xff1a; 括号优先&#xff0c;单目次之&am…...

CMD/DOS和批处理入门知识汇总

0、前言&#xff1a; 在工作中&#xff0c;有时候需要涉及到window系统更底层的一些东西&#xff0c;所以需要学习一些cmd指令和dos命令&#xff0c;来完成高效批处理任务&#xff0c;或者自动化办公。还有想要对系统中文件管理有更细致的认识&#xff0c;便于请理磁盘文件。后…...

Visual Studio 2019 Qt QML 项目环境搭建常见问题处理方法

在 Visual Studio 2019 运行 Qt/QML 项目比直接使用QtCreator环境麻烦&#xff0c;主要是有qmake 的一些配置项不能在 Visual Studio中设置。下面整理一些常见问题的处理方法&#xff0c;供参考&#xff1a; 搭建VS Qt 环境&#xff0c;在Visual Studios 2019下面安装 Qt Vis…...

Python-Django入手

18.1 建立项目 18.1.1 制定规范 - 定义项目目标&#xff1a;明确应用的核心功能 - 创建项目文档&#xff1a;用README.md记录技术栈和开发流程 - 规划目录结构&#xff1a;建议遵循Django官方推荐的项目布局 18.1.2 建立虚拟环境 在命令行执行&#xff1a; python -m ven…...

SakuraCat(2)Endpoint

Endpoint 功能概述 监听指定端口&#xff08;默认是 8080&#xff09;的客户端连接。接受客户端连接后&#xff0c;为每个连接创建一个新的线程进行处理。使用 Processor 类来处理客户端的请求和响应。 package com.SakuraCat.connector.protocolHandler;import com.SakuraC…...

19914 最小生成树2

19914 最小生成树2 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;最小生成树 &#x1f4d6; &#x1f4da; import java.util.*;public class Main {static class Edge{int u,v,w;Edge(int u,int v,int w){this.u u;this.v v;this.w w;}}static ArrayList<…...

SSE服务器主动推送至浏览器客户端,让你不再需要websocket

Server-Sent Events&#xff08;SSE&#xff09;是一种服务器向客户端推送实时更新的技术&#xff0c;基于HTTP协议。客户端通过EventSource API来接收事件流&#xff0c;而服务器则保持一个长连接&#xff0c;持续发送数据。这与传统的请求-响应模式不同&#xff0c;允许服务器…...

C++中的搜索算法实现

C中的搜索算法实现 在编程中&#xff0c;搜索算法是解决各种问题的基础工具之一。C作为一种功能强大的编程语言&#xff0c;提供了多种实现搜索算法的方式。本文将详细介绍两种常见的搜索算法&#xff1a;线性搜索和二分搜索&#xff0c;并通过代码示例展示它们的实现。 一、…...

OSI 七层模型和四层模型(TCP/IP 模型)

文章目录 前言一、OSI 七层模型二、TCP/IP 四层模型三、运行协议及设备1. OSI 七层模型2. TCP/IP 四层模型3. 运行协议4. 各类设备的作用 总结 前言 OSI 七层模型和四层模型&#xff08;TCP/IP 模型&#xff09;是两种常见的网络协议分层架构&#xff0c;它们的主要区别如下&a…...

将代理连接到 Elasticsearch 使用模型上下文协议

作者&#xff1a;来自 Elastic Jedr Blaszyk 及 Joe McElroy 让我们使用 Model Context Protocol 服务器 与 你的 数据 在 Elasticsearch 中聊天。 如果与你的数据交互像与同事聊天一样轻松&#xff0c;会怎样&#xff1f;想象一下&#xff0c;你只需简单地问&#xff1a;“显…...

前端调试实践与案例场景

前端调试实践与案例场景 前端开发中&#xff0c;调试是一项必不可少的技能。以下是一些常见的前端调试实践和相应的案例场景&#xff1a; 1. 浏览器开发者工具 案例场景&#xff1a;布局问题 用户报告在移动设备上页面布局错乱。使用 Chrome DevTools 的设备模拟功能和 Ele…...

安卓的布局方式

一、RelativeLayout 相对布局 特点&#xff1a;每个组件相对其他的某一个组件进行定位。 (一)主要属性 1、设置和父组件的对齐&#xff1a; alignParentTop &#xff1a; 设置为true&#xff0c;代表和父布局顶部对齐。 其他对齐只需要改变后面的Top为 Left、Right 或者Bottom&…...

计算机网络面经(一)

以下为个人总结&#xff0c;图源大部分会来自网络和JavaGuide 网络分层模型 OSI七层模型 各层的常见协议 应用层 用户接口 HTTP, FTP, SMTP, DNS表示层 数据格式转换 SSL/TLS, JSON, JPEG会话层 会话管理 NetBIOS, RPC, SSH传输层 端到端通信 TCP, UDP, QUIC网络层 路由寻址…...

k8s日志管理

k8s日志管理 k8s查看日志查看集群中不是完全运行状态的pod查看deployment日志查看service日志进入pod的容器内查看日志 管理k8s组件日志kubectl logs查看日志原理 管理k8s应用日志收集k8s日志思路收集标准输出收集容器中日志文件 k8s查看节点状态失败k8s部署prometheus监控 k8s…...

Netty源码—10.Netty工具之时间轮二

大纲 1.什么是时间轮 2.HashedWheelTimer是什么 3.HashedWheelTimer的使用 4.HashedWheelTimer的运行流程 5.HashedWheelTimer的核心字段 6.HashedWheelTimer的构造方法 7.HashedWheelTimer添加任务和执行任务 8.HashedWheelTimer的完整源码 9.HashedWheelTimer的总结…...

Baklib激活企业知识管理新动能

Baklib核心技术架构解析 Baklib的底层架构以模块化设计为核心&#xff0c;融合知识中台的核心理念&#xff0c;通过分布式存储引擎与智能语义分析系统构建三层技术体系。数据层采用多源异构数据接入协议&#xff0c;支持文档、音视频、代码片段等非结构化数据的实时解析与分类…...

CSP-J/S冲奖第21天:插入排序

一、插入排序概念 1.1 生活中的类比 • 扑克牌排序&#xff1a;就像整理手中的扑克牌&#xff0c;每次将一张牌插入到已排好序的牌中合适位置 • 动态演示&#xff1a; 初始序列&#xff1a;[5, 2, 4, 6, 1, 3] 排序过程&#xff1a; → [2, 5, 4, 6, 1, 3] → [2, 4, 5, 6, …...

Jest系列二之基础实践

Jest基础实践 官方文档地址&#xff1a;https://jest.nodejs.cn/docs 生命周期 在 Jest 中&#xff0c;生命周期方法大致分为两类&#xff1a;下面所罗列的生命周期方法&#xff0c;也是全局方法&#xff0c;不需要引入&#xff0c;直接就可以使用。 重复性的生命周期方法&…...

Scikit-learn全攻略:从入门到工业级应用

Scikit-learn全攻略:从入门到工业级应用 引言:Scikit-learn在机器学习生态系统中的核心地位 Scikit-learn作为Python最受欢迎的机器学习库,已成为数据科学家的标准工具集。根据2023年Kaggle调查报告,超过83%的数据专业人士在日常工作中使用Scikit-learn。本文将系统性地介…...

基于Python的图书馆信息管理系统研发

标题:基于Python的图书馆信息管理系统研发 内容:1.摘要 在数字化信息快速发展的背景下&#xff0c;传统图书馆管理方式效率低下&#xff0c;难以满足日益增长的信息管理需求。本研究旨在研发一款基于Python的图书馆信息管理系统&#xff0c;以提高图书馆信息管理的效率和准确性…...

Pytorch学习笔记(十七)Image and Video - Adversarial Example Generation

这篇博客瞄准的是 pytorch 官方教程中 Image and Video 章节的 Adversarial Example Generation 部分。 官网链接&#xff1a;https://pytorch.org/tutorials/beginner/fgsm_tutorial.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m 提取码: …...

基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法

基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法 已经弃用的版本&#xff08;Version 10.3-2021.10&#xff09;&#xff1a;gcc-arm-none-eabi&#xff1a;https://developer.arm.com/downloads/-/gnu-rmArm GNU Toolchain当前版本&#xff1a;https://developer.a…...

Ubuntu系统Docker安装失败

问题&#xff1a; 1. 删除错误的 Docker 源 sudo rm -rf /etc/apt/sources.list.d/docker.list sudo rm -rf /etc/apt/keyrings/docker.gpg 2. 重新添加 Docker 官方 GPG 密钥 ​ sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | …...

鸿蒙学习手册(HarmonyOSNext_API16)_数据持久化②:键值型数据库

概述 键值型数据库就像一个大抽屉柜&#xff0c;每个抽屉都有一个唯一的标签&#xff08;键&#xff09;&#xff0c;里面可以放任何东西&#xff08;值&#xff09;。当你需要存或取东西时&#xff0c;直接看标签拿对应的抽屉就行&#xff0c;不用管其他抽屉里有什么。这种简…...

多线程 - 线程安全 2 -- > 死锁问题

目录 小结复习&#xff1a; 线程安全&#xff1a; 如何解决线程安全问题&#xff1f; synchronized “死锁” 死锁的三种经典场景&#xff1a; 1. 一个线程&#xff0c;一把锁。 2.两个线程&#xff0c;两把锁。 3. N 个线程 M 把锁 完&#xff01; 小结复习&#xff1a…...