先说结论,满足以下两点即可触发PageHelper隐式分页:
1、application.properties/application.yml中配置了pagehelper.support-methods-arguments=true
2、自定义查询对象中同时包含pageNum和pageSize属性,且可以转换成数字类型
下面从源码进行分析,为什么在进行MyBatis查询的时候,我明明没有调用PageHelper.startPage方法,但是却自动进行了分页。
1、PageHelperAutoConfiguration 自动配置类
@PostConstruct
public void addPageInterceptor() {
PageInterceptor interceptor = new PageInterceptor();
Properties properties = new Properties();
properties.putAll(this.pageHelperProperties());
properties.putAll(this.properties.getProperties());
interceptor.setProperties(properties);
Iterator var3 = this.sqlSessionFactoryList.iterator();
while(var3.hasNext()) {
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory)var3.next();
sqlSessionFactory.getConfiguration().addInterceptor(interceptor);
}
}
我们从PageHelper的自动配置类入手,在PageHelper的配置类中,会创建一个PageInterceptor拦截器。
2、PageInterceptor 分页拦截器
public Object intercept(Invocation invocation) throws Throwable {
try {
Object[] args = invocation.getArgs();
MappedStatement ms = (MappedStatement)args[0];
Object parameter = args[1];
RowBounds rowBounds = (RowBounds)args[2];
ResultHandler resultHandler = (ResultHandler)args[3];
Executor executor = (Executor)invocation.getTarget();
CacheKey cacheKey;
BoundSql boundSql;
if (args.length == 4) {
boundSql = ms.getBoundSql(parameter);
cacheKey = executor.createCacheKey(ms, parameter, rowBounds, boundSql);
} else {
cacheKey = (CacheKey)args[4];
boundSql = (BoundSql)args[5];
}