mybatis 的interceptorChain是給擴展用的, 常用的比如分頁擴展插件. mybatis提供的rowbounds實質(zhì)上是采用 fetchSize, rs.next 這種方式. 其性能很差. (實際上就是游標(biāo), .next() 一點點向下滾動)
其采用了反射,一個典型的Interceptor
@Intercepts({
@Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class,
RowBounds.class, ResultHandler.class }),
@Signature(type = Executor.class, method = "close", args = { boolean.class }) })
public class MyBatisInterceptor implements Interceptor {
private Integer value;
@Override
public Object intercept(Invocation invocation) throws Throwable {
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
//do something
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
//do something
}
}
比如分頁插件可以通過增強以下接口實現(xiàn)
public interface StatementHandler {
<E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException;
BoundSql getBoundSql();
}
詳情請參見分頁插件源碼