当前位置: 首页 > news >正文

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.lryc.cn/news/374493.html

相关文章:

  • 部署大模型LLM
  • 【CT】LeetCode手撕—88. 合并两个有序数组
  • 深入分析 Android BroadcastReceiver (二)
  • Linux常⽤服务器构建-ssh和scp
  • 《QT实用小工具·七十》openssl+qt开发的P2P文件加密传输工具
  • 短链接生成器排名前三!长链接转化成短链接工具有哪些?
  • Vue50-mixin混入
  • Java创建线程的方式
  • C# 程序结构
  • 【Linux】使用 iptables 验证访问HDFS 所使用到的端口
  • 工程设计问题---多盘离合器制动器设计问题
  • triton矩阵乘以及缓存优化
  • springboot 搭建一个 测试Kafka 集群连通性demo
  • Ant Design Vue 动态表头和数据填充
  • 在Spring Cloud项目中集成Springdoc OpenAPI生成OpenAPI 3文档的详细解析
  • Linux shell 重定向输入和输出
  • electron录制工具-视频保存、编辑页面
  • curl命令行发送post/get请求
  • Redis 分片集群
  • 学习分享-Callable 和 Runnable 任务
  • three.js 基础01
  • 使用file.transferTo()做Java文件复制,目标文件存在时,是抛异常还是覆盖写入?
  • Python:线性查找法
  • IDEA 设置主题、背景图片、背景颜色
  • 【elementui源码解析】如何实现自动渲染md文档-第三篇
  • this指针如何使C++成员指针可调用
  • Redis数据结构之字符串(sds)
  • tokenization(二)子词切分方法
  • 慈善组织管理系统设计
  • 大疆Pocket3手持记录仪格式化恢复方法