PageHelper应用原理?
PageHelper底层基于mybatis框架中的拦截器规范,做了一个分页拦截器的具体实现,假如我们调用了PageHelper.startPage()方法,底层会在mybatis层面启动一拦截器,在拦截器中对sql查询进行拦截,拦截到sql以后,对sql进行处理
pom.xml配置
<!-- pagehelper -->
<!-- 版本使用参考MVNrepository -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot</artifactId>
<version>1.3.0</version>
</dependency>
自定义工具类
ServletUtil
为获取Request对象,提供了便利,代码如下
package com.cy.pj.common.util;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/***
* 通过此工具类获取请求,响应等对象信息
*/
public class ServletUtil {
/**获取请求对象*/
public static HttpServletRequest getRequest(){
return getServletRequestAttributes().getRequest();
}
/**通过RequestContextHolder类型获取请求属性*/
public static ServletRequestAttributes getServletRequestAttributes(){
return (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes();
}
}
//拿到请请求后绑定到ThreadLocal中
StringUtil
提供了对字符串是否为空串的逻辑判断:
package com.cy.pj.common.util;
public class StringUtil {
public static boolean isEmpty(String str){
return str==null||"".equals(str);
}
}
PageUtil
工具类可以获取请求对象,基于请求对象,获取请求中分页参数,然后启动分页查询:
package com.cy.pj.common.util;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import javax.servlet.http.HttpServletRequest;
public class PageUtil {
/**
* 通过此方法启动分页查询
* @param <T> 这里的T为泛型,返回值类型左侧有<T>这种符号的表示方法为泛型方法
* @return
*/
public static <T>Page<T> startPage(){
//通过自定义工具类获取Request对象
HttpServletRequest request= ServletUtil.getRequest();
//页面大小(每页最多显示多少条记录)
String pageSizeStr=request.getParameter("pageSize");
//当前页码值(要查第几页的数据)
String pageCurrentStr=request.getParameter("pageCurrent");
//在此位置调用PageHelper中的一个方法启动分页
//在项目中去添加一个PageHelper依赖(后缀是starter的)
Integer pageCurrent=
StringUtil.isEmpty(pageCurrentStr)?1:Integer.parseInt(pageCurrentStr);
Integer pageSize=
StringUtil.isEmpty(pageSizeStr)?10:Integer.parseInt(pageSizeStr);
//启动PageHelper中的分页拦截器(PageInterceptor)
return PageHelper.startPage(pageCurrent,pageSize);
}
}
启动分页查询
@GetMapping
public JsonResult doFindLogs(SysLog sysLog){
return new JsonResult(
PageUtil.startPage().doSelectPageInfo(
newISelect() {
@Override
public void doSelect() {
sysLogService.findLogs(sysLog);
}
}));
}
查询结果PageInfo参数说明:
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//由于startRow和endRow不常用,这里说个具体的用法
//可以在页面中"显示startRow到endRow 共size条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List<T> list;
//前一页
private int prePage;
//下一页
private int nextPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
//导航条上的第一页
private int navigateFirstPage;
//导航条上的最后一页
private int navigateLastPage;