mybatis-测试一级缓存
1.在mybatis-config.xml中加入日志
2.在UserMapper接口中添加方法
//根据id查询用户
User queryUserById(@Param("id") int id);
3.编写对应的 UserMapper.xml
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 user set name = #{name},pwd = #{pwd} where id = #{id}
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结果分析
手动清除缓存之后,第二次查询要重新从数据库中查询