一、sqlSession相同,查询同一个id
1.在测试类中写测试方法。
//一级缓存
//1.sqlsession相同,查询同一个id
@Test
public void testQueryUserByIdf() {
SqlSession sqlSession = factory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.findUserByid(1);
User user1 = mapper.findUserByid(1);
System.out.println(user == user1);
sqlSession.close();
}
2.返回结果
3.结论
- 一级缓存是SqlSession级别的缓存,是一直开启的,我们关闭不了它。
- 一级缓存失效情况:没有使用到当前的一级缓存,效果就是,还需要再向数据库中发起一次查询请求!
二、sqlSession不同,查询相同
1.编写测试方法
//2.sqlSession不同,查询相同
@Test
public void testQueryUserById1() {
SqlSession session = factory.openSession();
SqlSession session2 = factory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
UserMapper mapper2 = session2.getMapper(UserMapper.class);
User user = mapper.findUserByid(25);
System.out.println(user);
User user2 = mapper2.findUserByid(25);
System.out.println(user2);
System.out.println(user == user2);
session.close();
session2.close();
// 结论:发送了两条SQL语句
// 每个sqlSession中的缓存相互独立
}
2.返回结果
3.结论
发送了两条SQL语句, 每个sqlSession中的缓存相互独立
三、sqlSession相同,查询不同
1.测试代码部分
@Test
public void testQueryUserById2() {
SqlSession session = factory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
UserMapper mapper2 = session.getMapper(UserMapper.class);
User user = mapper.findUserByid(1);
System.out.println(user);
User user2 = mapper2.findUserByid(2);
System.out.println(user2);
System.out.println(user == user2);
session.close();
}
2.返回结果
2.结论
- 观察结果:发现发送了两条SQL语句!
- 结论:当前缓存中,不存在这个数据
四、sqlSession相同,两次查询之间执行了增删查改操作
1.代码部分
@Test
public void testQueryUserById() {
SqlSession session = factory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.findUserByid(27);
System.out.println(user);
User useren = new User();
useren.setUsername("张鑫新");
useren.setBirthday("2003");
useren.setSex("男");
Integer integer = mapper.updateByUserID(useren);
System.out.println(integer);
User user2 = mapper.findUserByid(1);
System.out.println(user2);
System.out.println(user==user2);
session.close();
}
2、返回结果
- 结论
观察结果:查询在中间执行了增删查改操作后,重新执行了
结论:因为在增删查改操作可能会对当前数据产生影响,sqlSession相同,手动清楚一级缓存
五、sqlSession相同,手动清楚一级缓存
1.代码部分
//sqlSession相同,手动清楚一级缓存
@Test
public void testQueryUserById4() {
SqlSession session = factory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.findUserByid(1);
System.out.println(user);
session.clearCache();//手动清楚一级缓存
User user2 = mapper.findUserByid(1);
System.out.println(user2);
System.out.println(user==user2);
session.close();
}
2.返回结果