SpringBoot多数据源基于mybatis插件(三)

news2024/11/27 8:39:04

SpringBoot多数据源基于mybatis插件(三)

  • 1.主要思路
  • 2.具体实现

1.主要思路

MyBatis的插件机制允许你在MyBatis的四大对象(Executor、StatementHandler、ParameterHandler和ResultSetHandler)的方法执行前后进行拦截,并可以在方法执行前后插入自定义逻辑。

这里其实就是利用Exector对象执行多数据操作,通过判断操作的类型来动态选择数据源。

在这里插入图片描述

2.具体实现

以下是一个Springboot整合mybatis的案例:

在这里插入图片描述yml文件配置:

spring:
  datasource:
    datasource1:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/test_master
      username: root
      password: root
      druid:
         initial-size: 1
         min-idle: 1
         max-active: 20
         test-on-borrow: true

    datasource2:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/test_slave
      username: root
      password: root
      druid:
        initial-size: 1
        min-idle: 1
        max-active: 20
        test-on-borrow: true


mybatis:
  type-aliases-package: com.rql.entity
  mapper-locations: classpath:mybatis/*.xml

DataSourceConfig.java
@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.datasource1")
    public DataSource dataSource1(){
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.datasource2")
    public DataSource dataSource2(){
        return DataSourceBuilder.create().build();
    }

    @Bean
    public Interceptor DynamicDataSourcePlugin(){
        return new DynamicDataSourcePlugin();
    }
}

DynamicDataSourcePlugin.java
@Intercepts({@Signature(type = Executor.class,method = "update",args = {MappedStatement.class,Object.class}),
        @Signature(type = Executor.class,method = "query",args = {MappedStatement.class,Object.class, RowBounds.class,
                ResultHandler.class})})
public class DynamicDataSourcePlugin implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //拿到当前方法【update、query】的所有参数
        Object[] objects = invocation.getArgs();
        //MappedStatement 封装sql
        MappedStatement ms = (MappedStatement) objects[0];
        //读方法
        if (ms.getSqlCommandType().equals(SqlCommandType.SELECT)) {

            DynamicDataSource.name.set("r");
        } else {//写方法
            DynamicDataSource.name.set("w");
        }
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        if (target instanceof Executor) {
            return Plugin.wrap(target, this);
        } else {
            return target;
        }
    }

    @Override
    public void setProperties(Properties properties) {

    }

}

  • @Intercepts注解:

@Intercepts :注解用于指定该插件要拦截的目标方法和参数。
@Signature :注解用于指定要拦截的接口、方法及其参数类型。在这个例子中,插件拦截了 Executor 接口的 updatequery 方法。

  • intercept方法:

这是插件的核心方法,当被拦截的方法被调用时,这个方法会被执行。
通过 Invocation 对象,可以获取到被拦截方法的参数,并可以执行被拦截的方法。
在这里,根据SQL的类型(读或写),使用 DynamicDataSource.name.set() 方法来设置不同的数据源(假设 DynamicDataSource 这里设置为 “r” 代表读数据源,“w” 代表写数据源)。

DynamicDataSource.java
@Component
@Primary
public class DynamicDataSource extends AbstractRoutingDataSource {

    public static ThreadLocal<String> name=new ThreadLocal<>();

    @Autowired
    DataSource dataSource1;

    @Autowired
    DataSource dataSource2;


    @Override
    protected Object determineCurrentLookupKey() {
        return name.get();
    }

    @Override
    public void afterPropertiesSet() {

        //targetDataSources初始化数据源
        HashMap<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put("w", dataSource1);
        targetDataSources.put("r", dataSource2);
        super.setTargetDataSources(targetDataSources);

        //为defaultTargetDataSource设置默认数据源
        super.setDefaultTargetDataSource(dataSource1);

        super.afterPropertiesSet();
    }
}

同时,需要将DynamicDataSourcePlugin 的Bean注入到Spring容器中

    @Bean
    public Interceptor DynamicDataSourcePlugin(){
        return new DynamicDataSourcePlugin();
    }

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

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

相关文章

考察自动化立体库应注意的几点

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;老K。专注分享智能仓储物流技术、智能制造等内容。 整版PPT和更多学习资料&#xff0c;请球友到知识星球 【智能仓储物流技术研习社】自行下载 考察自动化立体仓库的关键因素&#xff1a; 仓库容量&#x…

linux 中ifconfig 无法使用

1、先看问题 2、搜索 ifconfig 命令&#xff0c;看下该命令在哪 yum search ifconfig 可以看到ifconfig命令在 net-tools.x86_64这个包里。 3、下面开始安装&#xff0c;执行下面的命令 yum install net-tools.x86_64 4、查看是否安装成功 ifconfig 看到上面的ip就说明可以用了…

光网络中的低偏SOA与无源波导单片集成

----翻译自Aref Rasoulzadeh Zali等人2021年撰写的文章 摘要 在光通信系统中&#xff0c;非常需要可以通过简单工艺与无源光路单片集成的低偏振相关半导体光放大器&#xff08;SOA&#xff09;。然而&#xff0c;尽管已经报道了几种SOA&#xff0c;但在InP平台中将偏振无关的体…

ROS学习笔记(12)AEB和TTC的实现

0.前提 在自动驾驶领域有许多关于驾驶安全的措施AEB和TTC就是为了驾驶安全而设计出来的。在这篇文章中我会讲解我对AEB和TTC算法的一些理解。本期ROS学习笔记同时也是ros竞速小车的学习笔记&#xff0c;我会将我的部分代码拿出来进行讲解&#xff0c;让大家更好的理解ttc和aeb…

html接入高德地图

1.申请key key申请地址&#xff1a;https://console.amap.com/dev/key/app 官方文档 https://lbs.amap.com/api/javascript-api-v2/summary 2.html接入示例 需要将YOUR_KEY替换成自己的key <!doctype html> <html> <head><meta charset"utf-…

未来计算机的发展趋势是什么?

未来计算机的发展趋势是多方面的,涵盖了硬件、软件、体系结构以及计算范式等多个层面。以下是一些预期的趋势: 1. 量子计算: 随着量子理论的不断成熟和技术的进步,量子计算机将可能解决传统计算机难以处理的问题,比如药物发现、材料科学、复杂系统模拟等领域。量子计算的…

VMWare Ubuntu压缩虚拟磁盘

VMWare中ubuntu会越用越大&#xff0c;直到占满预分配的空间 即使系统里没有那么多东西 命令清理 开机->open Terminal sudo vmware-toolbox-cmd disk shrink /关机-> 编辑虚拟机设置->硬盘->碎片整理&压缩 磁盘应用 开机->disk usage analyzer(应用) …

Java面试:算法常用面试题汇总

1.说一下什么是二分法&#xff1f;使用二分法时需要注意什么&#xff1f;如何用代码实现&#xff1f; 二分法查找&#xff08;Binary Search&#xff09;也称折半查找&#xff0c;是指当每次查询时&#xff0c;将数据分为前后两部分&#xff0c;再用中值和待搜索的值进行比较&…

格灵深瞳,实现核心能力高强度保护与灵活交付

格灵深瞳&#xff0c;AI领域的领先企业&#xff0c;借助泰雷兹圣天诺技术&#xff0c;实现核心能力高强度保护与灵活交付&#xff0c;引领行业风向&#xff0c;安策信息助力AI行业企业实现产品核心能力保护、销售模式创新以及软件产品的灵活交付。 格灵深瞳&#xff0c;AI领域的…

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(2)——架构分析 - 核心思想环境搭建技术选型

4.架构分析 4.1.核心思想 超越一阶提示&#xff0c;通过增加静态知识库和信息检索方案或简单的总结方案来扩展语言模型。 将这些想法扩展到构建一个代理架构&#xff0c;该架构处理检索&#xff0c;其中过去的经验在每个时步动态更新&#xff0c;并混合与npc当前上下文和计划…

算法与数据结构要点速学——通用 DS/A 流程图

通用 DS/A 流程图 这是一个流程图&#xff0c;可以帮助您确定应该使用哪种数据结构或算法。请注意&#xff0c;此流程图非常笼统&#xff0c;因为不可能涵盖每个场景。 请注意&#xff0c;此流程图仅涵盖 LICC 中教授的方法&#xff0c;因此排除了像 Dijkstra 等更高级的算法。…

ruoyi单体+react+antdesign

基于ruoyi vue和Ruoyi-React实现的快速开发工具。 源码地址&#xff1a;GitHub - hebian1994/ruoyi-react-single: use ruoyi to generage java backend code and reacr front end code 前端&#xff1a;基于ant-design-pro 后端&#xff1a;单体springboot项目(非cloud)mysq…

Windows版PHP7.4.9解压直用(免安装-绿色-项目打包直接使用)

安装版和解压版 区别 安装版: 安装方便&#xff0c;下一步------下一步就OK了&#xff0c;但重装系统更换环境又要重新来一遍&#xff0c;会特别麻烦解压版&#xff08;推荐&#xff09;&#xff1a; 这种方式&#xff08;项目打包特别方便&#xff09;能更深了解mysql的配置&…

基于Springboot+Vue的Java项目-母婴商城系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

上线流程及操作

上节回顾 1 搜索功能-前端&#xff1a;搜索框&#xff0c;搜索结果页面-后端&#xff1a;一种类型课程-APIResponse(actual_courseres.data.get(results),free_course[],light_course[])-搜索&#xff0c;如果数据量很大&#xff0c;直接使用mysql&#xff0c;效率非常低--》E…

【复习笔记】FreeRTOS(六) 队列操作

本文是FreeRTOS复习笔记的第六节&#xff0c;队列操作。 上一篇文章&#xff1a; 【复习笔记】FreeRTOS(五)时间片调度 文章目录 1.队列操作1.1.队列操作过程1.2.队列操作常用的API函数 二、实验设计三、测试例程四、实验效果 1.队列操作 队列是为了任务与任务、任务与中断之间…

LabVIEW供热管道泄漏监测与定位

LabVIEW供热管道泄漏监测与定位 在现代城市的基础设施建设中&#xff0c;供热管道系统起着极其重要的作用。然而&#xff0c;管道泄漏问题不仅导致巨大的经济损失&#xff0c;还对公共安全构成威胁。因此&#xff0c;开发一种高效、准确的管道泄漏监测与定位技术显得尤为关键。…

【复现】MajorDoMo 远程命令执行漏洞_73

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 MajorDoMo是MajorDoMo社区的一个开源DIY智能家居自动化平台。 该漏洞源于文件thumb.php存在命令执行漏洞。 二 .漏洞影响 通过提交…

如何理解Vue 3组件的component关键字

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

个人网站制作 Part 24 添加用户反馈功能[Userback] | Web开发项目添加页面缓存

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加用户反馈功能&#x1f528;使用反馈工具&#x1f527;步骤 1: 选择反馈工具&#x1f527;步骤 2: 注册Userback账户&#x1f527;步骤 3: 获取反馈按钮代码 使用Vue.…