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 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)