MyBatis是一款优秀的持久层框架,它提供了缓存机制来优化数据库查询,提高性能。
MyBatis的缓存机制主要分为一级缓存和二级缓存。
一级缓存
一级缓存是SqlSession级别的缓存,也就是说,它只在当前SqlSession中有效。
一级缓存默认是开启的,不需要我们手动配置。当你使用SqlSession进行查询时,如果下一次再使用相同的SqlSession进行查询,MyBatis会直接从缓存中取数据,而不是再去数据库查询。这样可以大大减少数据库访问次数,提高性能。
一级缓存的失效情况:
1. 当你在同一个SqlSession中执行了增删改操作(如insert、update、delete)后,一级缓存会失效。
因为增删改操作可能会改变数据库中的数据,为了保证数据的一致性,MyBatis会清空一级缓存。 2. 如果你在同一个SqlSession中执行了不同的查询语句,或者查询语句的参数不同,也会导致一级缓存失效。
3. 手动调用 sqlSession.clearCache()
方法也会清空一级缓存。
二级缓存
二级缓存是mapper级别的缓存,也就是说,多个SqlSession可以共享一个mapper的二级缓存。
二级缓存需要我们手动开启和配置。在mapper.xml文件中添加
标签,或者在注解的mapper接口上使用@CacheNamespace
注解,就可以开启二级缓存。
二级缓存的特点:
1. 二级缓存可以跨SqlSession和跨事务使用,提供了更广泛的缓存范围。 2. 使用二级缓存时,实体类需要实现 Serializable
接口,因为二级缓存可能会使用到序列化技术。
二级缓存的失效情况:
1. 在同一个namespace中执行了增删改操作后,二级缓存会失效。 2. 在不同的namespace中执行操作,不会影响其他namespace的二级缓存。
示例代码
下面通过一个简单的示例来演示MyBatis的缓存机制。
首先,创建一个实体类User:
public class User {
private Long id;
private String name;
private Integer age;
// 省略getter和setter方法
}
然后,创建一个UserMapper接口:
public interface UserMapper {
User getUserById(Long id);
}
在UserMapper.xml文件中编写SQL语句:
<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserById" resultType="com.example.model.User">
select * from user where id = #{id}
</select>
</mapper>
在MyBatis的配置文件中开启缓存:
<settings>
<setting name="cacheEnabled" value="true"></setting>
</settings>
然后,通过UserMapper接口的getUserById
方法进行查询,查询结果会被缓存。
在同样的查询条件下,第二次查询会直接从缓存中获取数据,而不需要再访问数据库。
总结
MyBatis的缓存机制通过减少数据库访问次数,大大提高了系统性能。
一级缓存是SqlSession级别的,默认开启;二级缓存是mapper级别的,需要手动配置。
在实际开发中,我们可以根据具体业务场景,合理使用缓存机制,以提高系统性能。
你诺喜欢,请点个关注哦
大家可以发送消息:202501
领取计算机黑皮书191本(1月有效)
推荐文章: