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结果分析

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

相关