Mybatis执行过程概述
2020-05-21 15:15:27 16 举报
登录查看完整内容
对于Mybatis的执行过程的一些拙见及粗略梳理
作者其他创作
大纲/内容
以查询为例
从缓存中拿MapperMethod方法对象
调用的方法是否已缓存
举例:TestEntity实体类: public class TestEntity { private int id; private int user_id; private TestEntity2 testEntity2; ...... } XML文件里: <resultMap id=\"test\" type=\"org.apache.ibatis.mytest.TestEntity\"> <result property=\"id\" column=\"id\"></result> <result property=\"user_id\" column=\"user_id\"></result> <collection property=\"testEntity2\" ofType=\"org.apache.ibatis.mytest.TestEntity2\"> <result property=\"money\" column=\"money\"></result> </collection> </resultMap> <select id=\"selectAll\" resultMap=\"test\"> select * from t_order where id=#{id} and user_id!=#{userId} </select>
是
查询一级缓存里是否有数据
有
默认都是配置的
否
直接调用
生成缓存key
构建StatementHandler对象
得到查询的结果
调用方法
以构建动态代理对象为切入点
判断调用的是否是Object类的默认方法
无
真正开始查询数据库数据
判断是否使用了Myabatis的默认分页
从configuration对象中获取到封装CRUD标签信息的对象MappedStatement
返回结果
构建动态代理对象
执行方法execute
判断是否配置了自动映射
以返回值为list为例
将结果put进一级缓存
以不使用为例
通过对应类型的TypeHandler对象解析ResultSetWrapper对象里的结果集
通过MappedStatement对象获取到查询返回值的类型信息
Mybatis执行过程概述
触发动态代理处理器MapperProxy里面的invoke方法
使用jdk动态代理构建代理对象
从缓存中拿数据
通过StatementHandler对象构建PrepareMentHandler对象
从knownMappers中拿到代理对象构建工厂MapperProxyFactory
判断是否调用的是接口的default默认方法
判断ResultMap里结果类型是否嵌套了另一个类型
new一个MapperMethod方法对象
通过代理接口mapperInterface以及sqlSession构建动态代理处理器MapperProxy
缓存方面不于此处展示
收藏
收藏
0 条评论
回复 删除
下一页