分页并不是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;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;
希望能帮到你