今天是20年的四月二号,坐标北京良乡 ,天朗气清,很想出去走走。最近公司上二休三,一周五天都是空闲的。
今天早上新闻推送,平顶山出现了几例无症状的新冠肺炎患者,估计河南完全解封又要花点时间了。
但是今天想搞清楚Mybatis的内部流程,虽然我也是比较熟悉了,但是一直也有点模糊。
先上一张图
SqlsessionFactoryBuilder 根据配置或者代码来生成Sqlsessionfactory 采用分布构建的builder模式
Sqlsessionfactory : 生成SqlSession ,使用的是工厂模式
SqlSession : 一个既可以发送sql来获取返回结果 也可以获取 Mapper的接口
SqlMapper :一个Java接口和xml文件(或者注解)构成,需要给出对应的sql和映射规则,她负责发送sql去执行
查看sqlSessionfactory
查看openSession的方法
01 创建了一个事务
02 根据不同的类型 simple reuse 创建了一个Excutor 对象 并且将事务对象传入
03 调用拦截器 包装Excutor
流程时序图
开始查询的流程
01 ProductDao mapper = sqlSession.getMapper(ProductDao.class);
02 调用Configration 的getMapper
03 根据接口 使用JDK动态代理获取代理对象
时序图
调用接口方法 (增删改查)
excutor 调用seelctList
首先在在缓存中取值 没有的话 调用queryFromDatabase
Note
这个方法是对参数的解析 就是@Param(“x”)那么返回的可排序的Map的key就是x 值就是传入的值
调用CacheingExcutor 的query方法
首先从缓存中查询 没有从数据库查询