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. 在Winform程序中增加隐藏的按键处理,用于处理一些特殊的界面显示或者系统初始化操作

    以前,我看到一个朋友在对一个系统做初始化的时候,通过一组魔幻般的按键,调出来一个隐藏的系统设置界面,这个界面在常规的菜单或者工具栏是看不到的,因为它是一个后台设置的关键界面,不公开,同时避免常规用户的 ...

  2. 【java深入学习第1章】深入探究 MyBatis-Spring 中 SqlSession 的原理与应用

    前言 在使用 MyBatis 进行持久层开发时,通常会与 Spring 框架集成,以便更好地管理事务和依赖注入.在 MyBatis-Spring 集成中,SqlSession 是一个非常重要的概念.本 ...

  3. Java实现快速快速排序算法

    算法简介 快速排序(Quick Sort) 是由冒泡排序改进而得的.在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序.如果能通过两个(不相邻)记录的一次交换直接 ...

  4. 题解:P10722 [GESP202406 六级] 二叉树

    题意 一颗 \(n\) 节点的二叉树,每个节点非黑即白,给你 \(Q\) 次操作,每次给你一个 \(u\),把 \(u\) 的子树内所有节点颜色反转,问最终每个节点的颜色. 分析 看到数据范围,首先把 ...

  5. ngnix简介和基础

    一.Nginx简介 Nginx 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP代理服务器 是一个模块化软件 [1].安装nginx 使用源码包编译安装 cd /opt ...

  6. Windows10 myeclipse 本地部署javaweb项目

    Windows10 myeclipse 本地部署javaweb项目 一,先在网上寻找相关的项目,自己研究学习之后,进行二次开发 原文地址https://www.cnblogs.com/wydyzcnc ...

  7. 【MySQL】java.sql.SQLException: Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='

    问题原因参考: http://t.zoukankan.com/zhulei2-p-13451554.html collations 排序规则 Illegal mix 非法混合 SQL报错指出,操作符等 ...

  8. 【Java】Enumeration Class 枚举类

    枚举类 enum 对象是有限的确定的.属于类的(静态的) 适合定义一组常量 例如固定的一些事物: - 季节 - 性别 - 状态 自定义枚举类的使用 public class EnumerationTe ...

  9. 【Tutorial C】04 基本输入输出

    输出单个字符 putchar('a'); // 字符输出函数,其功能是在终端(显示器)输出单个字符. putchar('\n'); // 支持转义换行 putchar(77); // 可以直接注入AS ...

  10. 【Dos-BatchPrograming】02

    学习参考: https://www.bilibili.com/video/BV1Qv411q7bN?p=2 --1.算数运算 使用Windows终端进行运算操作时需要声明对应的命令: set /a 运 ...