分页简介
用来将数据分割成多个部分来分页面展示。
什么时候用?
数据量达到一定的时候,就需要使用分页来进行数据分割。要不然可能会面临以下问题:
- 客户端一次性显示太多数据会影响到用户的体验,比如很难找到客户想要的信息,以及加载页面数据过慢。
- 对于服务端来说,一次性传送的数据过多,可能造成内存溢出。
分页的分类
分页分为真分页和假分页:
- 真分页(物理分页):
在mysql中使用select * from table where …limit start , size(在oracle中复杂些)
(page_num 代表具体第多少页,pages代表每页有多少条数据)
第一个参数start代表(page_num-1)*pages
第二个参数是 pages,即页面数据量最大是多少
还有limit如果后面只有一个参数,则相当于0,num即0行到num-1行 - 假分页(逻辑分页):
直接使用select * from table where …
这样将所有数据查询出来存放到内存中,每次需要查询时直接从内存中去取出相应索引区间的数据
区别
真分页相比于假分页不会造成内存溢出,但翻页的数据相比于假分页又慢,所以根据实际情况选择分页方式,如果数据量不大,可以考虑使用假分页使翻页速度加快。
实现
假分页
假分页实际上使用List去存储所有查询出的值,再用subList方法获取两个索引之间的数据。
先在dao层,创建StudentMapper接口
List<Student> queryStudentsByArray();
再创建StudentMapper.xml文件,编写查询语句:
<select id="queryStudentsByArray" resultType="Student">
select * from student
</select>
然后定义Service接口并定义分页方法:
List<Student> queryStudentsByArray(int currPage, int pageSize);
再在Servlce实现类中重写该方法:
@Override
public List<Student> queryStudentsByArray(int currPage, int pageSize) {
List<Student> students = studentMapper.queryStudentsByArray();
// 从第几条数据开始
int firstIndex = (currPage - 1) * pageSize;
// 到第几条数据结束
int lastIndex = currPage * pageSize;
return students.subList(firstIndex, lastIndex);
}
这里控制器和前台就根据这个方法来编写。
真分页
这里以我自己在一个个人博客后台管理type和tag的分页为例:
先封装一个Page类,用来做分页(为了简便):
package com.yuer.entity;
import java.util.ArrayList;
import java.util.List;
// 进行分页的工具类
// 使用泛型的原因是可能对不同类型进行分页
// 在first,last,start的get方法中,进行一些处理,保证这三个字段正确
public class Page<T> {
// 这里存放的每次查出来的一页内容
private List<T> content = new ArrayList<>();
// 当前页数 默认为1
private int page = 1;
// 总页数
private int totalPages = 0;
// 这个等于(page - 1) * size,代表该显示多少条数据的第一个索引
private int start = 0;
// 默认为4
private int size = 4;
// 当前是不是首页,默认为true
private boolean first = true;
// 当前是不是尾页,默认是false
private boolean last = false;
public List<T> getContent() {
return content;
}
public void setContent(List<T> content