介绍

默认情况下,Mybatis 只开启一级缓存,一级缓存只是相对于同一个 SqlSession 而言。所以在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象连续调用同一个 Mapper 方法,往往只执行一次SQL,不会再次发送 SQL 到数据库。

源码

DefaultSqlSession selectList 方法

public class DefaultSqlSession implements SqlSession {

  public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
    MappedStatement ms = configuration.getMappedStatement(statement);
    return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
  }
}

BaseExecutor query 方法

public abstract class BaseExecutor implements Executor {

  protected PerpetualCache localCache;

  public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler){
    BoundSql boundSql = ms.getBoundSql(parameter);
    CacheKey key = createCacheKey(ms, parameter, rowBounds, boundSql);
    return query(ms, parameter, rowBounds, resultHandler, key, boundSql);
  }

public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql){
    List<E> list;
    // 一级缓存中取数据
    list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;
    if (list != null) {
      handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
    } else {
      list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
    }
    return list;
  }
}

PerpetualCache getObject 方法

public class PerpetualCache implements Cache {
  //一级缓存的本质就是一个 HashMap
  private final Map<Object, Object> cache = new HashMap();

  public Object getObject(Object key) {
    return this.cache.get(key);
  }
}

相关文章:

  • 2021-06-26
  • 2021-04-17
  • 2021-04-27
  • 2021-05-21
猜你喜欢
  • 2021-09-18
  • 2023-04-07
  • 2021-12-11
  • 2022-12-23
  • 2021-11-19
  • 2021-12-20
相关资源
相似解决方案