一级缓存作用于单独的SqlSession,如果一个对象之前被查询过,那么再次调用同一个查询语句会直接返回之前查询的对象的地址,这也代表如果之前修改了查询出来的对象,二次查询得到的也是修改过的:
public static void main(String[] args) {
try ( SqlSession sqlSession= MybatisUtil.getSqlSession(false)) {
TestMapper testMapper = sqlSession.getMapper(TestMapper.class);
Teacher teacher = testMapper.getTeacherById(1);
Teacher teacher1 = testMapper.getTeacherById(1);
System.out.println(teacher == teacher1);
System.out.println(teacher);
teacher.setName("卢本伟");
System.out.println(teacher1);
}
}
也就是说,只要经过一次查询并映射到对象后,Mybatis会自动缓存得到的对象并复用。
当然,如果缓存后通过DML修改了数据库对象,那么再次查询时会重新获取一次并更新缓存,且DML后会刷新当前会话的所有一级缓存,其他会话则不受影响。