Mybatis的一级缓存
一级缓存是++sqlSession++级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问
使一级缓存失效的四种情况:
- 不同的SqlSession对应不同的一级缓存
- 同一个SqlSession但是查询条件不同
- 同一个SqlSession两次查询期间执行了任何一次增删改操作
- 同一个SqlSession两次查询期间手动清空了缓存
java
SqlSession session = sqlSessionFactory.openSession();
// 第一次查询,缓存为空
User user1 = session.selectOne("com.example.UserMapper.selectUserById", 1);
// 第二次查询,缓存命中
User user2 = session.selectOne("com.example.UserMapper.selectUserById", 1);
// 此时 user1 和 user2 引用的是相同的对象,因为一级缓存命中
assert user1 == user2;
session.close(); // 关闭后一级缓存失效
Mybatis的二级缓存
二级缓存是++SqlSessionFactory++级别,通过同一个SqlSessionFactory创建的SqlSession查询结果会被缓存;此后若再执行相同的查询语句,结果就会从缓存中获取
二级缓存开启的条件:
- 在核心配置文件中,设置全局配置属性cacheEnable="true",默认为true,不需要设置
- 在映射文件中设置标签<cache/>
- 二级缓存必须在SqlSession关闭或提交之后有效
- 查询的数据所转换的实体类必须实现序列化的接口
使二级缓存失效的情况:
两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效
全局配置
XML
<configuration>
<!-- 启用二级缓存 -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
mapper配置
XML
<mapper namespace="com.example.UserMapper">
<!-- 启用二级缓存 -->
<cache/>
<!-- SQL 映射 -->
<select id="selectUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
总结
一级缓存 :作用于同一个 SqlSession
,默认启用,简单有效。
二级缓存 :作用于整个 Mapper,跨 SqlSession
共享缓存,需要手动启用。
缓存的优势:减少数据库访问次数,提升查询效率。
缓存的使用:合理配置缓存策略,确保数据的一致性和及时更新。