分页并不是spring框架中的技术(感觉spring还瞧不上一个小分页,我们导入maven的工具类包是github的,毕竟工具类逻辑简单,只是封装繁琐点

简谈原理

分页的公式都是基于sql语句中的limit关键字的,limit m,n

m: 表示当前页数

n: 表示一页显示几条数据

应该有人疑问,我还没有根据总目录数分出具体几页,怎么就开始从第几页开始了,我举个例子

1
2
3
4
5
6
7
8
9
10
11
12
假如我们有50条数据
m =1;当前为第一页 n = 2; 显示两条数据 结果显示 第1、2条数据
对应sql:
select * from user limit 1,2

m = 2;当前为第二页 n = 2; 表示还是显示两条数据 结果显示 第3、4条数据
对应sql:
select * from user limit 3,4

m = 3;表示为第三页 n = 2; 表示还是显示两条数据 结果显示 第5、6条数据
对应sql:
select * from user limit 5,6

最终可推导出两个公式:

分页:

m=(当前页数-1)* 一页显示数据数目

n= 一页显示数据数目

分页公式: limit (当前页数-1)* 一页显示数据数目, 一页显示数据数目

总页数:

(总数据量 + 一页显示数据数目 -1) / 一页显示的数据数目

计算结果如果有余数,那么直接 结果+1

代码实现

先直接用逻辑自己实现分页试试:

dao:

准备一个分页查找的逻辑代码,可以实现通用mapper、通过@Select()注解、通过mapper.xml 的方式来写。

我用的注解:

1
2
@Select("select * from user limit #{pagenum},#{jitiao}")
public List<User> fenyeSe(@Param(value = "pagenum")Integer pagenum, @Param("jitiao")Integer jitiao);

service:

调用dao层的方法,将参数传入

1
2
3
public List<User> fenye(Integer page, Integer yema) {
return userDAO.fenyeSe(page, yema);
}

controller:

控制层需要绑定两个参数,分别是当前页码,当前页显示数据数量,

1
2
3
4
5
6
@GetMapping(value = "fenye2")
public ResultCode fenye2(@RequestParam(value = "page") Integer currentPage, @RequestParam("yema") Integer howPage) {
start = (currentPage - 1) * howPage;
List<User> fenye = userService.fenye(start, howPage);
return ResultCode.ok().data("fenye", fenye);
}

结果:

结果

可以看到我已经可以简单实现了分页的功能了,虽然还不全面,我还需要一些其他的参数,比如具体分为了多少页….

不过大家想要自己实现分页?我明确提醒大家,这些工作已经有人替我们做了,我们只需要会使用别人做好的工具类就行了!

工具类实现

maven项目pom

1
2
3
4
5
6
<pageHelper.starter.version>1.2.5</pageHelper.starter.version>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pageHelper.starter.version}</version>
</dependency>

dao:

用你能用的各种办法,实现一个查询所有数据的功能,我记成通用mapper了

1
2
3
4
5
6
7
8
9
10
11
package com.ls.dao;

import com.ls.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface UserDAO extends tk.mybatis.mapper.common.Mapper<User> {}

service:

先用helper确定开始页与结束页告诉程序,我要分页啦!然后返回处理好一切的pageinfo

1
2
3
4
5
public PageInfo<User> fenye2(Integer page, Integer yema) {
PageHelper.startPage(page, yema);
List<User> users = userDAO.selectAll();
return new PageInfo<>(users);
}

controller:

只要将两个参数确定传给 pagehelper

1
2
3
4
5
@GetMapping(value = "fenye3")
public ResultCode fenye3(@RequestParam(value = "page") Integer currentPage, @RequestParam("yema") Integer howPage) {
PageInfo<User> userPageInfo = userService.fenye2(currentPage, howPage);
return ResultCode.ok().data("user", userPageInfo);
}

结果:

嗯哼

可以明显的看出,不但返回了数据,还多出了一些参数。这些参数,就是pageinfo帮我们进行封装的信息,对前端来说是分厂必要的数据,可以常看源码解释。

好的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;

//由于startRow和endRow不常用,这里说个具体的用法
//可以在页面中"显示startRow到endRow 共size条数据"

//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总页数
private int pages;

//前一页
private int prePage;
//下一页
private int nextPage;

//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
//导航条上的第一页
private int navigateFirstPage;
//导航条上的最后一页
private int navigateLastPage;

希望能帮到你