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语句的更多相关文章

  1. 查看oracle数据库最近执行了哪些sql语句

    SELECT b.sql_text, --content of SQL a.machine, --which machine run this code a.username, a.module, - ...

  2. springboot入门系列(四):SpringBoot和Mybatis配置多数据源连接多个数据库

    SpringBoot和Mybatis配置多数据源连接多个数据库 目前业界操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑.在SpringBo ...

  3. springBoot + mybatis实现执行多条sql语句出错解决方法

    在Idea中执行多条sql语句的修改(mybatis默认的是执行sql语句是执行单条,所以要执行多条的时候需要进行配置) 需要在连接字符串中添加上&allowMultiQueries=true ...

  4. MyBatis一次执行多条SQL语句

    MyBatis一次执行多条SQL语句 有个常见的场景:删除用户的时候需要先删除用户的外键关联数据,否则会触发规则报错. 解决办法不外乎有三个:1.多条sql分批执行:2.存储过程或函数调用:3.sql ...

  5. C#实现执行多条SQl语句,实现数据库事务

    C#实现执行多条SQl语句,实现数据库事务 在数据库中使用事务的好处,相信大家都有听过银行存款的交易作为事务的一个例子.事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的 ...

  6. (转载)异构数据库之间完全可以用SQL语句导数据

    <来源网址:http://www.delphifans.com/infoview/Article_398.html>异构数据库之间完全可以用SQL语句导数据 告诉你一个最快的方法,用SQL ...

  7. 执行多条SQL语句,实现数据库事务(不可传入Sql参数)

    执行多条SQL语句,实现数据库事务(不可传入Sql参数) http://blog.csdn.net/hanxuemin12345/article/details/9980371

  8. Oracle数据库查找持有锁的SQL语句,而不是请求锁的SQL语句(原创)

    Oracle数据库查找持有锁的SQL语句,而不是请求锁的SQL语句 查找活动的事务以及活动事务关联的会话信息 select s.sid 会话ID, s.serial# 会话序列号, s.usernam ...

  9. mybatis执行多条sql语句

    1,mybatis执行多条sql语句,有以下几种思路, a,存储过程 b,修改jdbc的参数,允许执行多条语句,如下所示: sqlserver可以直接使用begin,end来执行多条语句, mysql ...

  10. 重新学习MySQL数据库12:从实践sql语句优化开始

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a724888/article/details/79394168 本文不堆叠网上海量的sql优化技巧或 ...

随机推荐

  1. windows下使用dockerdesktop进行部署

    Docker部署springboot项目 环境准备 要在windows上使用docker需要确认系统的需求 需要启用虚拟化支持的CPU 启用适用于windows的Linux子系统功能 保证足够的内存 ...

  2. 记一次使用python的selenium库爬取动态页面内容的经历

    安装与配置selenium 安装selenium库 pip install selenium 配置浏览器驱动(本次使用Google Chrome) 打开Chrome,在浏览器的地址栏,输入chrome ...

  3. 深入解析 Vue Router:构建单页面应用的利器

    Vue.js 是一个渐进式 JavaScript 框架,常用于构建用户界面.随着应用的复杂度增加,路由(Routing)变得越来越重要,这就是 Vue Router 的用武之地.Vue Router ...

  4. 学习笔记--Java方法基础

    Java方法基础 那么什么是方法呢? public class MethodTest01{ public static void main(String[] args){ // 需求1:编写程序计算 ...

  5. Week 0

    Day 0 我8:00与lsh前往济南,在大约11:40左右抵达济南高铁站. 等高铁期间,我在庞大的济南高铁站中找到了我心心念念的而DY却没有的赛百味三明治,买了27的西式火腿三明治和34的香烤牛肉三 ...

  6. 解决cnpm syscall: ‘rename‘

    1.删了cnpm npm uninstall -g cnpm 2.指定版本下载cnpm npm install cnpm@7.1.0 -g

  7. Jmeter二次开发函数 - 文本替换

    此篇文章将在Jmeter创建一个新函数,实现替换文本中的指定内容功能.效果图如下 1.eclipse项目创建步骤此处省略,可参考上一篇Jmeter二次开发函数之入门 2.新建class命名为" ...

  8. 【Java】单号创建服务

    需求:ERP项目存在若干个业务功能,每个业务的单子的单号创建规则需要被统一规划 1.每个业务有自己对应的标识 2.业务单号必须以英文字母为前缀,长度在2 - 4个字符 3.单号的组成 = [ 前缀 ] ...

  9. 【Scala】03 函数

    1.Scala的方法语法: object Hello { def main(args : Array[String]) : Unit = { // scala 允许在方法的声明中再声明方法,并且调用 ...

  10. 【Layui】02 图标 Icon

    官网下载地址: https://www.layui.com/ 学习参考: https://www.bilibili.com/video/BV1ct411n7SN [Layui的文件结构] 我们只需要这 ...