一、物理分页与逻辑分页概念
1.物理分页:物理分页依赖数据库,比如MySQL数据库提供的"limit"关键字,只需编写带有"limit"关键字的SQL语句,数据库返回的就是分页结果。
2.逻辑分页:逻辑分页依赖编码。数据库返回全部数据而并非分页数据,然后再通过编写代码获取分页结果;常用的方法就将查询的结果存放到List集合中,由于List是有序的,可通过索引获取相应的值。
二、物理分页与逻辑分页的对比
1.数据库分担:物理分页每次都需要访问数据库,逻辑分页只需访问一次数据库,因此,物理分页对于数据库造成的负担大;
2.服务器分担:逻辑分页一次性将数据读取到内存,占用了较大的内存空间;物理分页可以每次只读取部分数据,占用内存空间较少;
3.实时性:逻辑分页一次性读取所有数据,若数据库中的数据发生更改,逻辑分页无法实时更新,因此实时性较差;物理分页每次都需要访问数据库,能获取数据库中数据的最新状态,实时性较强;
4.适用场合:逻辑分页主要适用于数据量不大,数据较为稳定的情况;物理分页适用于数据量较大,数据更新频繁的情况。
三、物理分页与逻辑分页的实现
1.物理分页:对于物理分页,目前都有较好的插件可以实现,比如 Mybatis-Plus分页插件、PageHelper等
2.逻辑分页:对于逻辑分页可以利用List集合实现,以下附上逻辑分页的代码:
package com.logic.page.listlogicpage.util;
import lombok.Data;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* <pre>描述</pre>
* 逻辑分页实体类
*
* @version 1.0
* @author: Kyle
* @date: 2020/1/13 11:33
*/
@Data
public class PageList<T> {
/**
* 当前页
*/
private Integer current;
/**
* 总记录数
*/
private Integer totalCount;
/**
* 总页数
*/
private Integer sumPages;
/**
* 页面记录数
*/
private Integer pageSize;
/**
* 判断是不是首页
*/
private Boolean isFirstPage = false;
/**
* 判断是不是最后一页
*/
private Boolean isLastPage = false;
private List<T> list;
int startIndex = 0;
int endIndex = 0;
public PageList(List<T> list, Integer current, Integer pageSize) {
this.current = current;
this.pageSize = pageSize;
this.totalCount = list.size();
// 计算总页数
boolean isFullPages = totalCount % pageSize == 0;
if (!isFullPages) {
// 若当前数据总数与页面数据大小相除不为整数,则增加一页显示剩余的数据
this.sumPages = totalCount / pageSize + 1;
} else {
this.sumPages = totalCount / pageSize;
}
startIndex = current * pageSize - pageSize;
if (current <= 0) {
// 若查询的页数是小于等于0的则直接取第一页
this.startIndex = 0;
this.current = 1;
endIndex = this.current * pageSize;
// throw new ArithmeticException("当前页无法查询");
} else if (current > sumPages) {
// 若查询的页数大于总页数,则置list为空
list = new ArrayList<>();
} else if (current.equals(sumPages)) {
endIndex = totalCount;
} else {
endIndex = current * pageSize;
}
// 判断是否为首页
if (this.current == 1) {
isFirstPage = true;
}
// 判断是否为最后一页
if (this.current.equals(sumPages)) {
isLastPage = true;
}
if (CollectionUtils.isEmpty(list)) {
this.list = new ArrayList<>();
} else {
this.list = list.subList(startIndex, endIndex);
}
}
}