天天看点

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行

继续阅读