天天看點

9 fluent-mybatis 使用PageHelper進行分頁查詢

作者:EYE33

引入pageHelper

<dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper-spring-boot-starter</artifactId>
      <version>1.4.2</version>
  </dependency>           

yml配置

pagehelper:
  reasonable: true #分頁合理化參數,預設值為 false 。當該參數設定為 true 時, pageNum<=0 時會查詢第一頁, pageNum>pages (超過總數時),會查詢最後一頁。預設 false 時,直接根據參數進行查詢
           

注意:隻有緊跟着PageHelper.startPage()的sql語句才被pagehelper起作用

不需要分頁 就不要執行這個startPage方法,否則将引起不想要執行分頁的SQL卻執行了分頁

我這裡使用了封裝于BaseMapper.java的tableQuery方法,該方法代碼如下

/**
     * 單表/多表關聯可用,支援pageHelper插件的分頁/不分頁查詢功能
     * @param query
     * @param beanClass
     * @return
     */
    default <T> List<T> tableQuery(IQuery query, Class<T> beanClass) {
        HttpHolder.startPageIfNeed();
        List<Map<String, Object>> list = this.listMaps(query);
        if(null == list) return new ArrayList<>();

        List<T> pojoList = new ArrayList<>();
        boolean isSimpleValueType = ClassUtil.isSimpleValueType(beanClass);
        for (Map<String, Object> m : list) {
            T o = null;
            if(isSimpleValueType){
                ArrayList arrayList = new ArrayList(m.values());
                o = arrayList.size() > 0 ? (T)arrayList.get(0) : null;
            }else{
                o = (T) BeanTool.mapToCamelBean(m, beanClass);
            }

            pojoList.add(o);
        }
        if(list instanceof Page) {//分頁
            Page page = (Page)list;
            Page<T> newPage = new Page();
            newPage.setPageNum(page.getPageNum());
            newPage.setPages(page.getPages());
            newPage.setTotal(page.getTotal());
            newPage.addAll(pojoList);
            return newPage;
        }else{//不分頁
            return pojoList;
        }
    }           

其中關鍵的執行分頁與否的動作HttpHolder.startPageIfNeed();詳細代碼如下

這是一個基于ThreadLocal的線程級别變量的功能

/**
     * 若需要分頁,則執行分頁參數設定
     */
    public static void startPageIfNeed(){
        if (HttpHolder.needPage()){
            NeedPage needPage = HttpHolder.getNeedPage();
            PageHelper.startPage(needPage.getPage(), needPage.getLimit(),true);
        }
    }           

service層的代碼

public void pageQuery(){
        List<JSONObject> pageList = companyMapper.tableQuery(companyMapper.emptyQuery(), JSONObject.class);
        return pageList;
    }           

controller層的代碼

@RequestMapping("test")
    public Ret test(){
        return Ret.tableData(mybatisService.pageQuery());
       
    }           

關于傳回Ret.tableData方法的詳細代碼

/**
     * layui的table資料傳回模式
     * @param data 由mapper.tableQuery方法傳回的資料
     * @param totalRow 統計行資訊
     * @return
     */
    public static <T> Ret<List<T>> tableData(List<T> data,JSON... totalRow){
        Ret ret = Ret.builder().success(true).code("0").data(data).build();
        if(ArrayUtil.isNotEmpty(totalRow)){
            ret.setTotalRow(totalRow[0]);
        }
        if(data instanceof Page){//分頁
            Page page = (Page)data;
            ret.setCount(page.getTotal());
        }
        return ret;
    }           

postman請求

9 fluent-mybatis 使用PageHelper進行分頁查詢

分頁查詢結果

9 fluent-mybatis 使用PageHelper進行分頁查詢

請看分頁查詢結果類型是Page,是以可以使用上述Ret.tableData方法提取查詢條件的總結果數和分頁結果

postman響應

{
    "success": true,
    "data": [
        {
            "companyName": "公司B",
            "updateTime": "2023-07-31 23:37:08",
            "companyId": 12,
            "createTime": "2023-07-31 23:37:10"
        },
        {
            "companyName": "公司CC",
            "updateTime": "2023-07-31 23:44:28",
            "companyId": 13,
            "createTime": "2023-07-31 21:57:16"
        }
    ],
    "status": 0,
    "code": "0",
    "count": 3
}           

共有3條記錄,根據分頁資訊 ,傳回對應的2行

繼續閱讀