mybatis 之 DatabaseIdProvider 教程

mybatis之DatabaseIdProvider

应用中可能同时涉及到多个数据库,比如MySQL,oracle等等,那么当我们使用mybatis的时候,怎么做到动态切换呢?DatabaseIdProvider 可以帮助我们

public interface DatabaseIdProvider {default void setProperties(Properties p) {}String getDatabaseId(DataSource var1) throws SQLException;
}

mybatis内置了一个实现 VendorDatabaseIdProvider (Vendor:产商),通过数据库产品名称来识别不同的数据库
在这里插入图片描述

当然我们也可以按照自己定义的识别不同的数据库规则来实现DatabaseIdProvider,然后注册到 typeAliasRegistry 中。

spring中使用

mybatis-config配置

 <!-- 配置 environments --><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 数据源具体配置省略 --></dataSource></environment></environments><!-- 配置 DatabaseIdProvider,如果是自定义规则,那么type便是你注册的别名 --><databaseIdProvider type="DB_VENDOR"><property name="MySQL" value="mysql"/><property name="Oracle" value="oracle"/></databaseIdProvider>

mapper文件

<!-- UserMapper.xml 示例 -->
<mapper namespace="com.example.mapping.UserMapper"><select id="selectAllUsers" resultType="User">SELECT * FROM users</select><!-- 仅针对 MySQL 数据库的 SQL --><select id="selectWithMySQLFeature" databaseId="mysql" resultType="User">SELECT * FROM users WHERE last_update > NOW()</select><!-- 仅针对 Oracle 数据库的 SQL --><select id="selectWithOracleFeature" databaseId="oracle" resultType="User">SELECT * FROM users WHERE last_update > SYSDATE</select>
</mapper>

springboot中使用

数据源配置

@Configuration
public class DataSourceConfig {@Bean(name = "mysqlDataSource")@ConfigurationProperties(prefix = "spring.datasource.mysql")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "oracleDataSource")@ConfigurationProperties(prefix = "spring.datasource.oracle")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}.........
}

MyBatis配置

@Configuration
public class MyBatisConfig {@Beanpublic DatabaseIdProvider databaseIdProvider() {// 这里使用 DB_VENDOR 类型的 DatabaseIdProvider,它基于数据库产品的名称来识别//也可以使用自己实现的DatabaseIdProviderreturn new VendorDatabaseIdProvider();}// 配置 MyBatis 的环境和数据源@Beanpublic SqlSessionFactory sqlSessionFactory(DataSource mysqlDataSource, DataSource oracleDataSource, DatabaseIdProvider databaseIdProvider) throws Exception {SqlSessionFactoryBean factory = new SqlSessionFactoryBean();// 设置主数据源factory.setDataSource(mysqlDataSource);// 配置 DatabaseIdProviderProperties props = new Properties();props.setProperty("MySQL", "mysql");props.setProperty("Oracle", "oracle");databaseIdProvider.setProperties(props);factory.setDatabaseIdProvider(databaseIdProvider);// 其他配置,如添加mapper位置等// factory.setMapperLocations(...);return factory.getObject();}
}

然后通过AOP或者ThreadLocal等方式进行数据源识别,比如在mapper上添加注解。当然粒度可以自己选择是类级别还是方法级别

@DS("mysql")
public interface SecondarMapper {// ...
}

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

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

相关文章

取消el-time-picker组件在Sarari浏览器中下拉回弹效果

在项目中用到el-time-picker组件来选择时间&#xff0c; 但是在Safari浏览器中&#xff0c;滑动分钟列表时&#xff0c;会取消时钟的选择&#xff0c;这是因为滑动分钟列表时有一个回弹效果&#xff0c;回弹把时钟的选择给取消掉了&#xff0c;我们现在要做的就是取消滑动时钟时…

谷歌配置邮箱stmp开发

谷歌的stmp开发&#xff0c;需要一个专用密码 首先要打开二部验证 然后再通过这个链接&#xff0c;创建专用密码 https://myaccount.google.com/u/6/apppasswords?gar1 然后拿专用密码去写在代码上&#xff0c;谷歌发邮件&#xff0c;不知道是不是国内还是什么原因&#xff…

Java-开发技巧

1.判断list或者map 用org.apache.commons.collections4包下的 CollectionUtils.isNotEmpty 2.判断字符串 用org.apache.commons.lang3包下的 StringUtils 3.执行分组操作&#xff0c;List<StatusDAO>不会为null情况 Map<LocalDateTime,List<StatusDAO>> …

Centos上部署Node服务和MongoDB

文章目录 1.Centos上安装运行Node服务1. 安装Node.js2.验证Node.js安装3.运行Node.js应用程序4.调试Node.js应用 2.Centos上安装MongoDB3.创建Node服务1.配置初始化文件2.创建index.js文件3.启动服务3.配置公网访问forever的引入pm2的引入 4.应对CORS跨域使用cors中间件手动设置…

深入理解MySQL分区技术

前言&#xff1a; 在数据量不断增长的当今时代&#xff0c;数据库的性能优化变得尤为重要。MySQL作为一款广泛使用的数据库管理系统&#xff0c;提供了多种性能优化手段&#xff0c;其中分区技术是提升大型表处理效率的有效方法之一。通过将数据分散到多个独立的物理子表中&am…

《大道平渊》· 拾叁 —— 失眠?忍不住乱想?不如反其道而行之!

《平渊》 拾叁 "睡觉的时候就是要胡思乱想" 声明&#xff1a;以下内容针对非失眠症人群&#xff0c;如果失眠不是偶尔发生&#xff0c;而是长期存在&#xff0c;以下内容和你无关&#xff0c;请尽早治疗&#xff0c;遵循医嘱。 失眠的本质是什么&#xff1f;心理因素…

C++并发之锁(std::lock_guard,std::unique_lock)

目录 1 概述2 使用实例3 接口使用3.1 lock_guard3.2 adopt_lock3.3 defer_lock3.4 try_to_lock3.5 try_lock3.6 release3.7 lock3.8 call_one1 概述 锁保护是通过使互斥对象始终处于锁定状态来管理互斥对象的对象。。   在构造时,互斥对象被调用线程锁定,在析构时,互斥被解…

Qt实现信号与槽,模拟Qt的信号与槽,观察者模式

运行在VS2022&#xff0c;x86&#xff0c;Debug下 33. Qt信号与槽 实现原理&#xff1a;观察者模式&#xff0c;即当一个对象被修改时&#xff0c;就会自动通知依赖它的对象。应用&#xff1a;对象间的通信。 33.1. Qt实现信号与槽&#xff0c;代码如下。 #include <QOb…

电脑撤回的快捷键是什么?

下面给大家介绍了各种办公应用的撤回以及反向撤回快捷键介绍&#xff0c;在ps、excel中都是可以使用的。 撤回键是ctrl加什么 1、撤销的快捷键是“CtrlZ”&#xff0c;用于取消上一步操作&#xff0c;对与在电脑系统上或软件内的操作均适用。重复按下可以取消多步操作。 2、而…

乡村振兴的法治保障:加强农村法治建设,完善乡村治理体系,提高农民法治素养,为美丽乡村建设提供有力保障

目录 一、引言 二、加强农村法治建设的必要性 &#xff08;一&#xff09;法治是乡村振兴的基石 &#xff08;二&#xff09;法治是乡村治理的保障 &#xff08;三&#xff09;法治是农民权益的守护者 三、完善乡村治理体系的路径 &#xff08;一&#xff09;加强乡村基…

Talk|CVPR‘24 Oral:超越3D - Point Transformer V3中的多模态特征提取新构想

本期为TechBeat人工智能社区第599期线上Talk。 北京时间6月12日(周三)20:00&#xff0c;香港大学博士生—吴虓杨的Talk已经准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “超越3D - Point Transformer V3中的多模态特征提取新构想”&#xff0c;他通过P…

用教育邮箱在官网安装origin2024中文版教程

打开origin官网&#xff0c;点击learning Edition&#xff0c;教育版只能维持六个月&#xff0c;但是过期之后可以在官网更新&#xff0c;能够免费使用六次&#xff0c;也就是三年。 OriginLab - Origin and OriginPro - Data Analysis and Graphing Software 填写学校信息&…

Java应届第一年规划

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;目前工作于上海某电商服务公司…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&…

连接查询-外连接(FULL JOIN)、内连接(JOIN)、自身连接

一、表与表之间存在着某种联系&#xff0c;如果一个查询必须在多个表之间完成&#xff0c;则需要用到连接查询 二、连接查询的SQL查询语句 格式&#xff1a; SELECT A1&#xff0c;A2&#xff0c;...&#xff0c;Am FROM R1&#xff0c;R2&#xff0c;..&#xff0c;Rn WH…

DevExpress WPF中文教程:Grid - 如何完成列和编辑器配置(设计时)?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

NSS题目练习9

[极客大挑战 2020]welcome 界面打开后一片空白&#xff0c;查看题目描述&#xff0c;翻译过来是 1.除了GET请求方法&#xff0c;还有一种常见的请求方法… 2.学习一些关于sha1和array的知识。 3.更仔细地检查phpinfo&#xff0c;你会发现标志在哪里。 补充&#xff1a; sh…

什么是端口转发?路由器如何正确的设置端口转发和范围转发?(外网访问必备设置)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 端口转发 📒🚀 端口转发的应用场景💡 路由器如何设置端口转发(示例)💡 端口范围转发(示例)🎯 范围转发的应用场景🛠️ 设置范围转发📝 范围转发实操示例🎈 注意事项 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 …

pyinstaller打包exe多种失败原因解决方法

pyinstaller打包exe多种失败原因解决方法 目录 pyinstaller打包exe多种失败原因解决方法1、pyinstaller安装有问题1.1 安装pyinstaller1.2 采用anconda的环境启动 2、pyqt5与pyside6冲突2.1 打包生成.spec文件2.2 编辑spec文件 3、打包成功后打不开exe&#xff0c;exe闪退3.1 s…

模拟电子之电子管

如果要实现一个放大器的功能&#xff0c;需要一个固定的放大倍数&#xff08;Gain&#xff09;&#xff0c;这也就是说输出信号应该是跟随输入信号变化而变化&#xff0c;换句话说输出信号应该要受到输入信号的控制。 在电子学中使用的最多的两个物理量就是电压和电流&#xf…

算法设计与分析复习(第5章 回溯法)

7-1 子集和问题 #include<iostream> using namespace std;int n; int c; int final0; //当前元素加到最后一个元素 的总和 int sum0; //已选元素之和 int a[10000]; //原数组 bool b[10000]; //判断元素选不选bool Backtrack(int t){ if(sumc) return true; //已…