一级缓存
一级缓存是mybatis自带的缓存,mybatis每次在查询后,会将语句和参数相同的查询SQL的结果集存放进缓存,待下一次有相同的语句和参数时,mybatis直接将缓存内的结果集返回,而不再查询数据库。如果对于缓存的数据对应的表有增删改操作的话,缓存自动清空。
一级缓存和二级缓存的区别:
1.一级缓存在于一个SqlSession之内,二级缓存在于不同的SqlSession之间
2. 一级缓存不需要手动开启,属于默认开启状态;二级缓存需要手动开启
相同点:
1.在增删改SQL之后,缓存会自动清空
2. flushCache="true"的查询语句查询内容不存放进缓存
失效策略:当执行SQL时候两次查询中间发生了增删改的操作,即insert、update、delete等操作commit后会清空该SQLSession缓存; 比如sqlsession关闭,或者清空等
测试代码:
@Test
public void testSqlsession(){
if(sqlSession!=null){
User user=userMapper.selectByid(20184144);
//查询数据库
System.out.println("第一次查询"+user.toString());
//同一个session中,执行相同语句,且参数不变,mybatis默认首先从一级缓存中查找,而不是先从数据库中去查找,如果没有,则查询数据库
System.out.println("第二次查询"+user.toString());
//执行同一个session下的相同的sql的语句,但参数值不一样,然后再次去查找数据库
User user1=userMapper.selectByid(33);
System.out.println("第san次查询"+user1.toString());
}
}
测试结果;