首頁 > 軟體

pagehelper分頁工具類的封裝

2022-08-14 10:00:47

本文範例為大家分享了pagehelper分頁工具類的封裝程式碼,供大家參考,具體內容如下

現狀:

在使用Mybatis進行資料庫分頁查詢時,我們經常使用的是外掛:pagehelper 此外掛可以幫助我們很方便的進行資料庫分頁操作,但是使用此外掛每次都需要先開啟外掛,然後再手動的對引數進行封裝,這些都是模板化的套路,有沒有一種更簡潔的方法,讓我們不在關注具體的分頁細節,只需要實現我們的業務邏輯呢?所以接下來我將使用Spring AOP技術,對該工具類進行封裝,讓我們可以更方便的進行分頁操作;

依賴:

首先在專案中加入pagehelper 分頁外掛和AOP的依賴:

<!-- pagehelper 分頁外掛 -->
<dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper-spring-boot-starter</artifactId>
      <version>1.2.5</version>
        </dependency>
        <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper-spring-boot-autoconfigure</artifactId>
      <version>1.2.3</version>
  </dependency>
        
        <!--AOP依賴-->
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

在組態檔中,設定分頁外掛:

# PageHelper分頁外掛

#  使用的資料庫,如果是mysql,這裡替換成mysql
pagehelper.helperDialect= oracle

# 當該引數設定為 true 時,pageNum<=0 時會查詢第一頁, pageNum>pages(超過總數時),會查詢最後一頁
pagehelper.reasonable= true

# 支援通過 Mapper 介面引數來傳遞分頁引數
pagehelper.supportMethodsArguments= true

定義一個註解類 @Page:

定義此註解類的作用是,標識哪些是分頁的方法,我們將對標註@Page的方法進行分頁增強

package com.rems.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @program: rems
 * @description: 分頁註解
 * @author: hu.chen
 * @createDate: 2021年05月08日 10:34
 **/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Page {
}

接下來定義切面類,並在裡面編寫增強邏輯:

package com.rems.aop;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.rems.pojo.PageFilter;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.util.ObjectUtils;

/**
 * @program: rems
 * @description: 分頁邏輯織入
 * @author: hu.chen
 * @createDate: 2021年05月08日 10:36
 **/
//宣告當前類是設定類
@Configuration
//標註當前類是Aop切面類
@Aspect
@Slf4j
//開啟Aop增強
@EnableAspectJAutoProxy
public class PageAop {


    /**
     * 定義切入點
     */
    @Pointcut("@annotation(com.rems.annotation.Page)")
    public void annotation() {
    }

    /**
     * 環繞增強
     */
    @Around("annotation()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
         // 當前頁碼
      String pageNum="1";
          //每頁記錄數
       String pageSize="10";
        PageFilter pageFilter=null;
        //獲取被增強方法的引數
        Object[] args = proceedingJoinPoint.getArgs();
        for (Object arg : args) {
            if(arg instanceof PageFilter) {
               pageFilter=(PageFilter) arg;
                pageNum=ObjectUtils.isEmpty(pageFilter.getPageNum())? pageNum:pageFilter.getPageNum();
                pageSize=ObjectUtils.isEmpty(pageFilter.getPageSize())? pageSize:pageFilter.getPageSize();
            }
        }
        Object result = null;
        try {
            //呼叫分頁外掛傳入開始頁碼和頁面容量
            Page<Object> page = PageHelper.startPage(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
            //執行被增強的方法,不寫,則被增強方法不執行
            result = proceedingJoinPoint.proceed(args);
            //獲取並封裝分頁後的引數
            pageFilter.setPageNum(String.valueOf(page.getPageNum()));
            pageFilter.setPages(page.getPages());
            pageFilter.setPageSize(String.valueOf(page.getPageSize()));
            pageFilter.setTotal(page.getTotal());


        } catch (Exception e) {
            log.info("查詢資料庫異常",e);
        }
        return result;
    }
}

定義分頁引數類,並讓所有封裝了查詢引數的類繼承本類

注意這裡面的 getPageFilter 方法

package com.rems.pojo;

import lombok.Data;

import java.util.List;


/**
 * @program: rems
 * @description: 分頁類
 * @author: hu.chen
 * @createDate: 2021年04月23日 18:26
 **/
@Data
public class PageFilter<T> {

    /**
     * 總條數
     */
    private long total;

    /**
     * 當前頁碼
     */
    private String pageNum;

    /**
     * 每頁記錄數
     */
    private String pageSize;

    /**
     * 總頁數
     */
    private Integer pages;

    private List<T> data;

    /**
     * @param obj 繼承了PageFilter類的子類
     * @param response 從資料庫查詢出來的引數
     * @return
     */
    public PageFilter getPageFilter(PageFilter obj,List<T> response) {
        PageFilter<T> pages = new PageFilter();
        pages.setPageNum(String.valueOf(obj.getPageNum()));
        pages.setPages(obj.getPages());
        pages.setPageSize(String.valueOf(obj.getPageSize()));
        pages.setTotal(obj.getTotal());
        pages.setData(response);
        return pages;
    }
}

上面的設定都做好後,接下來就可以進行測試:

看一下mapper介面:

在此介面上標註@Page註解,說明當前方法需要分頁增強
要注意這個入參:GetDemandDo,這個類繼承了上面定義的PageFilter分頁類

  /**
     * @Description: 根據動態條件查詢需求表
     * @Param: [demand]
     * @return: com.rems.pojo.Demand
     * @Author: chenhu
     * @Date: 2021/4/23
     */
    @Page
    List<Demand> getDemandByDynamiCondition(GetDemandDo demand);

接下來看一下service業務邏輯層:

/**
* @Description: 查詢根據條件動態查詢需求列表並分頁
* @Param:
* @return:
* @Author: chenhu
*/
    @Override
    public PageFilter<DemandVo> getDemandByDynamiCondition(GetDemandDo demand) {
    
        //分頁查詢需求
        List<DemandVo> demands = demandMapper.getDemandByDynamiCondition(demand).stream()
                .map(item -> {
                    DemandVo demandVo = new DemandVo();
                    BeanUtils.copyProperties(item, demandVo);
                    return demandVo;
                }).collect(Collectors.toList());
                
        //這個方法呼叫的是繼承自父類別:PageFilter的方法,將封裝了查詢引數的物件放入,
                    //再將資料庫查詢並處理好的返回物件放入即可
        return demand.getPageFilter(demand, demands);
    }

在controller層呼叫:

/**
     * 根據條件動態查詢需求
     *
     * @param demand
     * @return
     */
    @GetMapping("/getDemand")
    public AjaxData getDemand(GetDemandDo demand) {
    
        return AjaxData.success(demandService.getDemandByDynamiCondition(demand));
        
    }

Postman測試:

到這裡就封裝測試成功,之後使用只需要在需要分頁查詢的mapper介面上標註@Page註解,並讓傳遞引數的物件繼承PageFilter分頁類,然後傳遞引數的物件呼叫繼承過來的方法:getPageFilter(PageFilter obj,List response) 並將相應的引數傳入即可;

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com