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应用必不可少的技术