因为要准备面试了,最近看了关于ssm的一些理论知识,本文就是关于mybatis的执行流程以及mybatis缓存的了解,主要是上一个面试问了我mybatis的缓存,然后我一脸懵逼,现在知道了,原来就这。。。。好了话不多说,进入正文。
首先问大家一个问题,你理解的mybatis是怎么执行的?
是不是就先创建SqlSessionFactoryBuilder–> builder一下–> 得到SqlSessionFactory–> 再open一下 --> 得到SqlSession --> crud --> commit --> close ok请接着往下看。
- 通过Resource对象获得mybatis的配置文件信息
- 实例化SqlSessionFactoryBuilder对象
- builder()
- 通过XMLConfigBuilder对象解析配置文件信息
- 将解析后的信息存入Configuration对象中
- 实例化SqlSessionFactory对象
- Transactional事物管理器
- 创建Executor执行器
- 创建SqlSession
- crud
- 判断执行是否成功+事物是否回滚 [回到第7步]
- commit事物
- close
接下来是mybatis缓存的理解,其实这个知识至少目前来说我用的很少,算了 直接没用过。再mybatis中有一级缓存和二级缓存。默认情况下一级缓存是开启的,它的作用范围是一个SqlSession对象。也就从open()得到SqlSession开始,直到close()释放它。在这一段时间里,从数据库中查询的数据会放在一级缓存中,如果这个时候你再使用该对象差一次刚刚缓存了的数据,这时候就会从一级缓存中取。但是需要注意在这个范围内创建了一个新的SqlSession对象,查询刚刚缓存的数据是不会从一级缓存中取,而是去数据库中找。可以这么理解,一级缓存就是跟着一个SqlSession对象的。上面那种情况已经是一个新的SqlSession对象了,所以取不到前一个SqlSession对象一级缓存中的数据。还需要注意的是,update操作是会刷新一级缓存的。执行了update,该SqlSession对象的一级缓存区域是会刷新的。
接下来是二级缓存。正是因为一级缓存的的作用域太小了,就有了二级缓存,它默认情况下没有开启,需要我们手动开启,直接在mybatis的配置文件中加一个cache的标签即可。标签中也可以设置一些属性,就比如最多缓存多少数据呀,隔多少时间刷新一次缓存区呀…
二级缓存的作用域是一个namespace ,也就是一个mapper文件。首先是SqlSession对象查询数据库,查询完后将数据保存在一级缓存,在close之前将数据保存在二级缓存中。查询数据的顺序是先从二级缓存中找,然后是一级缓存,再然后是数据库,然后保存至一级缓存,再推送至二级缓存。
就这样,因为是手机写的这篇博客,就没有什么样式了,直接是纯文本,见谅。