Mybatis工作流程和插件开发

在了解插件开发之前,我们先总体的来梳理一下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.mzph.cn/web/28491.shtml

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

相关文章

使用python调ffmpeg命令将wav文件转为320kbps的mp3

320kbps竟然是mp3的最高采样率,有点低了吧。 import os import subprocessif __name__ __main__:work_dir "D:\\BaiduNetdiskDownload\\周杰伦黑胶\\魔杰座" fileNames os.listdir(work_dir)for filename in fileNames:pure_name, _ os.path.spli…

Kubernetes面试整理-Kubernetes的主要组件有哪些?

Kubernetes 的主要组件分为控制平面组件和节点组件。以下是每个组件的详细介绍: 控制平面组件 1. API 服务器(kube-apiserver): ● 是 Kubernetes 控制平面的前端,接收、验证并处理所有的 API 请求。 ● 提供集群的管理接口,所有的集群操作都是通过 API 服务器进行的。

Java | Leetcode Java题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; class MinStack {Deque<Integer> xStack;Deque<Integer> minStack;public MinStack() {xStack new LinkedList<Integer>();minStack new LinkedList<Integer>();minStack.push(Integer.MAX_VALUE);}public void …

哈喽GPT-4o——对GPT-4o 文本创作的思考与看法

目录 用法1&#xff1a;创作小说用法2&#xff1a;创作散文用法3&#xff1a;创作诗歌1、古诗2、现代诗 用法4&#xff1a;创作儿童故事用法5&#xff1a;创作剧本 大家好&#xff0c;我是哪吒。 都说ChatGPT4o是目前文本创作的最强大模型&#xff0c;它都可以用于哪些方面的文…

虚拟化 之四 详解 jailhouse 使能和创建 Cell 的工作流程

完整的 Jailhouse 组件主要由内核模块(jailhouse.ko)、虚拟机管理程序固件(jailhouse*.bin)、管理工具(jailhouse 命令行程序及一些 Python 脚本)以及配置文件(.cell)这四部分组成。用户使用它们来启用虚拟机管理程序、创建 Cell、加载 inmate 二进制文件以及运行和停止…

CCPD数据集

官网&#xff1a;https://github.com/detectRecog/CCPD 其它介绍&#xff1a;https://blog.csdn.net/qianbin3200896/article/details/103009221 CCPD (Chinese City Parking Dataset, ECCV) provinces ["皖", "沪", "津", "渝", &…

跟着刘二大人学pytorch(第---13---节课之RNN高级篇)

文章目录 0 前言0.1 课程视频链接&#xff1a;0.2 课件下载地址&#xff1a; 1 本节课任务描述模型的处理过程训练循环初始化分类器是否使用GPU构造损失函数和优化器每个epoch所要花费的时间遍历每个epoch时进行训练和测试记录每次测试的准确率加入到列表中 具体实现&#xff0…

0基础可以直接学python自动化测试吗?

可以直接学习Python自动化测试&#xff0c;即使没有编程基础。Python是一种易于学习和上手的编程语言&#xff0c;也是自动化测试领域中最受欢迎的语言之一。下面是一篇超详细和规范的文章&#xff0c;将从零开始介绍Python自动化测试的基础知识。 1. 安装Python和开发环境 首…

项目进度和成本管理

1.如何正确标识出软件项目活动&#xff1f; 正确标识软件项目活动是项目管理中的一个重要步骤&#xff0c;它有助于确保项目的顺利进行和成功完成。以下是一些标识软件项目活动的步骤和建议&#xff1a; 项目范围定义&#xff1a;首先明确项目的目标和范围&#xff0c;这将帮助…

初识前端开发

目的 &#xff1a;开发一个网站 -前端开发&#xff1a;html 、css、javaScript -web框架&#xff1a;接收请求处理 -mysql数据库&#xff1a;存储数据的地方 快速上手&#xff1a; 基于Flask web框架让你快速搭建一个网站出来 学习&#xff1a; 基于Django框架 初识HTML …

Java 集合框架:ArrayList 的介绍、使用、原理与源码解析

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 013 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

刷代码随想录有感(106):动态规划——分割等和子集(01背包问题)

题干&#xff1a; 代码&#xff1a; class Solution { public:bool canPartition(vector<int>& nums) {int sum 0;for(int i : nums){sum i;}if(sum % 2 ! 0)return false;int target sum / 2;vector<int>dp(10001, 0);for(int i 0; i < nums.size(); …

Windows11和Ubuntu22双系统安装指南

一、需求描述 台式机电脑&#xff0c;已有Windows11操作系统&#xff0c;想要安装Ubuntu22系统&#xff08;版本任意&#xff09;。其中Windows安装在Nvme固态上&#xff0c;Ubuntu安装在Sata固态上&#xff0c;双盘双系统。开机时使用Grub控制进入哪个系统&#xff0c;效果图…

java(kotlin) ai框架djl

DJL&#xff08;Deep Java Library&#xff09;是一个开源的深度学习框架&#xff0c;由AWS推出&#xff0c;DJL支持多种深度学习后端&#xff0c;包括但不限于&#xff1a; MXNet&#xff1a;由Apache软件基金会支持的开源深度学习框架。 PyTorch&#xff1a;广泛使用的开源机…

Python进阶:从函数到文件的编程艺术!!!

第二章&#xff1a;Python进阶 模块概述 函数是一段可重复使用的代码块&#xff0c;它接受输入参数并返回一个结果。函数可以用于执行特定的任务、计算结果、修改数据等&#xff0c;使得代码更具模块化和可重用性。 模块是一组相关函数、类和变量的集合&#xff0c;它们被封…

第 2 章:Spring Framework 中的 IoC 容器

控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;与 面向切面编程&#xff08;Aspect Oriented Programming&#xff0c;AOP&#xff09;是 Spring Framework 中最重要的两个概念&#xff0c;本章会着重介绍前者&#xff0c;内容包括 IoC 容器以及容器中 …

Yum安装LAMP

查看当前80端口是否被占用 ss -tulanp | grep 80查询httpd是否在yum源中 yum info httpd安装httpd yum -y install httpd启动httpd服务&#xff0c;设置开机自启 systemctl enable httpd --now systemctl start httpd查看当前进程 ps aux | grep httpd查看当前IP&#xff…

【机器学习】大模型环境下的应用:计算机视觉的探索与实践

引言 随着数据量的爆炸性增长和计算能力的提升&#xff0c;机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;在计算机视觉&#xff08;Computer Vision&#xff0c;CV&#xff09;领域的应用日益广泛。特别是大模型&#xff08;Large Models&#xff09;如深度…

【Qt 6.3 基础教程 03】第一个Qt应用:Hello World

文章目录 前言创建项目编写代码main.cppmainwindow.cpp 编译和运行结果和调试扩展你的应用总结 前言 Qt编程之旅的第一个里程碑通常是构建一个简单的"Hello World"应用程序。在这个教程中&#xff0c;我们将指导你如何创建一个基本的Qt应用程序&#xff0c;它将显示…

自动化技术如何影响企业数据分析的发展

当今时代&#xff0c;企业普遍面临着转型的压力&#xff0c;这些挑战主要源于在科技和市场的双重压力下如何实现增长。当前&#xff0c;企业发展的趋势是紧追自动化的浪潮&#xff0c;并通过优化预算管理流程&#xff0c;推进系统和数据分析的现代化。在这一过程中&#xff0c;…