所有 insert/update/delete
语句都会导致缓存被清除。
1. 一级缓存
一级缓存是针对数据库会话的,用于优化在一次数据库会话里多次执行同样的 SQL。
有两种范围:
- SESSION:会话级,默认的。
- STATEMENT:语句级,每次执行完 mapper 中的语句后都清除一级缓存,其实就是禁用这个语句的一级缓存。
如果要在全局更改一级缓存的范围,需要在 MyBatis 的配置文件中设置:
<setting name="localCacheScope" value="STATEMENT"/>
2. 二级缓存
二级缓存是针对 Mapper 级别的,默认是启用的,但生效的话要对每个 Mapper 进行配置,Mapper 里没有配置的不使用二级缓存。
注意:如果在多个 Mapper 中存在对同一个表的操作,那么这几个 Mapper 的缓存数据可能会出现不一致现象。
<!-- 不启用的话在配置文件中指定如下 -->
<settings>
<setting name="cacheEnabled" value="false" />
</settings>
<!-- Mapper 文件里配置 cache 元素以生效 -->
<mapper namespace="...UserMapper">
<!-- 默认对该 Mapper 文件里的所有查询使用二级缓存 -->
<cache/>
<!-- 该select语句不使用缓存 -->
<select id="selectAbc" useCache="false">
...
</select>
</mapper>