Mybatis工作流程和插件开发

news2024/11/24 13:07:33

在了解插件开发之前,我们先总体的来梳理一下Mybatis的大致执行流程:

1.new SqlSessionFactoryBuilder().build(inputStream):先根据配置文件(包含了全局配置文件和映射配置文件)初始化一个对象Configuration(这里对象里包含了所有配置文件里的标签信息,这里包含的每个MappedStatement对象就代表一个增删改查的标签),然后在将这个对象传入buile方法build(configuration),返回一个DefaultSqlSessionFactory对象实例(它是接口SqlSessionFactory的实现类)。

2.sqlSessionFactory.openSession():实际上是DefaultSqlSessionFactory对象实例调用openSessionFromDataSource,根据session(执行器类型)和全局变量的设置:

创建一个Executor(它是执行sql查询语句的):

最后返回对象DefaultSqlSession(configuration(所有配置信息), executor(执行sql的执行器), autoCommit);

3.DefaultSqlSession.getMapper():获取到对应的Mapper接口的代理对象,MapperProxy(代理对象),这个代理对象里包含有Mapper接口里的所有方法以及和数据库之间的会话DefaultSqlSession对象,而这个对象又包含:对象DefaultSqlSession(configuration(所有配置信息), executor(执行sql的执行器), autoCommit);

4.userMapper.selectByPrimaryKey(1):执行增删改查方法

①MapperProxy调用invoke方法

这里将接口方法转换为MapperMethod,然后调用executor对象执行增删改查的操作

②执行增删改查的过程中Executor会创建StatementHandler对象和ParameterHandler、ResultSetHandler对象

③调用StatementHandler执行sql语句,调用ParameterHandler通过typeHandler设置sql语句中的参数,调用ResultSetHandler通过typeHandler封装sql语句查询出来的结果集

在Mybatis执行流程中涉及四个关键的对象Executor,StatementHandler,ParameterHandler,ResultSetHandler,了解一个与插件开发有关的重要的信息:这四个对象在创建完成返回之前,都会被一个方法过滤一遍的代码:intercepterChain.pluginAll(xxxxHandler/Executor)

上述的方法源码:

/** 
  * 每一个拦截器对目标类都进行一次代理 
  * @paramtarget 
  * @return 层层代理后的对象 
  */  
 public Object  pluginAll(Object target) {  
     for(Interceptor interceptor : interceptors) {  
         target= interceptor.plugin(target);  
     }  
     return target;  
}

很明显,四大对象在创建返回之前,被一组过滤器逐一的拦截过滤了一遍,这个拦截器类型的接口Interceptor就是插件要实现的接口。所以说,我们开发插件的本质其实就是(AOP面向切面编程思想的一个切面),在四大对象返回之前,我们可以对它拦截后创建一个代理对象,对原对象进行封装,加工,增加我们想要的各种功能,然后用代理对象替换掉原对象。这就是Mybatis插件的本质! 

 

 

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

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

相关文章

LaTex入门教程

目录 1.说明 2.页面的分区 3.入门介绍 (1)命令 (2)环境 (3)声明 (4)注释 4.代码结构 (1)导言区 (2)支持中文 (3…

2024都市解压爆笑喜剧《脑洞大开》6月28日上映

随着暑期档的临近,电影市场迎来了一剂强心针——由何欢、王迅、克拉拉、卜钰、孙越、九孔等众多实力派笑星联袂主演的都市解压爆笑喜剧《脑洞大开》正式宣布定档,将于6月28日在全国各大影院欢乐上映,誓为观众带来今夏最畅快淋漓的笑声风暴。 …

逆天改命 17岁中专女生横扫全球数学竞赛

“逆天改命!17岁中专女生横扫全球数学竞赛,清华北大高手纷纷落马!” 最近全网被这则消息震惊了。 来!随便挑几个题目,让大家体验一下阿里巴巴全球数学竞赛的难度? 数学是人工智能算法的基石。它为算法提供了逻辑框架和分析工具,使得人工智能能够处理复杂的数据和问…

驾考模拟 | 电脑上使用浏览器模拟科目一考试

驾考模拟 背景 有个亲戚要考科目一,大叔之前没怎么用过电脑,想要在电脑上练习科目一,找找使用电脑考试的感觉。 有一些本地安装的软件可以满足这个需求,但通常要付费,没这个必要,毕竟只是用来模拟考的。 …

【最新鸿蒙应用开发】——鸿蒙中的“Slot插槽”?@BuilderParam

构建函数-BuilderParam 传递 UI 1. 引言 BuilderParam 该装饰器用于声明任意UI描述的一个元素,类似slot占位符。 简而言之:就是自定义组件允许外部传递 UI Entry Component struct Index {build() {Column({ space: 15 }) {SonCom() {// 直接传递进来…

《大数据分析》期末考试整理

一、单项选择题(1*9) 1.大数据发展历程:出现阶段、热门阶段和应用阶段 P2 2.大数据影响 P3 1)大数据对科学活动的影响 2)大数据对思维方式的影响 3)大数据对社会发展的影响 4)大数…

昂科烧录器支持Prolific旺玖科技的电力监控芯片PL7413C1FIG

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表,其中Prolific旺玖科技的高度集成的电力监控芯片PL7413C1FIG已经被昂科的通用烧录平台AP8000所支持。 PL7413C1FIG是一款高度集成的电力监控芯片,用于测量电力使用情况的…

vue-饼形图-详细

显示效果 代码 <template> <div style"height: 350px;"> <div :class"className" :style"{height:height,width:width}"></div> </div> </template> <script> import * as echarts from echarts; req…

Typora实现设置代码块默认语言_亲测有效(AutoHotKey方式和修改配置文件)

Typora实现设置代码块默认语言&#xff08;AutoHotKey方式和修改配置文件&#xff09; 前言&#xff0c;需求使用AutoHotKey热键脚本【最简单方便】实现步骤建议 最终效果其他方法自定义Typora代码块快捷键设置。应对ctrlshiftk快捷键被其他占用的情况。 前言&#xff0c;需求 …

07--Zabbix监控告警

前言&#xff1a;和普米一样运维必会的技能&#xff0c;这里总结一下&#xff0c;适用范围非常广泛&#xff0c;有图形化界面&#xff0c;能帮助运维极快确定问题所在&#xff0c;这里记录下概念和基础操作。 1、zabbix简介 Zabbix是一个基于 Web 界面的企业级开源解决方案&a…

厂里资讯之自媒体文章自动审核

自媒体文章-自动审核 1)自媒体文章自动审核流程 1 自媒体端发布文章后&#xff0c;开始审核文章 2 审核的主要是审核文章的内容&#xff08;文本内容和图片&#xff09; 3 借助第三方提供的接口审核文本 4 借助第三方提供的接口审核图片&#xff0c;由于图片存储到minIO中&…

高速信号——NRZ,PAM4调制技术

1&#xff1a;码元 了解调制技术需要引出“码元”的概念。 一个码元就是一个脉冲信号&#xff0c;即一个最小信号周期内的信号&#xff0c;我们都能够理解&#xff0c;最简单的电路&#xff0c;以高电平代表1&#xff0c;低电平代表0&#xff0c;一个代表1或者0的信号&#x…

Linux基础I/O之文件描述符fd 重定向(上)

目录 一、预备知识 二、C语言中的文件接口 三、系统调用中的文件接口 一、预备知识 首先我们要明确的一个观点是 --- 文件 内容 属性。而且我们之前也还将过一个概念&#xff0c;那就是Linux下一切皆文件。 内容是数据&#xff0c;属性也是数据 --- 那么也就是说我…

t265 jetpack 6 px4 ros2

Ubuntu22.04 realsenseSDK2和ROS2Wrapper安装方法,包含T265版本踩坑问题_ros2 realsense-CSDN博客 210 git clone https://github.com/IntelRealSense/librealsense.git 212 git branch 215 git tag 218 git checkout v2.51.1 219 git branch 265 git clone https://…

C语言---------深入理解指针

目录 一、字符指针 二、指针数组&#xff1a; 三、数组指针&#xff1a; 1、定义&#xff1a; 2、&数组名和数组名区别&#xff1a; 3、数组指针的使用&#xff1a; 四、数组参数&#xff0c;指针参数&#xff1a; 1、一维数组传参&#xff1a; 2、二维数组传参&am…

基于springboot的大学计算机基础网络教学系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的大学计算机基础网络教学…

opencv-python(十)

绘制直线 cv2.line(img, pt1, pt2, color, thickness1, lineTypeLINE_8) 上述代码可以从pt1点绘一条线到pt2点。 img&#xff1a;绘图对象 pt1&#xff1a;线段的起点&#xff0c;画布的左上角坐标是(0, 0) pt2&#xff1a;线段的终端 color&#xff1a;&#xff08;B&…

记录一次root过程

设备: Redmi k40s 第一步&#xff0c; 解锁BL&#xff08;会重置手机系统&#xff01;&#xff01;&#xff01;所有数据都会没有&#xff01;&#xff01;&#xff01;&#xff09; 由于更新了澎湃OS系统, 解锁BL很麻烦, 需要社区5级以上还要答题。 但是&#xff0c;这个手机…

React+TS前台项目实战(十)-- 全局常用组件CopyText封装

文章目录 前言CopyText组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲项目常用复制文本组件封装&#xff0c;这个组件是一个用于拷贝文本的 React 组件&#xff0c;它提供了拷贝&#xff0c;国际化和消息提示的功能 CopyText组件 1. 功能分…

C++11完美转发(引用折叠、万能引用)

完美转发是指在函数模板中&#xff0c;完全依照模板的参数的类型&#xff0c;将参数传递给函数模板中调用的另外一个函数。 函数模板在向其他函数传递自身形参时&#xff0c;如果相应实参是左值&#xff0c;它就应该被转发为左值&#xff1b;如果相 应实参是右值&#xff0c;它…