MyBatis源码(6)拦截器

news2024/9/18 15:05:55

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.coloradmin.cn/o/2073045.html

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

相关文章

Python画笔案例-011 绘制草帽

1、绘制草帽 通过 python 的turtle 库绘制一个草帽的图案,如下图: 2、实现代码 绘制以上草帽的图案,代码如下: """草帽.py """ import turtle # 导入海龟模块turtle.delay(20) …

多动症的孩子有哪些症状表现?

在星启帆自闭症儿童康复机构,我们不仅关注自闭症儿童的成长与康复,也深刻认识到多动症对儿童日常生活、学习和社交的深远影响。多动症,全称注意缺陷多动障碍,是一种常见于儿童时期的神经发育性疾病,其症状表现多种多样…

Python优化算法16——鲸鱼优化算法(WOA)

科研里面优化算法都用的多,尤其是各种动物园里面的智能仿生优化算法,但是目前都是MATLAB的代码多,python几乎没有什么包,这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考:Python优化算…

ChatGPT不同模型在论文写作中的优势和应用

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 ChatGPT在论文写作中的应用日益广泛。作为OpenAI开发的先进语言模型,ChatGPT有多个版本,包括GPT-3.5、GPT-4.0和GPT-4.0-mini,每个版本在性能和应用方…

如何解决Docker启动时报Status: unknown flag: --graph问题

最近在进行Docker环境迁移时,用二制对Docker进行了重新安装,一切配置好之后,启动Docker时,服务启动不起来,使用journalctl -xe命令查看,报出以下错误: [rootapp docker]# journalctl -xe 8月 2…

【css】伪元素实现图片悬停文字聚焦效果

实现重点: 文字覆盖在图片上: 通过使用 position: absolute 将 .box 文字盒子定位在图片上方。父容器 .img-wrap 使用了 position: relative 确保子元素的绝对定位在父容器的边界内生效。 创建悬停效果: 通过使用 &::before 和 &::…

Android PopupWindow弹窗动态显示在View的上下方,

序、周末不加班, 效果图如下。 我们要弹出的PopupWindow在View的下方,如果下方区域不够,则弹出在上方。 实现方案思路 我们在显示的时候,首先去计算一下弹窗高度。使用屏幕的高 - popupwind的高并且和popup的高做对比&#xff0…

ASP.NET Core SignalR 构建高效实时通信应用

目录 前言 SignalR的基本概念及其工作原理 1、核心概念 2、工作原理 前端环境准备 1、安装SignalR 2、创建SignalR连接 3、设置自动重新连接 4、监听连接状态 5、初始化连接 后端环境准备 1、注册SignalR 2、设置Hub 3、配置路由 4、发送和接收消息 实现聊天应用…

GraphRAG层级多标签文本分类任务实战(1)

1.概述 GraphRAG的本质是调用LLM生成知识图谱,然后在回答问题时检索相关内容输到prompt里,作为补充知识来辅助回答。那么有没有可能将这运用到层级多标签文本分类(HMTC)任务中呢? 当然,乍一听有一点天方夜谭&#xf…

3 pytest Fixture

目录 3.1 通过 conftest.py 共享 fixture3.2 使用 fixture 执行配置及销毁逻辑3.3 使用 --setup-show 回溯 fixture 的执行过程3.4 使用 fixture 传递测试数据3.5 使用多个 fixture3.6 指定 fixture 作用范围3.7 使用 usefixtures 指定 fixture3.8 为常用 fixture 添加 autouse…

vue开发区分开发环境和生产环境,以及预发布环境

vue开发区分开发环境和生产环境,以及预发布环境 在根目录创建 .env[mode] 文件,在项目执行 npm run dev 的时候vite会自动去读取.env.development文件里面的配置,执行npm runbuild进行打包之后也会自动将.env.production的内容打包进去&…

MyBatis使用:拦截器,SpringBoot整合MyBatis

1、目标 本文的主要目标是学习使用MyBatis拦截器,并给出拦截器的实例 2、拦截器的使用 2.1 Intercepts注解和Signature注解 Intercepts注解,指定拦截哪个拦截器的哪个方法,还要指定参数,因为可能发生方法重载 按照顺序可以拦…

人脸识别签到系统

人脸识别签到系统是一种利用计算机视觉技术和生物识别技术自动识别个体面部特征并进行身份验证的应用系统。这种系统通常应用于需要快速且准确的身份验证场景,例如公司员工打卡、学校上课签到、大型活动入场等。下面是对该系统的详细介绍: 项目背景及目…

【硬件模块】LCD1602显示模块

LCD液晶显示模块实物图 字符型液晶显示模块,可显示16列2行,共32个字符,每个字符都由5x8像素点阵构成。 常见型号:1602(16列2行);2004(20列4行);12864&#xf…

不用下载!玩《黑神话·悟空》图文教程by无影云电脑,开机即玩

使用阿里云无影云电脑畅玩《黑神话悟空》游戏图文教程,不需要下载,超简单开机即玩。无影云电脑提供WeGame版镜像和Steam版镜像,开机就能玩。阿小云分享阿里云官方发布的用无影云电脑畅玩《黑神话悟空》游戏图文教程: 无影云电脑玩…

笔记本电脑数据恢复的最佳解决方案 - 100%快速和安全

到目前为止,数字设备已成为我们生活中不可或缺的一部分。电脑、手机和数码相机丰富了我们的生活,给我们带来了很多便利。近年来,笔记本电脑越来越受到人们的欢迎,主要是因为它相对较轻且易于携带。 但是,如果笔记本电脑…

C++必修:set/map,mutiset/mutimap的用法

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C学习 贝蒂的主页:Betty’s blog 1. set的介绍 在 C 中,set 是一种关联容器,用于存储唯一的…

JavaScript初级——DOM查询的其他方法

1、在document中有一个属性 body ,保存的是body的引用。 2、document.documentElement 保存的是 html 根标签。 3、document.all 代表页面中所有的元素。 4、根据元素的 class 属性值查询一组元素节点对象 getElementsByClassName()可以根…

c++中的const权限及static成员

c中的const权限 void Print() {cout << _year << "-" << _mouth << "-" << _day << endl; } void f(const Date& d) {d.Print(); } this指针为非const的&#xff0c;故需要 //void Print(const Date* this) voi…

【机器学习】数据预处理、特征缩放以及有偏分布的基本概念

引言 数据预处理是机器学习过程中的一个关键步骤&#xff0c;它涉及对原始数据进行清洗、转换和重塑&#xff0c;以提高模型的性能和准确性 文章目录 引言一、数据预处理1.1 定义1.2 步骤1.2.1 数据清洗1.2.2 数据转换1.2.3 数据重塑1.2.4 数据分割1.2.5 数据增强1.2.6 处理不平…