MyBatis 的三种缓存策略分别是什么?

MyBatis 支持三种缓存策略:

  1. 缓存不生效(实际上还是有一级缓存)
    通过设置 实现:
<select id="getUser" resultType="com.some.example.User">
    select * from users where id = #{id}  
<cache-ref />  
</select>
  1. 只启用本地缓存(一级缓存)
    通过设置 scope=”local” 实现:
<select id="getUser" resultType="com.some.example.User">   
    select * from users where id = #{id}   
<cache scope="local"/>
</select>
  1. 启用本地缓存和全局缓存(二级缓存)
    通过设置 scope=”session” 实现:
<select id="getUser" resultType="com.some.example.User">   
    select * from users where id = #{id}  
<cache scope="session"/>
</select>

这三种策略的区别是:

  • 缓存不生效:不使用任何缓存
  • 只启用本地缓存:只使用 SqlSession 级别的缓存
  • 启用本地缓存和全局缓存:同时使用一级缓存和二级缓存

总的来说:

  • 一级缓存默认开启,不需要显式配置。
  • 二级缓存需要在 SqlSessionFactoryBuilder中开启,再在映射文件设置。
  • scope=”local” 只使用一级缓存
  • scope=”session”同时使用一、二级缓存