学习笔记(九):分页查询

文章介绍了在Java项目中进行手动分页查询时遇到的索引越界问题,以及如何通过调整PageBean的end属性为totalRecord来解决这个问题。同时,展示了PageBean类的创建,控制器层和实现层的代码示例,强调了在for循环中正确设置边界条件的重要性。
摘要由CSDN通过智能技术生成

最近写的项目里用到了分页查询(手动分页),记录一下。

一、创建一个通用的PageBean类

import java.util.List;

import lombok.Data;

import java.io.Serializable;


@Data
public class PageBean<T> implements Serializable {

    private int pageNum; //当前页数
    private int pageSize; //每页显示数
    private int totalPage; //总页数
    private int totalRecord; //总的记录数
    private List<T> data; //当前页面的数据集合
    private int start;
    private int end;

    public PageBean() {
    }

    public PageBean(int pageNum, int pageSize, int totalRecord) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;

        //计算总页数
        this.totalPage=totalRecord%pageSize==0?(totalRecord/pageSize):(totalRecord/pageSize+1);

        //计算每页的起始下标
        this.start=(pageNum-1)*pageSize;
        this.end=this.start+pageSize;
    }
}

二、控制器层代码

    @PostMapping("/pageLog")
    public R<?> pageLog(@RequestBody JSONObject jsonObject) {
        PageBean<MatterLog> page = matterLogService.pageLog(jsonObject);
        return R.OK("查询成功",page);
    }

三、实现层代码

1、注意点:

在for循环代码块中,定义i的起始值和最大值,本来是以下代码块内容,测试过程中发现在查询数据最后一页的时候会报“java.lang.IndexOutOfBoundsException: Index: 41, Size: 41”错误信息,经过检查发现是“pageBean.getEnd()”的问题,修改为“totalRecord”后问题解决。

int i = pageBean.getStart(); i < pageBean.getEnd(); i++

2、问题描述:(举个例子)

表中总数据为41条,页面面数pageNum为5,页面总条数pageSize为10,正常情况下应返回给前端一条数据,即第41条数据。若for循环设置“i<pageBean.getEnd()”,则报“java.lang.IndexOutOfBoundsException: Index: 41, Size: 41”错误信息,表示索引越界异常。打印发现:循环时,pageBean.getEnd()=pageNum*pageSize,值为50,大于41,就会提示索引错误,修改为totalRecord=表中总数据,值为41,错误解决。

 int i = pageBean.getStart(); i < totalRecord; i++

public PageBean<MatterLog> pageLog(JSONObject jsonObject) {
        String matterCode = jsonObject.getString("matterCode");
        String businessName = jsonObject.getString("businessName");
        String networkCenter = jsonObject.getString("networkCenter");
        String customName = jsonObject.getString("customName");
        String applyName = jsonObject.getString("applyName");
        String startTime = jsonObject.getString("startTime");
        String endTime = jsonObject.getString("endTime");
        QueryWrapper<MatterLog> qw = new QueryWrapper<>();
        if (matterCode!=null && (!"".equals(matterCode))){
            qw.eq("matter_code",matterCode);
        }
        if (businessName!=null && (!"".equals(businessName))){
            qw.eq("business_name",businessName);
        }
        if (networkCenter!=null && (!"".equals(networkCenter))){
            qw.like("network_center",networkCenter);
        }
        if (customName!=null && (!"".equals(customName))){
            qw.eq("custom_name",customName);
        }
        if (applyName!=null && (!"".equals(applyName))){
            qw.eq("apply_name",applyName);
        }
        if (startTime!=null && (!"".equals(startTime))){
            qw.ge("create_time",startTime);
        }
        if (endTime!=null && (!"".equals(endTime))){
            qw.le("create_time",endTime);
        }
        //List<MatterLog> urf = matterLogmapper.selectList(null);
        List<MatterLog> urf = matterLogmapper.selectList(qw);

        int totalRecord = 0;
        if (!CollectionUtils.isEmpty(urf)) {
            totalRecord = urf.size();
        }
        PageBean<MatterLog> pageBean = new PageBean<>(Integer.parseInt(String.valueOf(jsonObject.get("pageNum"))),
                Integer.parseInt(String.valueOf(jsonObject.get("pageSize"))), totalRecord);
        List<MatterLog> data = new ArrayList<>();
        for (int i = pageBean.getStart(); i < totalRecord; i++) {
            data.add(urf.get(i));
        }

        pageBean.setData(data);
        pageBean.setTotalRecord(totalRecord);

        return pageBean;
    }

总结:

1、以上分页查询属于手动分页,还可以通过springboot自带插件实现分页查询。

2、学习过程中参考了(5条消息) Java-常用实现分页查询_java分页查询_源的世界的博客-CSDN博客,表示感谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值