mybatis 的一级缓存
简单回顾下mybatis的一级缓存
本质上是一个基于map实现的内存级别的缓存,默认开启,生命周期是 sqlsession 级别的
为什么会失效
其实这个问题反向分析一下就会有思路了,一级缓存默认是sqlsession级别的,这个规则不变的情况下
既然spring 中 mybatis 缓存失效了,那么就说嘛在执行sql的时候用了不同的sqlsession
源码解析
先简单回顾下spring 是如何整和mybatis的
a.单独为mybatis写一个扫描器,并重写扫描器的扫描规则,允许扫描到接口
b.将扫描的接口对应到一个个 MapperFactoryBean
c.MapperFactoryBean 是一个 FactoryBean,那么在实际获取Mapper的时候就会调用MapperFactoryBean.getObject ()
MapperFactoryBean.getObject ()通过 mybatis 代理生成对象
很明显这个问题的入口在 MapperFactoryBean.getObject ()
MapperFactoryBean
@Override
public T getObject() throws Exception {
return getSqlSession().getMapper(this.mapperInterface);
}
public abstract class SqlSessionDaoSupport extends DaoSupport {
private SqlSession sqlSession;
private boolean externalSqlSession;
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory