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

MyBatis底层原理【源码运行时序图】

MyBatis初始化流程🛷

以下代码为例🎉

🎇可对应源码阅读
image-20230303222112868

MyBatis初始化流程✨

SqlSessionFactoryBuilderXMLConfigBuilderConfigurationDefaultSqlSessionFactory1、创建对象2、build(inputStream)3、创建解析器parser4、解析每一个标签把详细信息保存在Configuration中5、解析mapper.xml6、返回Configuration7、build(Configuration)8、new DefaultSqlSessionFactory(config)9、返回创建的DefaultSqlSessionFactory,包含了保存全局配置信息的ConfigurationSqlSessionFactoryBuilderXMLConfigBuilderConfigurationDefaultSqlSessionFactoryMyBatis初始化流程

Mapper.xml中的每一个元素信息解析出来并保存在全局配置中,讲增删改查标签每一个属性解析出来封装成一个MappedStatement;一个MappedStatement就代表一个增删改查标签的详细信息

获取SqlSession流程🪁

DefaultSqlSessionFactoryConfigurationExecutor1、openSession()2、openSessionFromDataSource()3、获取一些信息,创建tx4、newExecutor()5、根据参数,选择合适的Executor实现6、如果开启了二级缓存,则创建CachingExecutor二级缓存默认为true,所以这里会创建CachingExecutor,此处使用了装饰器模式7、遍历所有拦截器,代理exceutorexecutor = (Executor) interceptorChain.pluginAll(executor)返回根据配置创建的Executor对象创建并返回DefaultSqlSessionDefaultSqlSession中包含了Executor和ConfigurationDefaultSqlSessionFactoryConfigurationExecutor获取SqlSession流程

获取Mapper代理对象🎿

DefaultSqlSessionConfigurationMapperRegistryMapperProxyFactoryMapperProxy1、getMapper()2、getMapper()3、getMapper4、查找指定type对应的MapperProxyFactory对象5、newInstance(sqlSession)6、创建实现了mapperInterface接口的代理对象创建MapperProxy,他是一个 InvocationHandler,JDK动态代理核 心对象7、返回MapperProxy代理对象返回DefaultSqlSessionConfigurationMapperRegistryMapperProxyFactoryMapperProxy获取Mapper代理对象

执行流程🎄

MapperProxyMapperMethodDefaultSqlSessionExecutorCachingExecutorBaseExecutorSimpleExecutorStatementHandlerinvoke()判断增删改查类型包装参数为map集合sqlSession.selectOne()selectList()获取MappedStatementMappedStatement中包含了方法对应的标签详细信息,包含了SQL的信息executor.query()获取BoundSql对象query()检查是否使用了二级缓存如果存在二级缓存,则返回缓存中信息如果不存在缓存,则调用被装饰的Executor执行query()检查本地缓存(一级缓存)localCache存在本地缓存(一级缓存)获取缓存中保存的输出类型参数,并设置到用户传入的实参(parameter)对象中没有本地缓存则调用queryFromDatabase(),查询后也会放到一级缓存中调用doQuery()方法,完成数据库查询操作,并返回结果对象创建StatementHandler对象创建StatementHandler此处会遍历是否有拦截器存在,interceptorChain.pluginAll()prepareStatement()完成Statement的创建和初始化与处理占位符预编译sql产生PreparedStatementHandler对象调用StatementHandler设置参数调用TypeHandler给预编译SQL设置参数查出数据使用ResultSetHandler处理结果;使用TypeHandler获取value值后续关闭连接等操作返回数据MapperProxyMapperMethodDefaultSqlSessionExecutorCachingExecutorBaseExecutorSimpleExecutorStatementHandler获取Mapper代理对象
http://www.lryc.cn/news/27855.html

相关文章:

  • k8s 系列之 CoreDNS 解读
  • 从测试鸡蛋硬度到跳表的设计
  • 3D立体视觉成像原理介绍【一 】
  • CEC2021:鱼鹰优化算法(Osprey optimization algorithm,OOA)求解CEC2021(提供MATLAB代码
  • 0301_对应的南京比特物联网
  • 钡铼技术BL302 ARM工控机QT图形化界面开发的实践
  • Python try except异常处理详解(入门必读)
  • 信息系统基本知识(三)软件工程
  • Linux下软件部署安装管理----rpmbuild打包rpm包部署安装
  • ThreadLocal学会了这些,你也能和面试官扯皮了!
  • 【存储】存储特性
  • Qt使用OpenGL进行多线程离屏渲染
  • Vue基础入门讲义(三)-指令
  • pod资源限制,探针(健康检查)
  • Python | 蓝桥杯进阶第一卷——字符串
  • 2023-03-03 mysql列存储-cpu占用100%-追踪思路
  • JVM—类加载子系统
  • 在codeIgniter3中session.php中的数组追加值
  • Windows环境下Gpu版本的Pytorch安装
  • 项目实战典型案例13——学情页面逻辑问题
  • 工作日志day02
  • C++Primer16.1.6节练习
  • 初尝并行编程
  • keepalived学习记录:对其vip漂移过程采用gdb跟踪
  • 51单片机串口通讯原理及程序源码-----day8
  • mongodb入门到使用(下)
  • 云HIS系统源码 医院his源码 云his源码
  • 朴素贝叶斯法学习笔记
  • vscode与C++安装与使用【不好用来骂我】
  • C++11使用多线程(线程池)计算相似度实现性能优化