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

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。MyBatis底层原理【源码运行时序图】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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代理对象

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/206299.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!