一级缓存
一级缓存默认开启 为SqlSession
查询之后有缓存,二次查询直接调用缓存
例如如下这个测试程序
@Test
public void getUserByID(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User userByID = mapper.getUserByID(1);
System.out.println(userByID);
System.out.println("***********************************");
User userByID1 = mapper.getUserByID(1);
System.out.println(userByID1);
//判断地址
System.out.println(userByID==userByID1);
sqlSession.close();
}
结果
从下图可以看出,两个内存地址是相等的,而且sql语句也没有执行第二次,而是直接调用缓存的
但是也有缓存失效的时候
想查询之后更新,缓存会失效
测试如下:添加了一个更新语句
@Test
public void getUserByID(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User userByID = mapper.getUserByID(1);
System.out.println(userByID);
//更新语句
mapper.UpdateUser(new User(2,"阿杰","321311"));
// 手动清除缓存
// sqlSession.clearCache();
System.out.println("***********************************");
User userByID1 = mapper.getUserByID(1);
System.out.println(userByID1);
System.out.println(userByID==userByID1);
sqlSession.close();
}
结果
我们可以发现sql语句执行了三次,并不是向上面那样,查询过后,第二次查询直接调内存,而是直接走数据库,由此我们发现查询过后,执行更新语句,会让缓存失效