一级缓存:同一个SqlSession对象,MyBatis默认开启一级缓存。
如果用同样的SqlSession对象查询相同的数据,则只会在第一次查询时向数据库发送SQL语句,并将查询结果放入到SqlSession中(作为缓存存在),后续再次查询该同样的对象时,则直接从缓存中查询该对象即可(即省略了数据库的访问)。当SqlSession执行commit()方法,则清除所有缓存对象。
二级缓存:
MyBatis自带二级缓存,同一个namespace生成的mapper对象,所以只要产生的xxxMapper对象来自于同一个namespace,则这些对象共享二级缓存。
如果时同一个SqlSession对象进行多次相同的查询,则直接进入一级缓存查询;如果不是同一个SqlSession对象进行多次相同的查询(但均来自同一个namespace),则进入二级缓存查询。
MyBatis默认情况下没有开启二级缓存,需要手工打开。
第一步:在conf.xml文件中开启二级缓存
<settings>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
第二步:在具体的mapper.xml文件中声明开启
<mapper namespace="org.yao.mapper.StudentMapper">
<!-- 声明此namespace开启二级缓存 -->
<cache/>
MyBatis二级缓存是将对象放入硬盘文件中,执行缓存的对象必须实现序列化接口。
序列化:将内存的数据转换为二进制代码放入硬盘
反序列化:将硬盘中的数据放入内存
序列化Student类时,还要序列化Student类的级联属性以及父类
触发将对象写入二级缓存的时机:SqlSession的close方法。
二级缓存的禁用:
如果在mapper.xml文件中某一个select标签不用二级缓存,则使用select标签的useCache属性:useCache=”false”关闭二级缓存。
二级缓存的清理:
commit()方法可以清理缓存,一般执行增删改时会清理掉缓存,设计的原因时为了防止脏数据,在二级缓存中,commit()不能是自身sqlsession调用的commit()方法。