1.properties文件中配置auto-page,默认是false
ftf.mybatis.auto-page=true
2.看一下CoreSqlSessionFactoryBean这个类
如果配置auto-page=true,则添加一个拦截器PageLocalInterceptor
/**
* 扩展MyBatis的SqlSessionFactoryBean <br>
* 添加了MyBatis的插件以及一些配置
*
* @author henry
* @version 9.0.2
* @CreateDate Jun 6, 2017
*/
public class CoreSqlSessionFactoryBean extends SqlSessionFactoryBean {
/**
* 配置
*/
@Autowired
private Settings settings;
/**
* 插件管理 <br>
*
* @return <br>
* @author henry<br>
* @taskId <br>
*/
private Interceptor[] interceptors() {
List<Interceptor> interceptors = new ArrayList<>(5);
// 1、分页插件
PageInterceptor pageInterceptor = new PageInterceptor();
pageInterceptor.setProperties(new Properties());
interceptors.add(pageInterceptor);
// 4、设置分页线程上线文
if (settings.isAutoPage()) {
PageLocalInterceptor pageLocalInterceptor = new PageLocalInterceptor();
interceptors.add(pageLocalInterceptor);
}
。。。。。。
return interceptors.toArray(new Interceptor[0]);
}
}
3.看一下拦截器PageLocalInterceptor 的功能:
/**
* 设置分页线程上线文
* 根据传过来的start、rows开始分页
*
* @author Henry
* @version 9.0.3
* @CreateDate 28/06/2017
*/
@Intercepts({
@Signature(type = Executor.class, method = "query", args = {
MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class
}),
@Signature(type = Executor.class, method = "query", args = {
MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class
})
})
public class PageLocalInterceptor extends AbstractInterceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object[] queryArgs = invocation.getArgs();
Object parameter = queryArgs[1];
if (parameter != null) {
Integer[] pages = null;
if (parameter instanceof ParamMapParameterHandler.CoreParamMap
|| parameter instanceof ParamMapParameterHandler.CoreHashMap || parameter instanceof BaseBean) {
// 1、被ParamMapParamHandler处理过的参数 或者 直接是BaseBean对象
pages = getPages(parameter);
}
else if (parameter instanceof MapperMethod.ParamMap) {
// 2、如果是ParamMap对象,里面有可能含有BaseBean对象,所以需要循环处理
Map<String, Object> paramMap = (Map<String, Object>) parameter;
for (Map.Entry<String, Object> objectEntry : paramMap.entrySet()) {
Object value = objectEntry.getValue();
if (value instanceof BaseBean) {
pages = getPages(value);
if (pages != null) {
break;
}
}
}
}
if (ArrayUtils.isNotEmpty(pages)) {
PageHelper.startPage(pages[0], pages[1]);
}
}
return invocation.proceed();
}
/**
* 分页信息
*
* @param parameter parameter
* @return Integer[]
*/
private Integer[] getPages(Object parameter) {
MetaObject metaObject = SystemMetaObject.forObject(parameter);
int pageIndex = NumberUtils.toInt(String.valueOf(MapperHelper.getValue(metaObject, PageBean.PAGE_INDEX)));
int pageSize = NumberUtils.toInt(String.valueOf(MapperHelper.getValue(metaObject, PageBean.PAGE_SIZE)));
boolean pageTotal = BooleanUtils.toBoolean(String.valueOf(MapperHelper.getValue(metaObject, PageBean.PAGE_TOTAL)));
if (pageTotal) {
return new Integer[]{1, -1};
}
else if (pageIndex != 0 && pageSize != 0) {
return new Integer[]{pageIndex, pageSize};
}
return new Integer[0];
}
}
4.返回信息处理统一包装成PageInfo
/**
* 包装分页后返回值
*
* @author Henry
* @version 9.0.3
* @CreateDate 11/07/2017
*/
public class PageInfoHandlerMethodReturnValueHandler implements HandlerMethodReturnValueHandler {
/**
* delegate
*/
private final HandlerMethodReturnValueHandler delegate;
/**
* build
*
* @param delegate delegate
*/
public PageInfoHandlerMethodReturnValueHandler(HandlerMethodReturnValueHandler delegate) {
this.delegate = delegate;
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return delegate.supportsReturnType(returnType);
}
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
if (returnValue instanceof Page && returnValue != null) {
Page page = (Page) returnValue;
if (page.isCount() || page.getPageSize() < 0) {
// 如果分页需要总数或者只要总数时才需要包装PageInfo
returnValue = new PageInfo((List) returnValue);
}
}
delegate.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
}
}
HandlerMethodReturnValueHandler是RequestMappingHandlerAdapter用来处理当含有@RequestMapping的方法调度完成后,后面要进行的事情