mybatis-测试一级缓存

1.在mybatis-config.xml中加入日志

<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

2.在UserMapper接口中添加方法

//根据id查询用户
User queryUserById(@Param("id") int id);

3.编写对应的 UserMapper.xml

<mapper namespace="com.lv.dao.UserMapper">
<select id="queryUserById" resultType="user">
select * from user where id=#{id}
</select>
</mapper>

4.测试

@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
System.out.println(user);
System.out.println("==================================================");
User user2 = mapper.queryUserById(1);
System.out.println(user2);
System.out.println(user == user2);
sqlSession.close();
}

5.结果分析

在同一个sqlSession中,查询两次相同的数据,却只查询了一次数据库,并且返回的两个User对象完全相同,证明第二次查询是查询了缓存中的数据.

6.一级缓存失效的四种情况

6.1sqlSession不同

6.1.1测试

@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
SqlSession sqlSession1 = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
System.out.println(user);
System.out.println("==================================================");
User user1 = mapper1.queryUserById(1);
System.out.println(user1);
System.out.println(user == user1);
sqlSession.close();
}

6.1.2结果分析

查询了两次数据库,说明缓存失效了.

6.2查询条件不同

6.2.1测试

@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
System.out.println(user);
System.out.println("==================================================");
User user1 = mapper.queryUserById(2);
System.out.println(user1);
System.out.println(user == user1);
sqlSession.close();
}

6.2.2结果分析

查询的两次数据是不同的,第二次要查询的数据缓存中并不存在,所以查询了两次数据库,并且返回的对象也是不同

6.3两次查询之间执行了增删改操作

6.3.1在UserMapper接口中添加一个修改方法

//修改用户
int updateUser(User user);

6.3.2编写对应的UserMapper.xml

<update id="updateUser" parameterType="user">
update user set name = #{name},pwd = #{pwd} where id = #{id}
</update>

6.3.3测试

@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
System.out.println(user);
mapper.updateUser(new User(5,"11","22"));
System.out.println("==================================================");
User user1 = mapper.queryUserById(2);
System.out.println(user1);
System.out.println(user == user1);
sqlSession.close();
}

6.3.4结果分析

在两次查询的中间,对数据库进行了更新操作,导致第二次查询不使用缓存,而是重新查询了数据库,因为更新之后数据库的数据可能有变化

6.4手动清除一级缓存

6.4.1测试

@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
System.out.println(user);
//手动清除缓存
sqlSession.clearCache();
System.out.println("==================================================");
User user1 = mapper.queryUserById(2);
System.out.println(user1);
System.out.println(user == user1);
sqlSession.close();
}

6.4.2结果分析

手动清除缓存之后,第二次查询要重新从数据库中查询

相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示