Mybatis PageHelper自定义pageBean+分页失效问题解决

PageHelpe是mybatis 提供的分页插件,目前支持Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库。本文总结项目中使用PageHelpe的问题解决

一、基本使用

pom.xml 依赖

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

使用:定义页码

PageHelper.startPage(currentPage,pageSize);

PageHelper.startPage(1,20);查询数据库的时候会自动在sql后加上limit 1,10 ,注意Mybatis写sql时候,语句末尾不要加上不然会报错。

在这里插入图片描述

二、自定义pageBean

由于PageInfo里面的属性较多,前端不需要这么多的信息,因此自定义pageBean,保留需要的字段。

package com.example.toponym.model;
import com.github.pagehelper.Page;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;


@Data
@Schema(name = "PageBean对象",description = "分页信息实体")
public class PageBean<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    @Schema(name = "pageNum",description = "当前页")
    private int pageNum;
    @Schema(name = "pageSize",description = "每页的数量")
    private int pageSize;
    @Schema(name = "total",description = "总记录数")
    private long total;
    @Schema(name = "pages",description = "总页数")
    private int pages;
    @Schema(name = "data",description = "结果集")
    private List<T> data;

    public PageBean(List<T> data) {
        this(data, 8);
    }

    public PageBean(List<T> data, int navigatePages) {
        if (data instanceof Page) {
            Page page = (Page) data;
            this.pageNum = page.getPageNum();
            this.pageSize = page.getPageSize();
            this.pages = page.getPages();
            this.data = page;
            this.total = page.getTotal();
        } else if (data instanceof Collection) {
            this.pageNum = 1;
            this.pageSize = data.size();
            this.pages = this.pageSize > 0 ? 1 : 0;
            this.data = data;
            this.total = data.size();
        }

    }
}

使用直接用PageBean替换PageInfo即可:

public ResultResponse catQuery(String field, String value, @RequestParam(name = "currentPage",defaultValue = "1")int currentPage,
                                               @RequestParam(name = "pageSize",defaultValue = "20")int pageSize){
        PageHelper.startPage(currentPage,pageSize);
        List<DoorPlateElement> doorPlateElementList = doorPlateService.catQuery(field,value);
        return ResultResponse.success(new PageBean<>(doorPlateElementList));
    }

json结果:
在这里插入图片描述

三、分页失效问题总结

1、PageHelper只对后面的第一条查询语句产生作用。

若一个接口下需要执行多个查询语句,则需要在每个mapper前都要添加pageHelper。

该接口需经过判断后执行两个sql,所以将pageHelper写在server层中,让最终需要的数据所需要的查询语句放在PageHelper下。
代码:

//模糊检索
    @Override
    public List<DoorPlateElement> selectFts(String query, int currentPage, int pageSize) {
        List<DoorPlateElement> ftsResult = null;
        try {
            PageHelper.startPage(currentPage,pageSize);
            ftsResult = doorPlateMapper.selectFtsWord(StringToWord(query));
        } catch (IOException e) {
            e.printStackTrace();
        }
        assert ftsResult != null;
        if(ftsResult.isEmpty()){
            PageHelper.startPage(currentPage,pageSize);
            ftsResult = doorPlateMapper.selectFtsChar(StringToCharList(query));
        }
        return ftsResult;
    }

2、需要对分页查询结果进行二次封装时候,不能new一个对象,否则分页会失效。

问题场景:
检索结果中有个对象为Object格式,需要封装成jsonobject。

(1)当结果容器为List< Action>时,可以使用先getset方式,确保前后对象一致。

注:使用com.alibaba.fastjson防止空值和保持float数据精度完整

//查询审核数据
    @Override
    public List<Action> findAll(){
        List<Action> list = doorPlateMapper.findAll();
        for (Action action : list) {
            com.alibaba.fastjson.JSON obj = com.alibaba.fastjson.JSON.parseObject(String.valueOf(action.getCONTENT()));
            action.setCONTENT(obj);
        }
        return list;
    }

(2)当结果容器为List<Map<String,Object>>时,可以使用replace方式,但不能将结果存入新的map中,不然分页就会失效。

分页失效代码:

@Override
    public List<Map<String,Object>> findAll(){
        List<Map<String,Object>> list = new ArrayList<>();
        for (Map<String,Object> action:actionMapper.findAll()
             ) {
            com.alibaba.fastjson.JSON obj = com.alibaba.fastjson.JSON.parseObject(String.valueOf(action.get("CONTENT")));
            action.replace("CONTENT",action.get("CONTENT"),obj);
            list.add(action);
        }
        return list;
    }

分析原因:该逻辑使用new ArrayList<>(); 并将replace后的结果add进了新的对象,需要提取全部的检索结果才可以实现,分页自然失效。

修改结果:

@Override
    public List<Map<String,Object>> findAll(){
        List<Map<String,Object>> list = actionMapper.findAll();
        for (Map<String,Object> action:list
             ) {
            com.alibaba.fastjson.JSON obj = com.alibaba.fastjson.JSON.parseObject(String.valueOf(action.get("CONTENT")));
            action.replace("CONTENT",action.get("CONTENT"),obj);
        }
        return list;
    }
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值