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的方法调度完成后,后面要进行的事情

results matching ""

    No results matching ""