最近写的项目里用到了分页查询(手动分页),记录一下。
一、创建一个通用的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博客,表示感谢!