Idea Mybatis源码调试

1、通过SqlSessionFactoryBuilder build方法创建sqlSessionFactory,通过Resources获取mybatis配置文件的inputStream
在这里插入图片描述
初始化XMLConfigBuilde 在这里插入图片描述

XMLConfigBuilde 调用parse方法取mybatis配置内容转成Configuration对象对应的属性值,所以mybatis配置的所有内容都会加载到Configuration对象中。

在这里插入图片描述

最终SqlSessionFactoryBuilder通过Configuration入参构建出DefaultSqlSessionFactory

在这里插入图片描述

2、通过sqlSessionFactory来创建SqlSession
在这里插入图片描述

通过configuration获取ExecutorType执行器类型,执行器枚举包含三项SIMPLE, REUSE, BATCH,这个可以通过mybatis配置文件settings中配置,如果没有配置默认是SIMPLE。(具体settings解析过程看XMLConfigBuilder parse方法)
在这里插入图片描述
在这里插入图片描述

然后通过configuration的environment配置信息初始化事务对象,然后通过事务和执行器类型构建执行器Executor,最后通过配置configuration和执行器构造DefaultSqlSession

在这里插入图片描述

注:如果配置mybatis配置文件中配置了cacheEnabled为false才会创建另外三种执行器,因为Configuration类中默认cacheEnabled为true。
在这里插入图片描述
在这里插入图片描述
Mybatis的Executor接口的实现类图:
我们可以看到,Executor 的直接子类有 BaseExecutor 和 CachingExecutor 两个。
实际上,CachingExecutor 在 BaseExecutor 的基础上,实现二级缓存功能。
在下文中,BaseExecutor 的本地缓存,就是一级缓存。

一级缓存指的是在一次请求中创建一个SqlSession会话对象,并且每个会话会创建一个Executor,在本次会话过程中如果多次进行同一条查询语句的数据库查询操作,Mybatis会在SqlSession对象中缓存第一次查询结果,当下次查询的时候会判断查询语句是否完全一样,如果一样就直接返回缓存结果。除非本次会话过程中有更新该表的操作,否则会先取缓存信息。这就是Mybatis简单的一级缓存,并且默认开启,无法关闭。

在这里插入图片描述

在BaseExecutor中有一个PerpetualCache类的localCache对象,就是存放一级缓存的对象

在这里插入图片描述

BaseExecutor查询的时候会先通过MappedStatement的id,参数信息,分页查找的offset和limit,sql语句来构建缓存key,然后通过这个key去localCache取,如果有值就返回,否则去数据库查询,从数据查询后把查询结果放进localCache。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
configuration有一个一级缓存级别配置,LocalCacheScope枚举有两种类型SESSION,STATEMENT,分别是代表缓存是会话级别和STATEMENT级别,默认是SESSION, 如果是STATEMENT级别,在queryStack为0时需要清空缓存。也就是每次查询后清空缓存,实际效果就是不走缓存。
在这里插入图片描述

注:一级缓存只是针对单个SqlSession对象,多个SqlSession对象之间互不影响,说明如果一个SqlSession修改了对应的数据其他SqlSession对象中的缓存还是会生效,这样就会出现脏数据的情况。针对这种情况Mybatis设计了二级缓存,同样二级缓存默认也是开启的,所以正常情况下会先判断二级缓存,二级缓存不会出现多个SqlSession之间的脏数据的情况。
另外如果是STATEMENT级别在一次查询完成会清掉缓存数据。
如果在mapper配置文件中对应的select中设置了flushCacheRequired属性为true也会在第二次查询时去清掉缓存。默认是false。所以默认是不会清除。

localCache中的缓存key和value对应的值
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值