分页依赖
PageHelper
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.version}</version>
</dependency>
定义请求参数类 PageParam
public class PageParam<T> implements IPage {
// description = "页码", defaultValue = 1
private Integer pageNum = 1;
// description = "页数", defaultValue = 20
private Integer pageSize = 20;
// description = "排序", example = "id desc"
private String orderBy;
// description = "参数"
private T param;
public PageParam<T> setOrderBy(String orderBy) {
this.orderBy = orderBy; // 此处可优化
return this;
}
@Override
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
@Override
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
@Override
public String getOrderBy() {
return orderBy;
}
public T getParam() {
return param;
}
public void setParam(T param) {
this.param = param;
}
}
编写此类的目的是为了分离分页和业务数据,让开发者专注于业务的实现和开发,无论是请求还是响应都将分页相关的数据抽离出来,单独使用。OrderBy的Getter方法属于IPage接口中的方法,用来基于SQL的动态传参排序,通过MyBatis拦截器,再query查询中注入进去的,再前端传参时,orderBy参数应为数据库column desc/asc这种形式,多字段排序可以用逗号拼接。
另外,我们给pageNum/pageSize赋予默认值,是因为再Page查询参数为null时,它并不会赋予它们默认值,并不进行额外的处理,以至于导致分页失败,而给默认值,也是为了谨防后端调试接口过程中可能出现的各种意外
全局通用接口
public interface BaseService<Param, Result> {
/**
* 分页查询
*
* @param param 请求参数DTO
* @return 分页集合
*/
default PageInfo<Result> page(PageParam<Param> param) {
Page page = PageHelper.startPage(param);
List<Result> list = parse(list(param.getParam()));
long total = page.getTotal();
PageInfo<Result> pageInfo = new PageInfo<>(list);
pageInfo.setTotal(total);
return pageInfo;
}
/**
* 集合查询
*
* @param param 查询参数
* @return 查询响应
*/
List<Result> list(Param param);
/**
* 补充SO层字段
*
* @param mapperResult
* @return
*/
List<Result> parse(Collection mapperResult);
}
声明list函数是为了分页和集合查询的分离和解耦,声明parse函数是为了给SO层属性赋值