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

MyBatis初始化流程🛷

以下代码为例🎉

🎇可对应源码阅读
image-20230303222112868

MyBatis初始化流程✨

SqlSessionFactoryBuilder XMLConfigBuilder Configuration DefaultSqlSessionFactory 1、创建对象 2、build(inputStream) 3、创建解析器parser 4、解析每一个标签把详细信息保存在Configuration中 5、解析mapper.xml 6、返回Configuration 7、build(Configuration) 8、new DefaultSqlSessionFactory(config) 9、返回创建的DefaultSqlSessionFactory,包含了保存全局配置信息的Configuration SqlSessionFactoryBuilder XMLConfigBuilder Configuration DefaultSqlSessionFactory MyBatis初始化流程

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

获取SqlSession流程🪁

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

获取Mapper代理对象🎿

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

执行流程🎄

MapperProxy MapperMethod DefaultSqlSession Executor CachingExecutor BaseExecutor SimpleExecutor StatementHandler invoke() 判断增删改查类型 包装参数为map集合 sqlSession.selectOne() selectList() 获取MappedStatement MappedStatement中包含了方法对 应的标签详细信息,包含了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值 后续关闭连接等操作 返回数据 MapperProxy MapperMethod DefaultSqlSession Executor CachingExecutor BaseExecutor SimpleExecutor StatementHandler 获取Mapper代理对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

造 山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值