一级缓存作用于单独的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后会刷新当前会话的所有一级缓存,其他会话则不受影响。