Mybatis 中的一级,二级缓存 - 面试宝典
Mybatis 中的一级缓存和二级缓存是用于提高数据库访问性能的机制。 一级缓存是指在同一个 SqlSession 中,执行相同的查询语句时,Mybatis 会将查询结果缓存起来。这样,当再次执行相同的查询时,Mybatis 会直接从缓存中取出结果,而不需要再次访问数据库。一级缓存是默认开启的,它的生命周期与 SqlSession 一致。 二级缓存是指在多个 SqlSession 中,执行相同的查询语句时,Mybatis 会将查询结果缓存起来。这样,当再次执行相同的查询时,Mybatis 会先从二级缓存中查找,如果存在缓存结果,则直接返回,而不需要再次访问数据库。二级缓存是需要手动配置的,可以配置在 Mybatis 的配置文件中,并且可以配置使用哪种缓存实现。 一级缓存和二级缓存的区别在于范围和生命周期。一级缓存的范围是 SqlSession,生命周期是和 SqlSession 一致;而二级缓存的范围是 Mapper,生命周期是和应用程序一致。 需要注意的是,尽管缓存可以提高查询性能,但也可能导致数据不一致的问题。因此,在使用缓存时,需要根据具体的业务需求来进行配置和管理,以保证数据的准确性。
下面是一个示例代码,演示了如何使用 Mybatis 中的一级和二级缓存: 首先,创建一个 User 实体类:
javaCopy codepublic class User {
private Long id;
private String name;
// 省略其他属性、构造方法和 getter/setter 方法
}
接下来,创建一个 UserMapper 接口,定义查询用户的方法:
javaCopy codepublic interface UserMapper {
User getUserById(Long id);
}
然后,创建一个 UserMapper.xml 文件,配置对应的 SQL 语句:
xmlCopy code<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserById" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
接下来,配置 Mybatis 的配置文件,开启二级缓存,并指定缓存实现类:
xmlCopy code<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<typeAliases>
<typeAlias type="com.example.entity.User" alias="User"/>
</typeAliases>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>
最后,使用如下代码进行测试:
javaCopy codepublic class Main {
public static void main(String[] args) {
// 创建 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 创建 SqlSession
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
// 获取 UserMapper 对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 第一次查询,会从数据库中获取数据
User user1 = userMapper.getUserById(1L);
System.out.println(user1);
// 第二次查询,会从一级缓存中获取数据
User user2 = userMapper.getUserById(1L);
System.out.println(user2);
// 关闭一级缓存,再次查询,会从数据库中获取数据
sqlSession.clearCache();
User user3 = userMapper.getUserById(1L);
System.out.println(user3);
// 关闭 SqlSession,再次查询,会从二级缓存中获取数据
}
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user4 = userMapper.getUserById(1L);
System.out.println(user4);
}
}
}
以上代码演示了如何使用 Mybatis 中的一级和二级缓存。在第一次查询时,会从数据库中获取数据,并将结果缓存到一级缓存中;在第二次查询时,会直接从一级缓存中获取数据。当清除一级缓存后,再次查询时,会从数据库中获取数据,并将结果缓存到一级缓存中。在关闭 SqlSession 后,再次打开一个新的 SqlSession,查询时会从二级缓存中获取数据。
- 点赞
- 收藏
- 关注作者
评论(0)