分页查询的接口
url: /admin/employee/page (GET)
请求参数:
name 员工姓名
page 页码
size 每页记录数
返回数据
code 状态码
msg 信息
data 查询的数据 (包括 total 总记录数; record 当前页 数据集合;)
返回数据处理
后端将整个返回数据封装成一个 result对象 Result< PageResult >
代码
Service层
/**
* 员工分页查询
* @param employeePageQueryDTO
* @return
*/
public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
// mybatis 的分页插件 PageHelper开发;
// select * from employee limit 0,10
//开始分页查询 (//页码 //每页显示记录数 )
PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());
Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO);
long total = page.getTotal();
List<Employee> records = page.getResult();
return new PageResult(total,records);
}
PageHelper如何实现的
传入的DTO
@Data
public class EmployeePageQueryDTO implements Serializable {
//员工姓名
private String name;
//页码
private int page;
//每页显示记录数
private int pageSize;
}
我们在使用PageHelper时, 因为我们的DTO中,已经有了页码,和每页显示的数量。
可以直接调用pagehelper的startpage方法开始分页;
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
Page<E> page = new Page(pageNum, pageSize, count);
page.setReasonable(reasonable);
page.setPageSizeZero(pageSizeZero);
Page<E> oldPage = getLocalPage();
if (oldPage != null && oldPage.isOrderByOnly()) {
page.setOrderBy(oldPage.getOrderBy());
}
setLocalPage(page);
return page;
}
通过对 startpage()方法源码追踪,最终调用的是LocalThread对象的一个setLocalPage(page)方法;
public abstract class PageMethod {
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal();
protected static boolean DEFAULT_COUNT = true;
public PageMethod() {
}
protected static void setLocalPage(Page page) {
LOCAL_PAGE.set(page);
}
}
这个方法就会把这个page设置到我们这一次请求的这个线程存储的空间里面,pagehelper就可以通过mybatis拦截器的方式,追加 sql 的查询语句 的 limit… 字段;实现分页。