Mybatis(九)插件原理及应用

news2024/11/20 0:35:02

一、Mybatis的插件实现原理

Mybatis允许用户通过自定义拦截器的方式改变Sql的执行方式,例如在Sql执行时追加Sql分页语法,从而达到减缓分页查询的目的,用户自定义拦截器也被称为Mybatis插件。

我们先从插件的配置及解析过程来分析插件,在Mybatis的主配置文件中,可以通过<plugins>标签注册用户自定义的插件信息,例如:

 mybatis的插件实际上就是一个拦截器,Configuration类中维护了一个interceptorChain实例,代码如下:

 interceptorChain是一个拦截器链,用于存放<plugins>标签注册的所有拦截器,Configuration类中还定义了一个addInterceptor方法,用于向拦截器链中添加拦截器,mybatis框架在应用启动时会对<plugins>标签进行解析,下面是XMLConfigBuilder类的pluginElement方法解析<plugins>标签的过程。

到此我们知道了拦截器的解析以及注入,下面我们看看拦截器是怎么执行的?

用户自定义的插件只能对mybatis的四种组件的方法进行拦截,这四种组件及方法如下:

为什么mybatis插件能够对这四种组件的实例进行拦截?

我们可以从源码中获取答案,前面介绍Configuration组件的作用时,我们了解到Configuration组件有三个作用:

 mybatis使用工厂方法创建这四个组件,其中一个原因是可以根据用户配置的参数创建不同实现类的实例,还有一个就是可以在工厂方法中执行拦截逻辑,我们可以看看这些工厂方法的实现:

可以看出这些工厂方法都调用了InterceptorChain对象的pluginAll方法,该方法会返回对应组件的代理对象,拦截逻辑就是在代理对象中完成的,这就是为什么Mybatis自定义插件只能对这四个组件的方法进行拦截的原因。

好的,我们现在回到拦截链InterceptorChain类本身来,该类的实现如下:

 该interceptorChain类中通过一个List对象维护所以的拦截器实例,在interceptorChain的pluginAll方法里面,会调用所有拦截器实例的plugin方法,调用完后会返回一个代理对象。

Mybatis中所有用户自定义的插件都必须实现Interceptor接口,该接口的定义如下:

为了方便用户创建四个组件的代理对象,mybatis提供了一个Plugin工具类,其关键代码如下:

如上面所示,Plugin类实现了InvocationHandler接口,即采用了JDK内置的动态代理方式创建代理对象,Plugin维护了四个组件的实例、自定义的拦截器实例、拦截方法等。Plugin类的invoke方法会在调用目标对象的方法时被调用, 在invoke方法中首先判断该方法是否被Intercepts注解指定为被拦截的方法,如果是则调用用户自定义的拦截器的intercept方法,并将目标方法等信息封装成Invocation对象作为参数。

Plugin类还提供了一个静态wrap方法,该方法用于简化动态代理对象的创建:

Intercepts注解用于修饰拦截器类,告诉拦截器要对哪些组件的方法进行拦截,下面是使用案例:

上面的例子,就是通过Intercepts注解指定拦截就是指定 拦截Executor组件的query方法、StatementHandler组件的prepare方法。

接下来我们看看如何进行解析@Intercepts注解的,解析方法为getSignatureMap:

我们自定义一个插件时,只需要实现Interceptor接口,在Intercept方法中编写拦截逻辑,然后在plugins方法中返回一个动态代理对象,在setProperties方法设置<plugin>标签中配置的属性,例如下面的例子:

我们基本只需要在Intercept方法中定义拦截逻辑就完成大部分工作。

最后我们再来回顾下Mybatis插件的工作原理,以执行一个查询操作为例:

1、获取动态代理对象

 2、执行拦截逻辑

===========================    自定义插件    ==============================

二、自定义一个分页插件

 三、自定义慢查询sql统计插件 

 

aaaaq

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

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

相关文章

蓝奥声核心技术分享——基于物联网的无线智能标签刷新控制技术

1.技术背景 基于物联网的无线智能标签刷新控制技术指基于对目标场景状态变化的协同感知而获得触发响应并进行智能决策&#xff0c;属于蓝奥声核心技术--边缘协同感知(EICS&#xff09;技术的关键支撑性技术之一。该项技术涉及物联网边缘域的无线通信与智能控制技术领域。 物联…

学习同步异步的概念,并了解MQ消息队列

文章目录 一、 同步和异步1.1 同步调用1.2 异步调用 二、MQ1.1 介绍1.2 MQ的优点和使用场景 一、 同步和异步 1.1 同步调用 同步调用是一种程序调用方式&#xff0c;在该调用方式中&#xff0c;调用者发起一个请求&#xff0c;然后一直等待被调用者返回响应结果后再继续执行。…

wps - 使用宏来为每行标记序号

在WPS中遇到需要加序号的虽然可以用项目符符号来标注# 但或许用宏更厉害一些 WPS 的宏是一种自动化工具&#xff0c;可以通过编写宏代码来自动执行一些操作&#xff0c;例如创建和编辑文档、打印、格式化等。 WPS 宏的编写可以使用 VBA&#xff08;Visual Basic for Applicat…

236. 二叉树的最近公共祖先 ——【Leetcode每日一题】

236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff…

inode和软硬链接

文章目录&#xff1a; 一、理解文件系统1.1 什么是inode1.2 磁盘了解1.2.1磁盘的硬件结构1.2.2 磁盘的分区1.2.3 EXT2文件系统 二、软硬链接2.1 软链接2.2 硬链接 一、理解文件系统 1.1 什么是inode inodes 是文件系统中存储文件元数据的数据结构。每个文件或目录都有一个唯一…

JavaSE学习进阶day06_01 数据结构(进阶)

第一章 数据结构&#xff08;温习数据结构的内容&#xff09; 1.1 树基本结构介绍 树具有的特点&#xff1a; 每一个节点有零个或者多个子节点 没有父节点的节点称之为根节点&#xff0c;一个树最多有一个根节点。 每一个非根节点有且只有一个父节点 名词含义节点指树中的…

第二届“威固新能源 GO野”,威固重塑新能源出行不凡体验

中国&#xff0c;上海&#xff0c;近日——全球特种材料公司伊士曼旗下汽车膜品牌威固&#xff08;V-KOOL&#xff09;&#xff0c;于近日开启了第二届“威固新能源 GO野”不凡之旅&#xff0c;通过专为新能源而来的创新产品与服务&#xff0c;引领高端新能源车主驶出城市生活的…

晨控可视化标签在资产管理上的应用及优势

晨控可视化标签在资产管理上的应用及优势 资产是企业功能的核心组成部分&#xff0c;是企业重要的基础设施建设。资产存在的形式各种各样&#xff0c;不仅具有价值高、流动性强、安全管理困难的特点&#xff0c;而且成为资产管理的重要环境之一。通过射频识别技术&#xff0c;…

【00-Java Web先导课】-如何进行IDEA的安装

前沿 Pycharm与IDEA激活教程一样&#xff0c;本篇以IDEA激活教程为例进行保姆级教学 文章目录 前沿一、支持系统二、软件版本1.引入库 三、软件下载教程1、点击网址进入jetbrains官网2、按照下图选择相应下载的软件3、按照如图选择需要下载的版本4、按照如下方式进行下载软件 四…

Web服务器

目录 什么是Web服务器&#xff1f; Web容器 Servlet Servlet 规范 Servlet 的API结构 编写Servlet servlet生命周期&#xff08;产生到销毁的过程&#xff09; 服务器产生响应信息的两种格式 什么是Web服务器&#xff1f; Web服务器是一个程序&#xff0c;用于接收客户…

【LeetCode: 718. 最长重复子数组 | 暴力递归=>记忆化搜索=>动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Scillus | 来吧!它可以大大简化你的Seurat分析流程哦!~(一)(数据预处理)

1写在前面 太久没更了&#xff0c;真是累到极致&#xff0c;每天回到家都只想睡觉。&#x1f62d; 今天介绍一下Scillus包&#xff0c;是一个基于Seurat和ggplot2的R包&#xff0c;用于增强scRNA-seq数据的处理和可视化。&#x1f9d0; 它可以对Seurat对象进行多种类型的图形展…

多重背包问题的三种解法(转化为01背包、二进制拆分、单调队列优化)

多重背包问题的三种解法 转化为01背包二进制拆分优化单调队列优化 转化为01背包 题目链接:acwing4. 多重背包问题 I 题目描述 数据范围 思路&#xff1a; 可以转化为01背包问题求解&#xff0c;将s个物品都看作单独的一个物品&#xff0c;时间复杂度为 O ( N ∗ V ∗ S ) O(…

【一】MATLAB基础知识

【一】MATLAB基础知识 1 数值数据类型的分类 整型 无符号整数&#xff1a;无符号8位整数、无符号16位整数、无符号32位整数、 无符号64位整数。 带符号整数&#xff1a;带符号8位整数、带符号16位整数、带符号32位整数、 带符号64位整数。 无符号8位整数数据范围&#xff…

树和二叉树(概念及其结构)

1.树概念及结构&#xff08;了解&#xff09;‘ 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它 叫做树是因为它看起来像一颗倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶…

php+vue+mysql校园大学生兼职信息网站系统

商家功能模块 商家通过点击后台管理&#xff0c;进入页面可以进行首页、个人中心、热门兼职管理、兼职接单管理、学生咨询管理、兼职任务管理、完成评价管理等功能模块&#xff0c;进行相对应操作 兼职接单管理&#xff1a;通过兼职接单管理可以进行获取兼职名称、专业、分类、…

佳电股份:智能互联 绿色驱动 拥抱未来

4月 13—15 日&#xff0c;2023年易派客工业品展览会、石油石化工业展览会、第七届中国石油和化工行业采购年会&#xff0c;在苏州国际博览中心举行。在本次展会上&#xff0c;佳电股份展出了超高速永磁电机、超高效高压三相异步电动机、智慧电机以及配套服务等主要产品。 哈尔…

linux 下 mysql 平滑升级,不暴力

只适合版本跨越较小的&#xff0c;如果从5到8这种不支持 查看当前版本5.6.40,升级到5.6.50&#xff08;因为一些漏洞的原因&#xff09; 1&#xff1a;下载需要升级的版本 2&#xff1a;解压 3&#xff1a;停止当前的mysql服务 service mysql stop 4&#xff1a;备份原先系…

Spring Boot的基础使用和< artifactId>spring-boot-maven-plugin</ artifactId>爆红的处理

Spring Boot的基础使用和< artifactId>spring-boot-maven-plugin</ artifactId>爆红的处理 Spring Boot概述 微服务概述 微服务Microservices是一种软件架构风格&#xff0c;他是以专注于单一责任与功能的小型功能区块Small Building Blocks 为基础&#xff0c;…

FL Studio21安装体验试用下载fl水果支持最新中文语言功能

FL Studio是什么&#xff1f;如果你打算将来朝着艺术和音乐方向发展&#xff0c;那么学习音乐理论和音乐制作就是一门基础了。FL Studio 21还提供了几十个内置的音乐和声音样本库&#xff0c;以及多种音频效果处理器和虚拟乐器&#xff0c;包括合成器、鼓机、效果器等。这些插件…