mybatis springboot多数据源,根据使用的数据库不同,执行不同的sql语句
springboot 多数据源配置就不说了,百度太多的用例,
这里只说下在多数据源下切换执行sql逻辑
1.xml sql嵌套,通过<if>标签来判断,用的是mybatis自己sql动态拼接的逻辑(不推荐,数据源多或者sql大的时候不方便)
2. mybatis 插件接口拦截sql进行替换,该方法不仅可以实现数据源执行sql的切换,还可以实现其他场景,而却sql片段也是独立的
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;
import uz.sinow.datasource.dynamic.DynamicDataSourceConfiguration;
import uz.sinow.datasource.dynamic.ShardingContextHolder; /**
*
* 多数据源sql方言切换拦截器,
* 通过拦截方式替换执行sql来实现sql的切换,databaseId未查到正确的注入方式,这个通过mybatis的MappedStatement对象的
* 替换来实现
* 替换规则,原MappedStatement的id加上‘_’+数据源切库标识
*/
@Component("DynmicDatabaseSql")
@Intercepts({
@Signature(type= Executor.class, method="query", args={MappedStatement.class,Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),
@Signature(type= Executor.class, method="query", args={MappedStatement.class,Object.class,RowBounds.class, ResultHandler.class})
})
public class DynamicMappedStatementChooseInterceptor implements Interceptor { private String base; public DynamicMappedStatementChooseInterceptor(DynamicDataSourceConfiguration dynamicDataSourceConfiguration) {
this.base = dynamicDataSourceConfiguration.getBase();
} @Override
public Object intercept(Invocation invocation) throws Throwable {
//取出当前数据源的DSName
String ds = ShardingContextHolder.getDS();
//如果是基本数据源(未指定表示用的是基本数据源)执行默认的方法对应的sql
if (ds == null || ds.trim().length() == 0 || ds.equals(base))
return invocation.proceed();
//取出当前要执行的sql
Object[] args = invocation.getArgs();
MappedStatement mappedStatement = (MappedStatement) args[0];
//查看是否有要替换的方言,有就替换,没有就还用默认的
Configuration configuration = mappedStatement.getConfiguration();
MappedStatement mappedStatement1 = configuration.getMappedStatement(mappedStatement.getId() + "_" + ds);
if(mappedStatement1!=null)
args[0] = mappedStatement1;
return invocation.proceed();
}
}
<select id="codeType_db" resultType="java.lang.String" >
select 1
</select> <select id="codeType" resultType="java.lang.String">
select 1
</select>
mybatis springboot多数据源,根据使用的数据库不同,执行不同的sql语句的更多相关文章
- 查看oracle数据库最近执行了哪些sql语句
SELECT b.sql_text, --content of SQL a.machine, --which machine run this code a.username, a.module, - ...
- springboot入门系列(四):SpringBoot和Mybatis配置多数据源连接多个数据库
SpringBoot和Mybatis配置多数据源连接多个数据库 目前业界操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑.在SpringBo ...
- springBoot + mybatis实现执行多条sql语句出错解决方法
在Idea中执行多条sql语句的修改(mybatis默认的是执行sql语句是执行单条,所以要执行多条的时候需要进行配置) 需要在连接字符串中添加上&allowMultiQueries=true ...
- MyBatis一次执行多条SQL语句
MyBatis一次执行多条SQL语句 有个常见的场景:删除用户的时候需要先删除用户的外键关联数据,否则会触发规则报错. 解决办法不外乎有三个:1.多条sql分批执行:2.存储过程或函数调用:3.sql ...
- C#实现执行多条SQl语句,实现数据库事务
C#实现执行多条SQl语句,实现数据库事务 在数据库中使用事务的好处,相信大家都有听过银行存款的交易作为事务的一个例子.事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的 ...
- (转载)异构数据库之间完全可以用SQL语句导数据
<来源网址:http://www.delphifans.com/infoview/Article_398.html>异构数据库之间完全可以用SQL语句导数据 告诉你一个最快的方法,用SQL ...
- 执行多条SQL语句,实现数据库事务(不可传入Sql参数)
执行多条SQL语句,实现数据库事务(不可传入Sql参数) http://blog.csdn.net/hanxuemin12345/article/details/9980371
- Oracle数据库查找持有锁的SQL语句,而不是请求锁的SQL语句(原创)
Oracle数据库查找持有锁的SQL语句,而不是请求锁的SQL语句 查找活动的事务以及活动事务关联的会话信息 select s.sid 会话ID, s.serial# 会话序列号, s.usernam ...
- mybatis执行多条sql语句
1,mybatis执行多条sql语句,有以下几种思路, a,存储过程 b,修改jdbc的参数,允许执行多条语句,如下所示: sqlserver可以直接使用begin,end来执行多条语句, mysql ...
- 重新学习MySQL数据库12:从实践sql语句优化开始
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a724888/article/details/79394168 本文不堆叠网上海量的sql优化技巧或 ...
随机推荐
- windows下使用dockerdesktop进行部署
Docker部署springboot项目 环境准备 要在windows上使用docker需要确认系统的需求 需要启用虚拟化支持的CPU 启用适用于windows的Linux子系统功能 保证足够的内存 ...
- 记一次使用python的selenium库爬取动态页面内容的经历
安装与配置selenium 安装selenium库 pip install selenium 配置浏览器驱动(本次使用Google Chrome) 打开Chrome,在浏览器的地址栏,输入chrome ...
- 深入解析 Vue Router:构建单页面应用的利器
Vue.js 是一个渐进式 JavaScript 框架,常用于构建用户界面.随着应用的复杂度增加,路由(Routing)变得越来越重要,这就是 Vue Router 的用武之地.Vue Router ...
- 学习笔记--Java方法基础
Java方法基础 那么什么是方法呢? public class MethodTest01{ public static void main(String[] args){ // 需求1:编写程序计算 ...
- Week 0
Day 0 我8:00与lsh前往济南,在大约11:40左右抵达济南高铁站. 等高铁期间,我在庞大的济南高铁站中找到了我心心念念的而DY却没有的赛百味三明治,买了27的西式火腿三明治和34的香烤牛肉三 ...
- 解决cnpm syscall: ‘rename‘
1.删了cnpm npm uninstall -g cnpm 2.指定版本下载cnpm npm install cnpm@7.1.0 -g
- Jmeter二次开发函数 - 文本替换
此篇文章将在Jmeter创建一个新函数,实现替换文本中的指定内容功能.效果图如下 1.eclipse项目创建步骤此处省略,可参考上一篇Jmeter二次开发函数之入门 2.新建class命名为" ...
- 【Java】单号创建服务
需求:ERP项目存在若干个业务功能,每个业务的单子的单号创建规则需要被统一规划 1.每个业务有自己对应的标识 2.业务单号必须以英文字母为前缀,长度在2 - 4个字符 3.单号的组成 = [ 前缀 ] ...
- 【Scala】03 函数
1.Scala的方法语法: object Hello { def main(args : Array[String]) : Unit = { // scala 允许在方法的声明中再声明方法,并且调用 ...
- 【Layui】02 图标 Icon
官网下载地址: https://www.layui.com/ 学习参考: https://www.bilibili.com/video/BV1ct411n7SN [Layui的文件结构] 我们只需要这 ...