分页逻辑实现

分页简介

用来将数据分割成多个部分来分页面展示。

什么时候用?

数据量达到一定的时候,就需要使用分页来进行数据分割。要不然可能会面临以下问题:

  • 客户端一次性显示太多数据会影响到用户的体验,比如很难找到客户想要的信息,以及加载页面数据过慢。
  • 对于服务端来说,一次性传送的数据过多,可能造成内存溢出。

分页的分类

分页分为真分页和假分页:

  • 真分页(物理分页):
    在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
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值