【Mybatis/Mybaits-Plus】【插件】插件执行时机

news/2024/11/17 8:32:05/文章来源:https://www.cnblogs.com/kukuxjx/p/18200199

1  前言

我之前看过插件的执行过程:【Mybatis】【插件】Mybatis源码解析-插件机制,主要是通过一个 Executor 的创建以及执行过程串了一下插件,我们这里简单回忆下:

(1)Mybatis 把所有的插件都放进了 InterceptorChain 类里的 interceptors 集合里

(2)插件的两个时机:

  • 入场时机:插件是在创建对象,比如创建出来 Executor实例后,然后执行 InterceptorChain ,判断是否要创建其代理,也就是通过创建其代理对象(JDK代理)进行增强,你有多少个插件就会创建几层代理对象,完成入场
  • 执行时机:代理对象执行的时候会根据当前的方法,执行对应的插件

那么这节我们将看一下 Mybatis 所有的插件类型,并看看他们都是在 Mybatis 的哪个执行过程中可以做到什么样的事情,也就是有个全局的理解,并且也会串一下 Mybatis-Plus 里的插件。

另外本文里提到的 Mybatis 也包含 Mybatis-Plus 哈,我是以集成了 Plus 的服务看的,Plus本身也是在 Mybatis 的基础上套了一层,加了自己的逻辑,实际上都会执行到 Mybatis 的核心的,所以理解是应该偏差不大哈。

2  Mybatis 执行

我们先看一下 Mybatis 运行 SQL 的一个执行过程,然后再看看每个插件类型分别都在执行过程中的哪个阶段进行介入的。

2.1  Mybatis 插件

我们先回忆下插件的类型和方法,MyBatis 允许使用插件来拦截的方法调用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

这些类中方法的细节可以通过查看每个方法的签名来发现,或者直接查看 MyBatis 发行包中的源代码。 如果你想做的不仅仅是监控方法的调用,那么你最好相当了解要重写的方法的行为。 因为在试图修改或重写已有方法的行为时,很可能会破坏 MyBatis 的核心模块。 这些都是更底层的类和方法,所以使用插件的时候要特别当心。

有四种类型的插件,接下来我们就先看一个Mybatis的执行过程,看看这四个插件的时机。

2.2  Mybatis 执行过程

从哪开始呢?还是从 Mapper 接口开始吧,具体 Mapper 是如何一步步注入到 SpringBoot 中的,我们这里不讲,可以看我之前的三篇文章一步一步都详细讲解了,我这里主要画个图来从全局的看一下 Mapper接口的整个执行过程:

图越画越大了= =,红色的五角星表示执行过程中插件拦截器的入口,粉色的五角星表示插件拦截器链对当前对象是否要创建代理的入口,红色是执行时机,粉色是创建实际,创建时机一共四个还有一个执行器的创建我没画,它是在创建 SqlSession时创建的,之前文章有说过就略过了哈。

那么整体的执行过程语言描述下就是:

(1)Mapper 接口,出发点为其代理对象:MybatisMapperProxy ,这个对象本身有 SqlSessionFactory,而它里边又有 Configuration,有了 Configuration 其实就有了 Mybatis 的一切了。

(2)执行到代理的 invoke 方法,首先会用 MybatisMapperMethod 类包装一层,内部有一个重要的 SqlCommand,SqlCommand 在实例化的时候就会根据当前的接口以及方法找它的 MappedStatement,MappedStatement 是 Mybatis 早都初始化并且收集完信息的,有个属性 sqlCommandType 就知道当前 Mapper 要执行的是增删改查的哪一种了。

(3)然后就可以根据 SqlCommandType 来调用对应 SqlSession 的增删改查方法了。

(4)SqlSession 执行其实就是调用内部的 Executor 来执行,Executor 的执行和创建就涉及到插件拦截器的执行。

(5)Executor 执行增删改查的时候,又会创建 StatementHandler,就涉及到 StatementHandler 相关插件的执行。

(6)StatementHandler 的实例化或者构造器里,又会创建 ResultSetHandler 和 ParameterHandler 就涉及到这两者的代理创建。

(7)Statement 里执行前就会涉及 ParameterHandler 插件执行,执行完的结果又会通过 ResultSetHandler 进行处理。

(8)最后返回结果。

 

2.3  Mybatis-Plus 的插件

对于 Mybatis-Plus 里的插件,它有一个核心就是:MybatisPlusInterceptor (大管家),它内部有个自己的集合来装自己的 InnerInterceptor,也就是说对于 Mybatis-Plus 的插件,大家都实现 InnerInterceptor 即可。

// 拦截的类和方法
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}),@Signature(type = StatementHandler.class, method = "getBoundSql", args = {}),@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}),@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),}
)
// Interceptor 就是 Mybatis 的接口
public class MybatisPlusInterceptor implements Interceptor {@Setterprivate List<InnerInterceptor> interceptors = new ArrayList<>();..@Overridepublic Object intercept(Invocation invocation) throws Throwable {Object target = invocation.getTarget();Object[] args = invocation.getArgs();if (target instanceof Executor) {...}...@Overridepublic Object plugin(Object target) {// Executor 和 StatementHandler 类型时才创建if (target instanceof Executor || target instanceof StatementHandler) {return Plugin.wrap(target, this);}return target;}
}    

MyBatis-Plus 提供了以下插件:

  • 自动分页PaginationInnerInterceptor
  • 多租户TenantLineInnerInterceptor
  • 动态表名DynamicTableNameInnerInterceptor
  • 乐观锁OptimisticLockerInnerInterceptor
  • SQL 性能规范IllegalSQLInnerInterceptor
  • 防止全表更新与删除BlockAttackInnerInterceptor

当需要用到哪个时候,只需要把它放进 MybatisPlusInterceptor 即可。

3  小结

好啦,本节主要是对 Mybatis 里的插件结合 Mapper 的执行过程,有个整体的认识,有理解不对的地方欢迎指正哈。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件设计原则—开闭原则

对扩展开放,对修改关闭,使用接口或抽象类实现在程序需要进行拓展的时候,不能去修改原有的代码,而是实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。 想要达到这样的效果,我们需要使用接口和抽象类。 因为抽象灵活性好,适应性广,只要抽象的合理…

【开源】2024最新python豆瓣电影数据爬虫+可视化分析项目

项目介绍 【开源】项目基于python+pandas+flask+mysql等技术实现豆瓣电影数据获取及可视化分析展示,觉得有用的朋友可以来个一键三连,感谢!!! 项目演示 [video(video-C9B87WwE-1716106102936)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=120451806…

何恺明介绍

何恺明(Kaiming He),1984年出生于广东广州,人工智能科学家,麻省理工学院电气工程与计算机科学系副教授。 何恺明2003年高中毕业于广州市执信中学,为当年广东省高考满分状元。2003-2007年就读于清华大学物理系基础科学班,连续3年获得清华奖学金,本科毕业后进入香港中文…

【每周例题】力扣 C++ 一年中的第几天

一年中的第几天 题目 一年中的第几天 思路分析 1.substr函数分割字符串,stoi函数将字符串转为十进制 stoi函数介绍 substr函数介绍 2.判断是否为闰年,如果是闰年,则二月的天数+1 代码#include<bits/stdc++.h> using namespace std;int main() {int months[13] = { 0,3…

题目:SHMIP The subglacial hydrology model intercomparison Project

SHMIP(冰下水文模型比较计划)是一个致力于解决冰下水文多种理论方法问题的项目。该计划通过构建一系列综合模拟实验,并对运行这些模拟的各参与模型的结果进行比较,以达到其目标。这将有助于潜在的模型用户更加明智地为特定应用选择合适的模型。同时,对于模型开发人员来说,…

Xpath使用教程

一、安装Xpath解析库-scrapy中的selector win+r打开cmd,输入pip install wheel,先安装wheel库了才能安装.whl文件。安装lxml库 到https://pypi.org/project/lxml/#files下载对应python版本的lxml库 切到lxml下载位置,安装lxml安装Twisted库 到https://pypi.org/project/Twi…

JEEVMS仓库管理系统任意文件读取漏洞

漏洞描述 该漏洞由于系统未能正确实施或执行对文件的访问控制权限控制,允许未经授权的用户访问或读取文件,并且应用程序未能对用户输入进行适当验证,攻击者可以构造特殊的输入,如路径遍历攻击读取系统文件内容,导致信息泄露 Fofa: body="plug-in/lhgDialog/lhgdialog…

vulnhub--JIS靶场

环境搭建 kali(攻击机,NAT):192.168.96.4 靶机(linux,NAT):ip未知 信息收集 主机探测 netdiscover -i 监听网卡发现96网段存活主机,猜测是96.5为靶机地址 端口扫描 nmap -sS -v 192.168.96.5(高校快速的扫描,TCP半链接扫描) nmap -A 192.168.96.5(全面扫描,更全面)…

rthread学习记录汇总-不断更新

1、rthread 同Linux类似,包含了所有主流的芯片、cpu架构,可从官方获取最新的rt-thread源码后进行裁剪2、可从rthread官网下载env工具,env工具可用来对rtthread源码生成mdk/iar工程 命令式scons --target=mdk5 scons --targe=iar scons自带的编译固件功能,命令为scnons,…

【0day漏洞复现】北京慧飒科技有限责任公司WEB VIDEO PLATFORM存在未授权访问漏洞

阅读须知花果山的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人…

存钱计划(三)

存钱计划(三) 时间限制(普通/Java):1000MS/30000MS 内存限制:65536KByte 描述 TZC的店铺比较多,上次WY随便走只要能走到就行,现在他学聪明了。WY去买东西的话,确定一家店以后,当然他先要想想怎么样走到那家店走的路最少。店与店之间是有走的方向的,从店A到店B可以,店B到…

视野修炼-技术周刊第83期 | MarsCode

① MarsCode - 在线 AI IDE ② Turbo Console Log - 快速创建console ③ mcfly - 命令行历史搜索 ④ emoji-mart - emoji 选择组件 ⑤ OpenSumi 3.0 正式发布 ⑥ ElysiaJS - 基于Bun的Web框架 ⑦ extension.js - 跨浏览器插件开发 ⑧ 服务器实时消息获取5种方案 ⑨ Remix Yours…