在 CachingExecutor 中的 query 方法,如果二级缓存中没有,则调用,被装饰 executor的query 方法,在这里就是 simpleexecutor,
query 方法的默认实现是在 baseexecutor 中,在baseexecutor中有一个localCache 属性
protected PerpetualCache localCache;这个就是一级缓存,默认开启,直接看 query 发方,
我们看两个方法一个是 clearLocalCache
@Override
public void clearLocalCache() {
if (!closed) {
localCache.clear();
localOutputParameterCache.clear();
}
}
private <E> List<E> queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
List<E> list;
localCache.putObject(key, EXECUTION_PLACEHOLDER);
try {
list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql);
} finally {
localCache.removeObject(key);
}
localCache.putObject(key, list);
if (ms.getStatementType() == StatementType.CALLABLE) {
localOutputParameterCache.putObject(key, parameter);
}
return list;
}
直接看 doQuery 在子类实现
两个逻辑主要是生成 statementHandler 和 设置 statementHandler中的参数,用 statementHandler 来查询。看第一部分
设置timeOut和fetchsize。
设置sql参数。
最后直接通过jdbc接口查询