缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力。mybatis 提供了对缓存的支持, 分为一级缓存和二级缓存。 在默认的情况下,只开启一级缓存(一级缓存是对同一个 SqlSession 而言的)。
一级缓存
1、同一个 SqlSession 对象, 在参数和 SQL 完全一样的情况先, 只执行一次 SQL 语句(如果缓存没有过期)。也就是只有在参数和 SQL 完全一样的情况下, 才会有这种情况。
2、不同的 SqlSession 之间的缓存是相互隔离的;
3、用一个 SqlSession, 可以通过配置使得在查询前清空缓存flushCache;
4、使用UPDATE, INSERT, DELETE 语句会清空缓存flushCache。操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。
5、一级缓存是不能关闭的,但可以设置flushCache=true强制清除缓存。
二级缓存
一级缓存实际中基本没啥作用, 因为要保证同一个 sqlsession。如果真要用缓存,还是在二级缓存上,可以使用一些第三方的缓存工具。在 mybatis 中,二级缓存有全局开关和分开关。
全局开关
全局开关, 在 mybatis-config.xml 中如下配置:复制收展XML<!--开启二级缓存 -->
<settings>
<!--全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存。 -->
<setting name="cacheEnabled" value="true"/>
</settings>
- 1
- 2
- 3
- 4
- 5
分开关
分开关就是说在 *Mapper.xml 中开启或关闭二级缓存, 默认是不开启的。
复制收展XML<mapper namespace="cn.hpu.mybatis.mapper.UserMapper">
<!-- 开启本mapper namespace下的二级缓存 -->
<cache></cache>
<!-- 或 -->
<cache type="org.apache.ibatis.cache.impl.PerpetualCache"></cache>
</mapper>
- 1
- 2
- 3
- 4
- 5
- 6
PerpetualCache这个类是mybatis默认实现缓存功能的类。我们不写type就使用mybatis默认的缓存,也可以去实现 Cache 接口来自定义缓存。
属性 flushCache、useCache
(1)select标签
flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。
useCache默认为true,表示会将本条语句的结果进行二级缓存。
当为select语句的时候,如果没有去配置flushCache、useCache,那么默认是启用缓存的,如果有必要,就禁用二级缓存useCache=”false” 。
(2)insert、update、delete 标签
flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。
且useCache属性在该情况下没有。
配置二级缓存 useCache
在查询标签上开启后或关闭二级缓存。
<select ... useCache="true"/>
刷新缓存flushCache
刷新缓存是清空这个 SqlSession 的所有缓存, 不单单是某个键。
<select ... flushCache="false" />