Mybatis运行原理

Mybatis运行原理

先是简要的文字说明,后面放上图。如有叙述错误,感谢指正哈。

一、根据配置文件创建SQLSessionFactory#

首先将配置文件转化为流,创建SqlSessionFactoryBuilder对象,通过SqlSessionFactoryBuilder的build() 方法对流进行创建SQLSessionFactory的实例。

build() 的简易过程为:创建解析器parser对流进行配置文件中的每个标签进行解析,将解析后的结果保存在Configration中,最后通过build()返回一个DefaultSqlSession对象,即SQLSessionFactory的实例。

二、返回SqlSession的实现类DefaultSqlSession对象#

在第一步获取到包含了Configration的DefaultSqlSession对象后,调用它的openSession() 方法,实际上是调用openSessionFromDataSource() 方法,在这个方法中获取环境信息,创建事务并使用newExecutor()获得executor对象。最后创建出包含Configration和executor的DefaultSqlSession对象。

newExecutor()的简易过程:首先根据全局配置创建出SimpleExecutor/ReuseExecutor/BatchExecutor中的一种(对executor进行包装)。然后如果开启了二级缓存则创建CachingExecutor(对executor进行包装)。最后使用每一种拦截器对executor进行包装并返回。

三、getMapper()返回接口的代理对象#

SqlSession.getMapper()--->Configuration.getMapper()--->mapperRegistry.getMapper()。然后根据接口类型获得MapperProxyFactory。再通过mapperProxyFactory.newInstance(sqlSession)创建MapperProxy。而MapperProxy是实现了InvocationHandler接口,所以MapperProxy是一个代理对象。最后层层返回得到代理对象。

四、通过代理对象调用增删改查方法#

这一步比较麻烦,简易说明一下:代理对象通过invoke()方法判断用户是用增删改查的哪个方法,然后再调用sqlSession的增删改查方法。

在调用sqlSession的增删改查方法中会调用executor对应的增删改查方法获取到BoundSql,BoundSql里包含了sql语句的详细信息。executor再创建StatementHandler,在创建StatementHandler的同时也创建了ParameterHandler与ResultSetHandler。StatementHandler通过ParameterHandler设置参数、通过ResultSetHandler处理结果。而ParameterHandler和ResultSetHandler都依赖于TypeHandler进行数据库类型和JavaBean类型的映射。TypeHandler的底层使用的是JDBC。

以上图片转载自尚硅谷

作者:xuzhuo123

出处:https://www.cnblogs.com/xuzhuo123/p/15931191.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   KeepGoing4everZxz  阅读(175)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示