最近在写一个分页查询接口用到了分页插件PageHelper,代码很简单,原来没有看懂原理,就debug进去看了一下源代码,记录一下
@Override
public PageInfo<ProductZTDTO> getListByCategory(ProductXJZTParamDTO productXJZTParamDTO){
List<String> categoryCodes = this.getCategory(productXJZTParamDTO);
Page page = PageHelper.startPage(productXJZTParamDTO.getPageNum(), productXJZTParamDTO.getPageSize());
List<ProductZTDTO> productZTDTOS = productInfoMapper.selectByCategoryCodes(productXJZTParamDTO);
PageInfo pageInfo = new PageInfo(page);
pageInfo.setList(productZTDTOS);
return pageInfo;
}
关键代码就三行,逐行分析
第一行获取Page对象,调用PageHelper.startPage方法
Page page = PageHelper.startPage(productXJZTParamDTO.getPageNum(), productXJZTParamDTO.getPageSize());
一步步debug到看PageHelper里面方法的实现
/**
* 开始分页
*
* @param pageNum 页码
* @param pageSize 每页显示数量
* @param count 是否进行count查询
* @param reasonable 分页合理化,null时用默认配置
* @param pageSizeZero true且pageSize=0时返回全部结果,false时分页,null时用默认配置
*/
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
Page<E> page = new Page<E>(pageNum, pageSize, count);
page.setReasonable(reasonable);
page.setPageSizeZero(pageSizeZero);
//当已经执行过orderBy的时候
Page<E> oldPage = getLocalPage();
if (oldPage != null && oldPage.isOrderByOnly()) {
page.setOrderBy(oldPage.getOrderBy());
}
setLocalPage(page);
return page;
}
这一步首先new 了一个page对象&#x