【java面试100问】85 请你介绍一下mybatis的缓存机制?

文摘   2025-01-19 07:59   天津  

 

MyBatis是一款优秀的持久层框架,它提供了缓存机制来优化数据库查询,提高性能。

MyBatis的缓存机制主要分为一级缓存和二级缓存。

一级缓存

一级缓存是SqlSession级别的缓存,也就是说,它只在当前SqlSession中有效。

一级缓存默认是开启的,不需要我们手动配置。当你使用SqlSession进行查询时,如果下一次再使用相同的SqlSession进行查询,MyBatis会直接从缓存中取数据,而不是再去数据库查询。这样可以大大减少数据库访问次数,提高性能。

一级缓存的失效情况

  1. 1. 当你在同一个SqlSession中执行了增删改操作(如insert、update、delete)后,一级缓存会失效。

因为增删改操作可能会改变数据库中的数据,为了保证数据的一致性,MyBatis会清空一级缓存。 2. 如果你在同一个SqlSession中执行了不同的查询语句,或者查询语句的参数不同,也会导致一级缓存失效。

  1. 3. 手动调用sqlSession.clearCache()方法也会清空一级缓存。

二级缓存

二级缓存是mapper级别的缓存,也就是说,多个SqlSession可以共享一个mapper的二级缓存。

二级缓存需要我们手动开启和配置。在mapper.xml文件中添加标签,或者在注解的mapper接口上使用@CacheNamespace注解,就可以开启二级缓存。

二级缓存的特点

  1. 1. 二级缓存可以跨SqlSession和跨事务使用,提供了更广泛的缓存范围。
  2. 2. 使用二级缓存时,实体类需要实现Serializable接口,因为二级缓存可能会使用到序列化技术。

二级缓存的失效情况

  1. 1. 在同一个namespace中执行了增删改操作后,二级缓存会失效。
  2. 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月有效)


推荐文章:

推荐java面试100题讲解源文件

推荐Spring Cloud Alibaba笔记


夏壹分享
系统化技术讲解,每日精进,为后端技术人员打造的知识充电站!
 最新文章