一级缓存(默认开启)
- MyBatis的一级缓存是SqlSession级别的,即通过同一个SqlSession查询的数据会被缓存
- 再次使用同一个SqlSession查询同一条数据,会从缓存中获取
1、代码验证一级缓存
@Test
public void testFirstLevelCache() {
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
// 1.第一次查询
Employee employee1 = mapper.selectEmployeeById(2);
log.debug("employee1 = " + employee1);
// 2.第二次查询
Employee employee2 = mapper.selectEmployeeById(2);
log.debug("employee2 = " + employee2);
// 3.经过验证发现,两次查询返回的其实是同一个对象
log.debug("(employee2 == employee1) = " + (employee2 == employee1));
log.debug("employee1.equals(employee2) = " + employee1.equals(employee2));
log.debug("employee1.hashCode() = " + employee1.hashCode());
log.debug("employee2.hashCode() = " + employee2.hashCode());
}
2、一级缓存失效的情况
- 不是同一个SqlSession
- 同一个SqlSession但是查询条件发生了变化
- 同一个SqlSession两次查询期间执行了任何一次增删改操作
- 同一个SqlSession两次查询期间手动清空了缓存
- 同一个SqlSession两次查询期间提交了事务