MyBatis源码(6)拦截器

1、目标

本文的主要目标是学习MyBatis拦截器的源码,本文将以插入操作为例debug拦截器相关的源码

2、拦截器源码分析

调用mapper接口的insert插入记录方法,会调用SqlSession对象的insert方法

在这里插入图片描述

SqlSession执行insert方法

在这里插入图片描述

Spring容器会创建SqlSessionTemplate对象,为了实现插入操作,可以分为三步:

(1)创建Executor执行器对象和SqlSession对象

(2)反射调用update方法完成插入操作

(3)SqlSession执行commit方法提交事务

3、创建Executor执行器对象和SqlSession对象

在这里插入图片描述

它会分别创建Executor执行器对象和SqlSession对象

3.1 newExecutor方法

在这里插入图片描述

执行器链会调用pluginAll方法将拦截器创建JDK动态代理对象

在这里插入图片描述

遍历所有的拦截器,每个拦截器都执行plugin方法

在这里插入图片描述

plugin方法会调用Plugin的wrap这个静态方法,此时由于没有拦截Executor执行器的拦截器,因此不会创建JDK动态代理对象

4、反射调用update方法完成插入操作

在这里插入图片描述

SqlSession对象会反射调用insert方法,其中参数是mapper接口方法的入参,这个方法会调用update方法

在这里插入图片描述

它会调用BaseExecutor执行器的update方法进行插入操作,它会调用doUpdate方法

在这里插入图片描述

最终会调用SimpleExecutor执行器的doUpdate方法,它会执行插入操作,具体是:

(1)newStatementHandler方法创建RoutingStatementHandler对象

(2)prepareStatement方法创建Stetement对象

(3)StetementHandler对象的update方法

4.1 newStatementHandler方法创建RoutingStatementHandler对象

在这里插入图片描述

先创建RoutingStatementHandler对象,然后调用拦截器链的pluginAll方法生成JDK动态代理对象

在这里插入图片描述

由于存在StatementHandler对象的拦截器,因此会调用Proxy.newProxyInstance方法创建RoutingStatementHandler对象的JDK动态代理对象

在这里插入图片描述

返回的StatementHandler对象是基于StatementHandler接口的JDK动态代理对象,其中三个拦截器对象是层层嵌套的,形成一个拦截器链

4.2 prepareStatement方法创建Stetement对象

在这里插入图片描述

prepareStatement方法会先调用StatementHandler对象的prepare方法创建Statement对象,然后调用StatementHandler对象的parameterize方法给参数赋值

4.2.1 prepare方法

在这里插入图片描述

由于这个拦截器是拦截StatementHandler对象的prepare方法,因此先走到这个拦截器,然后调用invocation.proceed方法会执行StatementHandler对象的prepare方法

在这里插入图片描述

BaseStatementHandler对象的prepare方法会实例化Statement对象

在这里插入图片描述

实例化Statement对象的方法会根据BoundSql对象中的sql属性得到sql语句并实例化Statement对象,因此最好在StatementHandler对象的prepare方法之前修改sql语句

4.2.2 parameterize方法

在这里插入图片描述

由于这个拦截器拦截的是StatementHandler对象的parameterize方法,因此会先走到这个拦截器中,然后执行invocation.proceed方法会调用StatementHandler对象的parameterize方法

在这里插入图片描述

它会调用ParameterHandler对象的setParameters方法完成参数赋值的功能

在这里插入图片描述

DefaultParameterHanlder对象会先根据BoundSql对象的parameterMappings这个List集合的大小n,然后设置PreparedStatement对象的参数值对应的下标是从1开始到n

在这里插入图片描述

执行PreparedStatement对象的setString方法会设置下标是i,参数值是parameter,用setString方法可以在字符串参数值加上单引号,防止sql注入

在这里插入图片描述

因此,在拦截器中会调用PreparedStatement对象的setString等方法

4.2.3 结果

在这里插入图片描述

最终将下标和对应的参数值保存在PreparedStatementLogger对象的columnMap中

4.3 StetementHandler对象的update方法

在这里插入图片描述

调用StatementHandler对象的update方法,入参是Statement对象

在这里插入图片描述

由于这个拦截器拦截的是StatementHandler对象的update方法,因此会先走这个拦截器,然后执行invocation.proceed方法会调用StatementHandler对象的update方法

4.3.1 update方法

在这里插入图片描述

PreparedStatementHandler对象的update方法会调用PreparedStatement对象的execute方法执行JDBC的插入操作,并返回更新数据库的行数rows

5、SqlSession执行commit方法提交事务

在这里插入图片描述

SqlSession对象的commit方法会清除一级缓存,因此默认情况下SpringBoot整合MyBatis每次调用sql语句不会保存到一级缓存中

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

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

相关文章

【Algorithm】三步问题

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 1.三步问题1.题目连接2.算法原理讲解&&代码实现 2.最小花费爬楼梯1.题目连接2.算法原理讲解&&代码实现 3.解码方法1.题目连接2.算法原理讲解&&代码实现 1.三步问题 1.题目连…

如何在分布式环境中实现高可靠性分布式锁

目录 一、简单了解分布式锁 (一)分布式锁:应对分布式环境的同步挑战 (二)分布式锁的实现方式 (三)分布式锁的使用场景 (四)分布式锁需满足的特点 二、Redis 实现分…

1/f噪声影响及解决措施

在将6位半数字万用表输入短接时,观察其输出。在逐渐增加均值次数后,噪声开始下降,达到一定程度后便停止下降,随着时间的推移,停止下降的噪声在逐渐增加,该部分主要是1/f噪声影响。 这种1/f噪声(…

404错误页面简约清新源码 非常好看

源码介绍 404错误页面简约清新源码 非常好看,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面 源码下载 404错误页面简约清…

摄像头实时检查程序,插入设备,自动显示画面,支持多个摄像头,支持拍照,照片放大缩小

支持的特性 插入摄像头设备后&#xff0c;无需手动选择&#xff0c;自动显示摄像头画面&#xff0c;需要预先授权支持多个摄像头切换显示多个摄像头时支持 默认显示特定名称的摄像头支持拍照支持照片放大&#xff0c;缩小 显示效果 完整代码 <!DOCTYPE html> <html…

Spring Boot 有哪些优点?

Spring Boot 有哪些优点&#xff1f; &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Spring Boot以其简洁和高效的特点&#xff0c;革新了Java应用的开发和部署方式。以下是其几大核心优势&#xff0c;让你一目了然&#xff1a; 减少时间成…

【舞动生命,营养护航】亨廷顿舞蹈症患者的维生素补给站

Hey小伙伴们~&#x1f44b; 在这个充满色彩的世界里&#xff0c;每个人都在以自己的方式绽放光彩。但你知道吗&#xff1f;有一群特别的朋友&#xff0c;他们面对着亨廷顿舞蹈症的挑战&#xff0c;却依然以不屈不挠的精神舞动着生命的旋律。&#x1f483;✨ 今天&#xff0c;就…

Windows下线程的竞争与资源保护(win32-API)

一、前言 在线程编程中&#xff0c;资源共享与保护是一个核心议题&#xff0c;尤其当多个线程试图同时访问同一份资源时&#xff0c;如果不采取适当的措施&#xff0c;就会引发一系列的问题&#xff0c;如数据不一致、竞态条件、死锁等。为了确保数据的一致性和线程安全&#…

数据结构(树、平衡树、红黑树)

目录 树 树的遍历方式 平衡二叉树 旋转机制 左旋 右旋 旋转实例 左左 左右 右右 右左 总结 红黑树 树 相关概念 节点的内部结构如下 二叉树与二叉查找树的定义如下 树的遍历方式 前序遍历&#xff1a;当前节点&#xff0c;左子节点&#xff0c;右子结点 中序遍…

Excel的使用总结1

目录 1、汇总公式&#xff1a;TEXTJOIN 2、excel中选择某个区域的方法 3、excel中如何在复制的时候&#xff0c;不将公式一起复制过去 4、想要自动填充某个区域的值的方法 1、汇总公式&#xff1a;TEXTJOIN TEXTJOIN 函数 - Microsoft 支持 例&#xff1a;TEXTJOIN("…

25 配置交换机网关

配置交换机网关 一、配置交换机默认网关 配置管理网关&#xff1a; Switch(config)#ip default-gateway 192.168.1.254二、配置交换机管理IP及默认网关练习 Route0&#xff1a; # 进入特权模式 Router>enable# 进入全局配置模式 Router#configure terminal # 进入f0/0口…

了解prolog规则

要推理先要有规则&#xff1b; 假设有一条规则&#xff0c; 如果X和Y是朋友&#xff0c;那么Y和X也是朋友&#xff1b; 这条规则写成这样&#xff0c; friend(X,Y) :- friend(Y, X). X和Y都是大写&#xff0c;表示这是两个变量&#xff1b;符号 :- 表示推理关系&…

【计算机网络】mini HTTP服务器框架与代码

注注注&#xff1a;本篇博文都是代码实现细节&#xff0c;但不会进行演示&#xff0c;演示看孪生篇 另外&#xff0c;由于tcp套接字部分本质都是套路&#xff0c;所以就不再进行赘述。 目录 1 请求反序列化2 读取url文件内容3 构建响应 1 请求反序列化 我们肯定会先收到请求&…

搜狐新闻HarmonyOS Push开发实践

本文字数&#xff1a;1795字 预计阅读时间&#xff1a;15分钟 01 背景 搜狐新闻作为HarmonyOS的合作伙伴&#xff0c;于2023年12月成功上架鸿蒙单框架应用市场&#xff0c;成为首批鸿蒙应用矩阵的一员。 推送作为新闻类应用的重要组成部分&#xff0c;我们将其纳入到二期功能开…

资本相信人形机器人

文&#xff5c;刘俊宏 编&#xff5c;王一粟 闷热的场馆里&#xff0c;兴奋的议论声&#xff0c;所有人生怕错过这场AI让机器人进化的盛宴。 人山人海的会展现场 光锥智能拍摄 8月21日&#xff0c;2024世界机器人大会&#xff08;WRC&#xff09;在北京开幕。在这场由169家…

vue3 element-plus el-table 多层级表头动态渲染。

效果图: html: <el-table :data"arrlist" border style"width: 100%"><template v-for"(i, index) in currentFieldData" :key"index"><el-table-column :label"i.label" :header-D"i.headerAlign&q…

TCP系列相关内容

一、TCP上传文件 loop——本地回环测试地址。 void *memset&#xff08;void *s,int c,size_t n&#xff09;——给一个变量设定一个值。 1、“粘包”问题 两次分别发送的数据&#xff0c;被一起接收形成该现象。 原因&#xff1a;TCP流式套接字&#xff0c;数据与数据间没…

分布式锁 redis与zookeeper

redis实现分布式锁 原理 基于redis命令setnx key value来实现分布式锁的功能&#xff0c;只有当key不存在时&#xff0c;setnx才可以设置成功并返回1&#xff0c;否则设置失败返回0。 方案1&#xff1a; 方案1存在的问题 假如在加锁成功&#xff0c;释放锁之前&#xff0c;…

飞书怎么关联任意两段话

最近开始用飞书记文档&#xff0c;体验实在是非常的丝滑&#xff0c;对我来说感觉没有找到更好的竞品了。废话不多说&#xff0c;接下来简单介绍一下怎么关联任意两段话吧。 首先说明&#xff0c;关联可以单向&#xff0c;也可以双向。 直接举例。 我想要将蓝字关联到最下面的…

自适应学习率(Datawhale X 李宏毅苹果书 AI夏令营)

传统的梯度下降方法在优化过程中常常面临学习率设置不当的问题。固定的学习率在训练初期可能过大&#xff0c;导致模型训练不稳定&#xff0c;而在后期可能过小&#xff0c;导致训练速度缓慢。为了克服这些问题&#xff0c;自适应学习率方法应运而生。这些方法通过动态调整学习…