(1)分页的入口是startPage()
(2)PageUtils.startPage
public static void startPage() {
// 从HttpServletRequest中获取前端传入的参数,并设置到PageDomain对应的字段中
PageDomain pageDomain = TableSupport.buildPageRequest();
// 从PageDomain中获取pageNum、pageSize
Integer pageNum = pageDomain.getPageNum();
Integer pageSize = pageDomain.getPageSize();
// pageNum、pageSize都不为null时才进行分页
if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize))
{
// 用这则表达式验证 order by 语法是否符合规范
String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
// 获取reasonable
Boolean reasonable = pageDomain.getReasonable();
// PageHelper.startPage经过层层调用,会创建Page对象,将分页参数保存在Page对象中,
// 该Page对象最终会设置在PageMethod.LOCAL_PAGE中,LOCAL_PAGE的类型为
// ThreadLocal<Page>,在mybatis插件PageInterceptor的intercept方法中,
// 最终会从该LOCAL_PAGE中获取Page中的分页参数,拼接到SQL语句中实现分页
PageHelper.startPage(pageNum, pageSize, orderBy)
// reasonable为true:如果pageNum<=0,则将pageNum设置为1
.setReasonable(reasonable);
}
}
(3)TableSupport.getPageDomain
public static PageDomain getPageDomain() {
// 这里会从HttpServletRequest中获取前端传入的参数,并设置到PageDomain对应的字段中
PageDomain pageDomain = new PageDomain();
// 如果前端传入的pageNum、pageSize不是数值类型,那么getParameterToInt的返回值最终为null
// 设置起始页号
pageDomain.setPageNum(ServletUtils.getParameterToInt(PAGE_NUM));
// 设置每页条数
pageDomain.setPageSize(ServletUtils.getParameterToInt(PAGE_SIZE));
// 设置排序字段
pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN));
// 设置排序方向
pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC));
// 设置参数是否合理化
pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE));
return pageDomain;
}