use of org.apache.ibatis.session.RowBounds in project mybatis.flying by limeng32.
the class EnhancedCachingInterceptor method processQuery.
/**
* when executing a query operation 1. record this statement's id and it's
* corresponding Cache Object into Global Caching Manager; 2. record this
* statement's id and
*
* @param invocation
* @return
* @throws Throwable
*/
protected Object processQuery(Invocation invocation) throws Throwable {
Object result = invocation.proceed();
if (cachingManager.isCacheEnabled()) {
Object[] args = invocation.getArgs();
MappedStatement mappedStatement = (MappedStatement) args[0];
// 如果本条statementId表示的查询语句配置了 flushCache=true,则清空querCacheOnCommit缓存
if (mappedStatement.isFlushCacheRequired()) {
queryCacheOnCommit.clear();
}
// 和对应的二级缓存对象映射关系添加到全局缓存映射管理器中
if (mappedStatement.isUseCache() && mappedStatement.getCache() != null) {
cachingManager.appendStatementCacheMap(mappedStatement.getId(), mappedStatement.getCache());
}
Object parameter = args[1];
RowBounds rowBounds = (RowBounds) args[2];
Executor executor = (Executor) invocation.getTarget();
BoundSql boundSql = mappedStatement.getBoundSql(parameter);
FlyingModel flyingModel = CookOriginalSql.fetchFlyingFeature(boundSql.getSql());
// 记录本次查询所产生的CacheKey
CacheKey cacheKey = createCacheKey(mappedStatement, parameter, rowBounds, boundSql, executor);
if (flyingModel.isHasFlyingFeature()) {
switch(flyingModel.getActionType()) {
case count:
cacheKey.update(DigestUtils.md5Hex(JSON.toJSONString(parameter)));
break;
case selectAll:
cacheKey.update(DigestUtils.md5Hex(JSON.toJSONString(parameter)));
break;
case selectOne:
cacheKey.update(DigestUtils.md5Hex(JSON.toJSONString(parameter)));
break;
default:
break;
}
}
queryCacheOnCommit.putElement(mappedStatement.getId(), cacheKey);
/* 处理分页 */
ResultHandler resultHandler = (ResultHandler) args[3];
Executor executorProxy = (Executor) invocation.getTarget();
MetaObject metaParameter = MetaObject.forObject(parameter, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, DEFAULT_REFLECTOR_FACTORY);
MetaObject metaExecutor = MetaObject.forObject(executorProxy, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, DEFAULT_REFLECTOR_FACTORY);
/* 当需要分页查询时,缓存里加入page信息 */
// if (metaParameter.getOriginalObject() instanceof Conditionable) {
Cache cache = mappedStatement.getCache();
Object value = cache.getObject(cacheKey);
if (metaExecutor.hasGetter("delegate")) {
TransactionalCacheManager tcm = (TransactionalCacheManager) metaExecutor.getValue("tcm");
Executor delegate = (Executor) metaExecutor.getValue("delegate");
Object list = delegate.query(mappedStatement, parameter, rowBounds, resultHandler, cacheKey, boundSql);
if (value != null) {
return value;
} else {
tcm.putObject(cache, cacheKey, list);
return list;
}
}
// }
}
return result;
}
Aggregations