在mybatis中,缓存有两种。一种是一级缓存,一种是二级缓存。
一级缓存是存在于sqlSession对象中的,只要sqlSession对象还在,sqlSession对象产生的代理对象就可以拿得到一级缓存的数据。当sqlSession对象被回收或者调用clearCache()方法清理缓存时,该SqlSession对象的一级缓存的数据就会被清空。
二级缓存是存在于生产sqlSession对象的工厂SqlSessionFactory的实例化对象factory中。所有同一个factory生产的sqlSession对象都可以拿到二级缓存的数据,但是二级缓存默认是关闭的。如果想要开启二级缓存,需要以下三个步骤:
首先,在主配置文件SqlMapConfig中配置:
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
然后在接口对应的配置文件中打开二级缓存
<!--开启user支持二级缓存-->
<cache/>
在该配置文件的sql语句中添加(useCache=“true”)打开二级缓存,例:
<select id="findById" parameterType="INT" resultType="user" useCache="true">
select * from user where id = #{uid}
</select>
总结:
一级缓存和二级缓存的级别应该是基于代理对象的,代理对象的上一级是SqlSession,所以称之为一级缓存,一级缓存存在于SqlSession对象中。而factory又是生产SqlSession的,也就是代理对象的上一级的上一级,就是二级缓存,二级缓存存在于factory中。
一级缓存存在于SqlSession中,所以同一个SqlSession对象产生的代理对象都可以拿到SqlSession中的缓存数据。二级缓存存在于factory中,同一个factory产生的各个SqlSession产生的所有代理对象都可以拿到factory中的缓存数据。
在不清理缓存的情况下,sqlSession对象在,其对应的一级缓存就在;factory对象在,其对应的二级缓存就在。
一级缓存是默认打开的,可以直接拿来用,而二级缓存则需要手动打开。
因篇幅问题不能全部显示,请点此查看更多更全内容