springboot + mybatis 多数据源切换
参考的b站博主写的
配置文件:
spring:datasource:db1:jdbc-url: jdbc:mysql://localhost:3306/interview_database?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: 12345driver-class-name: com.mysql.cj.jdbc.Driverdb2:jdbc-url: jdbc:mysql://localhost:3306/cailu-family-manager?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: 12345driver-class-name: com.mysql.cj.jdbc.Driver
DataSourceChange.java 设定切换数据库的类,使用ThreadLocal
/*** @author HFQ* @version 1.0.0* @ClassName DataSourceChange.java* @Description 数据源切换* @createTime 2024年07月03日 22:56:00*/
public class DataSourceChange {private static final ThreadLocal<String> contextHolder = new ThreadLocal();// 设置默认数据库static {contextHolder.set("db1");}public static void setDB(String dbType){contextHolder.set(dbType);}public static String getDB(){return contextHolder.get();}
}
DynamicDataSource 类设置数据源,继承AbstractRoutingDataSource类基于查找键将getConnection()调用路由到各种目标DataSource之一的抽象DataSource实现。后者通常(但不一定)是通过一些线程绑定的事务上下文来确定的。
/*** @author HFQ* @version 1.0.0* @ClassName DynamicDataSource.java* @Description 设置数据源* @createTime 2024年07月03日 22:51:00*/
public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceChange.getDB();}
}
DataSourceConfig类多数据源配置
/*** @author HFQ* @version 1.0.0* @ClassName DataSourceConfig.java* @Description 多数据源配置* @createTime 2024年07月03日 21:57:00*/
@Configuration
public class DataSourceConfig {/*** @ConfigurationProperties用的反射来做这个功能* @return*/@Bean(name = "db1")@ConfigurationProperties(prefix = "spring.datasource.db1")public DataSource db1(){return DataSourceBuilder.create().build();}@Bean(name = "db2")@ConfigurationProperties(prefix = "spring.datasource.db2")public DataSource db2(){return DataSourceBuilder.create().build();}@Bean(name = "dynamicDataSource")@Primarypublic DataSource dynamicDataSource(@Qualifier("db1")DataSource db1,@Qualifier("db2")DataSource db2){DynamicDataSource dynamicDataSource = new DynamicDataSource();// 设置默认数据源 这个代码有点重复了,因为我们在DataSourceChange类中已经设定了默认数据库dynamicDataSource.setDefaultTargetDataSource(db1);HashMap<Object, Object> objectObjectHashMap = new HashMap<>();objectObjectHashMap.put("db1", db1);objectObjectHashMap.put("db2", db2);dynamicDataSource.setTargetDataSources(objectObjectHashMap);return dynamicDataSource;}@Beanpublic PlatformTransactionManager transactionManager(@Qualifier("dynamicDataSource") DataSource dynamicDataSource){return new DataSourceTransactionManager(dynamicDataSource);}
}
@ConfigurationProperties(prefix = “spring.datasource.db1”)
在Spring Boot中,@ConfigurationProperties注解用于将外部的配置属性(如application.yml或application.properties文件中的属性)映射到一个Java类的字段中。当你创建DataSourceBuilder并调用build方法时,Spring Boot会自动注入这些配置属性(使用的反射完成)。
测试一下
测试代码:
@Testpublic void testDb1(){// tagsMapper使用的是db1的连接,testMapper使用的是db2连接ArrayList<String> strings = new ArrayList<>();strings.add("女性");strings.add("广州");for (Integer tagsByName : tagsMapper.findTagsByNames(strings)) {System.out.println(tagsByName);}// 切换到db2DataSourceChange.setDB("db2");List<Map<String, Object>> maps = testMapper.selectTest();for (Map<String, Object> map : maps) {System.out.println(map.get("account_name").toString());}}
然后, 既然是多数据源,那mapper.xml文件也需要分层
所以我的mapper文件夹是这样的

mapper-locations 使用逗号分隔
yml配置文件:
mybatis:mapper-locations: classpath*:/mapper/db1/*.xml,classpath*:/mapper/db2/*.xml
执行结果:

相关文章:
springboot + mybatis 多数据源切换
参考的b站博主写的 配置文件: spring:datasource:db1:jdbc-url: jdbc:mysql://localhost:3306/interview_database?useUnicodetrue&characterEncodingutf-8&useSSLfalseusername: rootpassword: 12345driver-class-name: com.mysql.cj.jdbc.Driverdb2:jdbc-url: jdbc…...
windows电脑网络重置后wifi列表消失怎么办?
我们的电脑网络偶尔会出现异常,我们通常会下意识选择网络诊断,运行完诊断后一般会让我们选择重置网络,然而,重置后wifi列表突然消失,无法愉快地上网了,找了一圈,都说是更改适配器选项࿰…...
Python + 在线 + 文生音,音转文(中文文本转为英文语音,语音转为中文文本)
开源模型 平台:https://huggingface.co/ars-语言转文本: pipeline("automatic-speech-recognition", model"openai/whisper-large-v3", device0 ) hf: https://huggingface.co/openai/whisper-large-v3 github: https://github.com/openai/wh…...
哏号分治,CF103D - Time to Raid Cowavans
一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 103D - Time to Raid Cowavans 二、解题报告 1、思路分析 想了半天数据结构最终选择根号分治 我们考虑 大于 550 的公差直接暴力 小于550 的公差的所有询问,我们直接计算该公差后缀和…...
基于深度学习的图像背景剔除
在过去几年的机器学习领域,我一直想打造真正的机器学习产品。 几个月前,在参加了精彩的 Fast.AI 深度学习课程后,似乎一切皆有可能,我有机会:深度学习技术的进步使许多以前不可能实现的事情成为可能,而且开…...
Python使用(...)连接字符串
Python 字符串连接的灵活性。 使用括号来组织多行字符串时的自动拼接。 e e var_str g*3connect_str (fa{e}bcvar_strh )print(connect_str) print(type(connect_str)) 运行结果: aebcgggh <class str> 解释: 定义变量: e e:…...
鸿蒙:1.入门
概述 简介 鸿蒙操作系统(HarmonyOS)是华为公司发布的一款智能终端系统,是基于微内核的面向全场景的分布式操作系统。它致力于提供更加安全、高效、低延迟、低功耗的操作体验,可通过技术手段对应用程序和设备进行智能协同…...
【matlab】智能优化算法——求解目标函数
智能优化算法在求解目标函数方面发挥着重要作用,它通过迭代、筛选等方法来寻找目标函数的最优值(极值)。以下是关于智能优化算法求解目标函数的详细介绍: 一、智能优化算法概述 智能优化算法是一种搜索算法,旨在通过…...
不改代码,实现web.config或app.config的连接字符串加密解密
目的:加密字符串,防止明文显示。 好处:不用修改代码,微软自带功能,自动解密。 web.config 参考相关文章: Walkthrough: Encrypting Configuration Information Using Protected Configuration | Microso…...
Python创建MySQL数据库
一、使用Docker部署本地MySQL数据库 docker run --restartalways -p 3307:3306 --name mysql -e MYSOL_ROOT_PASSWORDlms123456 -d mysql:8.0.25 参数解析: 用户名:root 密码:lms123456 端口:3307 二、在Pycharm开发工具中配置连接MySQL数据库 三、安装zdppy_mysql pip inst…...
【C++】unordered系列容器的封装
你很自由 充满了无限可能 这是很棒的事 我衷心祈祷你可以相信自己 无悔地燃烧自己的人生 -- 东野圭吾 《解忧杂货店》 unordered系列的封装 1 unordered_map 和 unordered_set2 改造哈希桶2.1 模版参数2.2 加入迭代器 3 上层封装3.1 unordered_set3.2 unordered_map 4 面…...
matlab 超越椭圆函数图像绘制
matlab 超越椭圆函数图像绘制 超越椭圆函数图像绘制xy交叉项引入斜线负向斜线成分正向斜线成分 x^2 y^2 xy 1 (负向)绘制结果 x^2 y^2 - xy 1 (正向)绘制结果 超越椭圆函数图像绘制 xy交叉项引入斜线 相对于标准圆…...
本地文件同步上传到Gitee远程仓库
1、打开我们的项目所在文件夹 2、在项目文件夹【鼠标右击】弹出菜单,在【鼠标右击】弹出的菜单中,点击【Git Bash Here】,弹出运行窗口(前提条件是已装好git环境) 3、在命令窗口中输入:git init 4、在 Gite…...
RESTful Web 服务详解
RESTful Web 服务是一种基于 Representational State Transfer (REST) 架构风格的 Web 服务,它利用 HTTP 协议来传输数据,支持多种数据格式如 JSON 和 XML。在 Spring 框架中,通过简单配置和注解可以轻松实现 RESTful Web 服务。在本文中&…...
【ARMv8/v9 GIC 系列 5.3 -- 系统寄存器对中断的处理】
请阅读【ARM GICv3/v4 实战学习 】 文章目录 ARMv8/v9系统寄存器对中断的控制Group 0中断的寄存器Group 1中断的寄存器安全状态与中断分组中断处理过程中断确认处理代码中断完成处理代码ARMv8/v9系统寄存器对中断的控制 在ARM GIC 体系结构中,中断分组通过一系列系统寄存器进…...
MUNIK解读ISO26262--系统架构
功能安全之系统阶段-系统架构 我们来浅析下功能安全系统阶段重要话题——“系统架构” 目录概览: 系统架构的作用系统架构类型系统架构层级的相关安全机制梳理 1.系统架构的作用 架构的思维包括抽象思维、分层思维、结构化思维和演化思维。通过将复杂系统分解…...
STM32第十五课:LCD屏幕及应用
文章目录 需求一、LCD显示屏二、全屏图片三、数据显示1.显示欢迎词2.显示温湿度3.显示当前时间 四、需求实现代码 需求 1.在LCD屏上显示一张全屏图片。 2.在LCD屏上显示当前时间,温度,湿度。 一、LCD显示屏 液晶显示器,简称 LCD(Liquid Cry…...
Java--继承
1.继承的本质是对某一批类的抽象,从而实现对世界更好的建模 2.extends的意思是“扩展”,子类是父亲的扩展 3.Java中只有单继承,没有多继承 4.继承关系的两个类,一个为子类(派生类),一个为父类…...
Github与本地仓库建立链接、Git命令(或使用Github桌面应用)
一、Git命令(不嫌麻烦可以使用Github桌面应用) git clone [] cd [] git branch -vv #查看本地对应远程的分支对应关系 git branch -a #查看本地和远程所有分支 git checkout -b [hongyuan] #以当前的本地分支作为基础新建一个【】分支,命名为h…...
c++之旅第十一弹——顺序表
大家好啊,这里是c之旅第十一弹,跟随我的步伐来开始这一篇的学习吧! 如果有知识性错误,欢迎各位指正!!一起加油!! 创作不易,希望大家多多支持哦! 一,数据结构…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
