SpringBoot整合分页PageHelper

1.pom.xml导入依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
</dependency>

2.创建Page实体

/**
 * 分页对象
 * @param <T>
 */
public class Page <T> implements Serializable{

   //当前默认为第一页
   public static final Integer pageNum = 1;
   //默认每页显示条件
   public static final Integer pageSize = 20;


   //判断当前页是否为空或是小于1
   public static Integer cpn(Integer pageNum){
      if(null == pageNum || pageNum < 1){
         pageNum = 1;
      }
      return pageNum;
   }


   // 页数(第几页)
   private long currentpage;

   // 查询数据库里面对应的数据有多少条
   private long total;// 从数据库查处的总记录数

   // 每页查5条
   private int size;

   // 下页
   private int next;
   
   private List<T> list;

   // 最后一页
   private int last;
   
   private int lpage;
   
   private int rpage;
   
   //从哪条开始查
   private long start;
   
   //全局偏移量
   public int offsize = 2;
   
   public Page() {
      super();
   }

   /****
    *
    * @param currentpage
    * @param total
    * @param pagesize
    */
   public void setCurrentpage(long currentpage,long total,long pagesize) {
      //可以整除的情况下
      long pagecount =  total/pagesize;

      //如果整除表示正好分N页,如果不能整除在N页的基础上+1页
      int totalPages = (int) (total%pagesize==0? total/pagesize : (total/pagesize)+1);

      //总页数
      this.last = totalPages;

      //判断当前页是否越界,如果越界,我们就查最后一页
      if(currentpage>totalPages){
         this.currentpage = totalPages;
      }else{
         this.currentpage=currentpage;
      }

      //计算start
      this.start = (this.currentpage-1)*pagesize;
   }

   //上一页
   public long getUpper() {
      return currentpage>1? currentpage-1: currentpage;
   }

   //总共有多少页,即末页
   public void setLast(int last) {
      this.last = (int) (total%size==0? total/size : (total/size)+1);
   }

   /****
    * 带有偏移量设置的分页
    * @param total
    * @param currentpage
    * @param pagesize
    * @param offsize
    */
   public Page(long total,int currentpage,int pagesize,int offsize) {
      this.offsize = offsize;
      initPage(total, currentpage, pagesize);
   }

   /****
    *
    * @param total   总记录数
    * @param currentpage  当前页
    * @param pagesize 每页显示多少条
    */
   public Page(long total,int currentpage,int pagesize) {
      initPage(total,currentpage,pagesize);
   }

   /****
    * 初始化分页
    * @param total
    * @param currentpage
    * @param pagesize
    */
   public void initPage(long total,int currentpage,int pagesize){
      //总记录数
      this.total = total;
      //每页显示多少条
      this.size=pagesize;

      //计算当前页和数据库查询起始值以及总页数
      setCurrentpage(currentpage, total, pagesize);

      //分页计算
      int leftcount =this.offsize,   //需要向上一页执行多少次
            rightcount =this.offsize;

      //起点页
      this.lpage =currentpage;
      //结束页
      this.rpage =currentpage;

      //2点判断
      this.lpage = currentpage-leftcount;          //正常情况下的起点
      this.rpage = currentpage+rightcount;      //正常情况下的终点

      //页差=总页数和结束页的差
      int topdiv = this.last-rpage;           //判断是否大于最大页数

      /***
       * 起点页
       * 1、页差<0  起点页=起点页+页差值
       * 2、页差>=0 起点和终点判断
       */
      this.lpage=topdiv<0? this.lpage+topdiv:this.lpage;

      /***
       * 结束页
       * 1、起点页<=0   结束页=|起点页|+1
       * 2、起点页>0    结束页
       */
      this.rpage=this.lpage<=0? this.rpage+(this.lpage*-1)+1: this.rpage;

      /***
       * 当起点页<=0  让起点页为第一页
       * 否则不管
       */
      this.lpage=this.lpage<=0? 1:this.lpage;

      /***
       * 如果结束页>总页数   结束页=总页数
       * 否则不管
       */
      this.rpage=this.rpage>last? this.last:this.rpage;
   }

   public long getNext() {
      return  currentpage<last? currentpage+1: last;
   }

   public void setNext(int next) {
      this.next = next;
   }

   public long getCurrentpage() {
      return currentpage;
   }

   public long getTotal() {
      return total;
   }

   public void setTotal(long total) {
      this.total = total;
   }

   public long getSize() {
      return size;
   }

   public void setSize(int size) {
      this.size = size;
   }

   public long getLast() {
      return last;
   }

   public long getLpage() {
      return lpage;
   }

   public void setLpage(int lpage) {
      this.lpage = lpage;
   }

   public long getRpage() {
      return rpage;
   }

   public void setRpage(int rpage) {
      this.rpage = rpage;
   }

   public long getStart() {
      return start;
   }

   public void setStart(long start) {
      this.start = start;
   }

   public void setCurrentpage(long currentpage) {
      this.currentpage = currentpage;
   }

   /**
    * @return the list
    */
   public List<T> getList() {
      return list;
   }

   /**
    * @param list the list to set
    */
   public void setList(List<T> list) {
      this.list = list;
   }

   public static void main(String[] args) {
         //总记录数
         //当前页
         //每页显示多少条
         int cpage =17;
         Page page = new Page(1001,cpage,50,7);
         System.out.println("开始页:"+page.getLpage()+"__当前页:"+page.getCurrentpage()+"__结束页"+page.getRpage()+"____总页数:"+page.getLast());
   }
}

3.创建PageResult实体

public class PageResult<T> {

    private Long total;//总记录数
    private List<T> rows;//记录

    public PageResult(Long total, List<T> rows) {
        this.total = total;
        this.rows = rows;
    }

    public PageResult() {
    }

    public Long getTotal() {
        return total;
    }

    public void setTotal(Long total) {
        this.total = total;
    }

    public List<T> getRows() {
        return rows;
    }

    public void setRows(List<T> rows) {
        this.rows = rows;
    }
}

4.分页Controller编写

/***
 * 分页搜索实现
 * @param searchMap
 * @param page 当前页
 * @param size 每页显示几条(后端可定死)
 * @return
 */
@GetMapping(value = "/search/{page}/{size}" )
public Result findPage(@RequestParam Map searchMap, @PathVariable  int page, @PathVariable  int size){
    Page<Order> pageList = orderService.findPage(searchMap, page, size);
    PageResult pageResult=new PageResult(pageList.getTotal(),pageList.getResult());
    return new Result(true,StatusCode.OK,"查询成功",pageResult);
}

5.分页service

/**
 * 条件+分页查询
 * @param searchMap 查询条件
 * @param page 页码
 * @param size 页大小
 * @return 分页结果
 */
@Override
public Page<Order> findPage(Map<String,Object> searchMap, int page, int size){
    PageHelper.startPage(page,size);
    Example example = createExample(searchMap);
    return (Page<Order>)orderMapper.selectByExample(example);
}
/**
 * 构建查询对象
 * @param searchMap
 * @return
 */
private Example createExample(Map<String, Object> searchMap){
    Example example=new Example(Order.class);
    Example.Criteria criteria = example.createCriteria();
    if(searchMap!=null){
        // 订单id
        if(searchMap.get("id")!=null && !"".equals(searchMap.get("id"))){
            criteria.andEqualTo("id",searchMap.get("id"));
           }
        // 支付类型,1、在线支付、0 货到付款
        if(searchMap.get("payType")!=null && !"".equals(searchMap.get("payType"))){
            criteria.andEqualTo("payType",searchMap.get("payType"));
           }
        // 物流名称
        if(searchMap.get("shippingName")!=null && !"".equals(searchMap.get("shippingName"))){
            criteria.andLike("shippingName","%"+searchMap.get("shippingName")+"%");
           }
        // 物流单号
        if(searchMap.get("shippingCode")!=null && !"".equals(searchMap.get("shippingCode"))){
            criteria.andLike("shippingCode","%"+searchMap.get("shippingCode")+"%");
           }
        // 用户名称
        if(searchMap.get("username")!=null && !"".equals(searchMap.get("username"))){
            criteria.andLike("username","%"+searchMap.get("username")+"%");
           }
        // 买家留言
        if(searchMap.get("buyerMessage")!=null && !"".equals(searchMap.get("buyerMessage"))){
            criteria.andLike("buyerMessage","%"+searchMap.get("buyerMessage")+"%");
           }
        // 是否评价
        if(searchMap.get("buyerRate")!=null && !"".equals(searchMap.get("buyerRate"))){
            criteria.andLike("buyerRate","%"+searchMap.get("buyerRate")+"%");
           }
        // 收货人
        if(searchMap.get("receiverContact")!=null && !"".equals(searchMap.get("receiverContact"))){
            criteria.andLike("receiverContact","%"+searchMap.get("receiverContact")+"%");
           }
        // 收货人手机
        if(searchMap.get("receiverMobile")!=null && !"".equals(searchMap.get("receiverMobile"))){
            criteria.andLike("receiverMobile","%"+searchMap.get("receiverMobile")+"%");
           }
        // 收货人地址
        if(searchMap.get("receiverAddress")!=null && !"".equals(searchMap.get("receiverAddress"))){
            criteria.andLike("receiverAddress","%"+searchMap.get("receiverAddress")+"%");
           }
        // 订单来源:1:web,2:app,3:微信公众号,4:微信小程序  5 H5手机页面
        if(searchMap.get("sourceType")!=null && !"".equals(searchMap.get("sourceType"))){
            criteria.andEqualTo("sourceType",searchMap.get("sourceType"));
           }
        // 交易流水号
        if(searchMap.get("transactionId")!=null && !"".equals(searchMap.get("transactionId"))){
            criteria.andLike("transactionId","%"+searchMap.get("transactionId")+"%");
           }
        // 订单状态
        if(searchMap.get("orderStatus")!=null && !"".equals(searchMap.get("orderStatus"))){
            criteria.andEqualTo("orderStatus",searchMap.get("orderStatus"));
           }
        // 支付状态
        if(searchMap.get("payStatus")!=null && !"".equals(searchMap.get("payStatus"))){
            criteria.andEqualTo("payStatus",searchMap.get("payStatus"));
           }
        // 发货状态
        if(searchMap.get("consignStatus")!=null && !"".equals(searchMap.get("consignStatus"))){
            criteria.andEqualTo("consignStatus",searchMap.get("consignStatus"));
           }
        // 是否删除
        if(searchMap.get("isDelete")!=null && !"".equals(searchMap.get("isDelete"))){
            criteria.andEqualTo("isDelete",searchMap.get("isDelete"));
           }

        // 数量合计
        if(searchMap.get("totalNum")!=null ){
            criteria.andEqualTo("totalNum",searchMap.get("totalNum"));
        }
        // 金额合计
        if(searchMap.get("totalMoney")!=null ){
            criteria.andEqualTo("totalMoney",searchMap.get("totalMoney"));
        }
        // 优惠金额
        if(searchMap.get("preMoney")!=null ){
            criteria.andEqualTo("preMoney",searchMap.get("preMoney"));
        }
        // 邮费
        if(searchMap.get("postFee")!=null ){
            criteria.andEqualTo("postFee",searchMap.get("postFee"));
        }
        // 实付金额
        if(searchMap.get("payMoney")!=null ){
            criteria.andEqualTo("payMoney",searchMap.get("payMoney"));
        }

    }
    return example;
}

6.分页mapper

public interface OrderMapper extends Mapper<Order> {

}

 

 
上一篇:记一次博客评论回复实现遇到的bug


下一篇:springboot使用分页插件,,返回的数据中total总是为0