普通分页查询逻辑
分页查询" title="分页查询">分页查询
大多数的 web 应用中由于数据量庞大,一般不会将所有数据都同时展示在一个页面上,而应对庞大的数据展示,分页查询无疑是一个比较科学的解决办法
数据传递
要想理清分页的逻辑,首先得要知道在分页查询的过程中,客户端(浏览器)向服务器发送了哪些数据以及服务器又向客户端(浏览器)发送了哪些数据
客户端给服务器发送的数据
- currentPage 当前页码
- pageSize 每页显示的记录数
服务器给客户端发送的数据
totalCount 总记录数
- 总记录数由后台数据库查询可得
select count(*) from tb_xxx;
totalPage 总页码
- 总页码 = 总记录数(totalCount) / 每页显示的记录数(pageSize)
这里要注意:如果 pageSize 能被 totalCount 除尽,那么就可以直接得到总页码,如果不能除尽,就需要在除的结果上加上 1。这里可以使用一个三目运算
int totalPage = totalCount % pageSize == 0 ? (totalCount / pageSize) : (totalCount / pageSize + 1);
list 每页的数据
- 每页的数据由后台数据库(mysql)查询可得
- start 由 currentPage 和 pageSize 计算可得
int start = (currentPage - 1) * pageSize;
- pageSize 由客户端传入
select * from tb_xxx limit start, pageSize;
currentPage 当前页码
建议将上述的属性封装到
PageBean
对象中,再传递给客户端
封装 PageBean
package cn.itcast.travel.domain;import java.util.List;
/**
* @authon timber
* @description 分页对象
* @date 2020/6/24 下午3:03
*/
public class PageBean<T> {
private int totalCount; // 总记录数
private int totalPage; // 总页数
private int currentPage; // 当前页码
private int pageSize; // 每页显示的条数
private List<T> list; // 每页显示的数据集合
private int start = 0; // 查询的起始索引
/*
* @Author: timber
* @Description: 计算查询的起始索引
* @Date: 2020/6/24 下午5:52
* @param currentPage
* @param pageSize
* @Return
*/
public int handleStart(int currentPage, int pageSize){
return (currentPage - 1) + pageSize;
}
/*
* @Author: timber
* @Description: 计算查询总页码
* @Date: 2020/6/24 下午5:52
* @param totalCount
* @param pageSize
* @Return
*/
public int handlePage(int totalCount, int pageSize){
return totalCount % pageSize == 0 ? (totalCount / pageSize) : (totalCount / pageSize) + 1;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
}
分页页码前 5后 4效果
要实现分页页码前 5后 4的效果,需要对三种情况进行判断(begin 表示第一页,end 表示最后一页)
总页码不足 10
在总页码不足 10的情况下,直接将 begin 置为1,将 end 置为总页码数
总页码大于 10 前边不够5个
当前边不够 5个时,需要在后边补齐10个,将 begin 置为 1,end 置为 (begin + 9)
总页码大于10 后边不够4个
当后边不够四个时,需要在前边补齐10 个,将 end 置为总页码数,begin 只为 (end - 9)
代码示例
/* 1. 一共展示10个页码,能够达到前5后4的效果
2. 如果前边不够5个,后边补齐10个
3. 如果后边不足4个,前边补齐10个
*/
// 定义开始位置 begin,结束位置 end
var begin;
var end;
// 1. 要显示10个页码
if(totalPage < 10){
// 总页数不超过 10
begin = 1;
end = totalPage;
}else{
// 总页数超过 10
begin = currentPage - 5;
end = currentPage + 4;
// 2. 如果前边不够 5个,后边补齐 10个
if(begin < 1){
begin = 1;
end = begin + 9;
}
// 3. 如果后边不够4个,前边补齐 10个
if(end > totalPage){
end = totalPage;
begin = end - 9;
}
}
以上是 普通分页查询逻辑 的全部内容, 来源链接: utcz.com/z/517786.html