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. PO、VO、BO、DTO、POJO、DAO、DO

    DO: domain object持久对象就是从现实世界中抽象出来的有形或无形的业务实体. PO:persistant object持久对象最形象的理解就是一个PO就是数据库中的一条记录.好处是可以把 ...

  2. javaweb上传图片存到本地,并存储地址到数据库

    前端使用layui的图片上传,将文件base64编码,然后在后端使用转码类来操作base64编码,并保存图片到本地,继而获取文件地址,将文件地址保存到数据库中 1.使用layui的图片上传 infos ...

  3. Linux相关知识备忘(随时更新)

    1.dpkg Debian Packager,Debian包管理器.可以方便的对软件进行安装更新和移除. (1)安装 dpkg -i xx.deb (2)卸载,但不删除配置文件 dpkg -r xx ...

  4. Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置”

    1. Spring MVC 中的拦截器的使用"拦截器基本配置" 和 "拦截器高级配置" @ 目录 1. Spring MVC 中的拦截器的使用"拦截器 ...

  5. 基于Java“花鸣”B2C电子商务平台设计实现(源码+lw+部署文档+讲解等)

    \n文末获取源码联系 感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 系统介绍: 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件 ...

  6. vue codemirro 文件对比 sql编辑器

    效果图: 安装及引用同上一篇文章,请移步:https://www.cnblogs.com/Lu-Lu/p/16265815.html HTML: <el-dialog class="d ...

  7. 带你学习通过GitHub Actions如何快速构建和部署你自己的项目,打造一条属于自己的流水线

    本文主要讲解通过github的actions来对我们项目进行ci/cd 一.actions简介 GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台,可用于自动执行生成.测试和 ...

  8. 【DataBase】MySQL 27 函数

    一.概述 函数 Function,存储过程的用途一致,减少程序逻辑,和数据库服务的连接次数,提高效率 简化操作,提高SQL重用性 函数 和 存储过程的区别? 存储过程允许多个返回的数据,函数只允许一个 ...

  9. 【MacOS】VMware安装10.15-Catalina版本

    参考自: https://www.bilibili.com/video/BV1sf4y1D77A?p=4 资源地址: https://pan.baidu.com/s/1U6WOorb_TuORQ9ab ...

  10. python运行报警告:Cython directive 'language_level' not set, using '3str' for now (Py3)

    相关: https://stackoverflow.com/questions/34603628/how-to-specify-python-3-source-in-cythons-setup-py ...