spring Boot + PageHelper 实现分页

分页依赖

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层属性赋值

service层需要实现BaseService全局通用接口,并在接口的实现中重写list和parse方法

Controller层接口传参及返回参数形式

扫描二维码关注公众号,回复: 14635160 查看本文章

猜你喜欢

转载自blog.csdn.net/Alan_ran/article/details/123543675