@Autowired
private SqlSessionFactory sqlSessionFactory;
@Autowired
private PropertieTabMapper propertieTabMapper;
@Test
@Transactional
public void test() {
SqlSession openSession = sqlSessionFactory.openSession();
PropertieTabMapper mapper = openSession.getMapper(PropertieTabMapper.class);
List<PropertieTab> selectAll = propertieTabMapper.selectAll();
log.info("第1次查询{}",selectAll.size());
List<PropertieTab> selectAll2 = propertieTabMapper.selectAll();
log.info("第2次查询{}",selectAll2.size());
}
同一个sqlsession才会触发以及缓存。
通过注解的话需要加事物才会触发,因为事物里面会复用sqlsession。
主要是有一个Executor,Mybatis一级缓存实际上就是一个依赖于SqlSession的缓存对象,PerpetualCache里面的结构很简单,通过一个k-v结构的cache维护缓存数据。
public class PerpetualCache implements Cache {
private final String id;
private Map<Object, Object> cache = new HashMap<Object, Object>();
PerpetualCache的生命周期是和SqlSession相关的,即只有在同一个SqlSession中,一级缓存才会用到。如果会话介绍,则缓存会清空;
如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用;
如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用;
SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用;