PageHelper分页

Love The Way You Lie 2024-04-20 10:20 170阅读 0赞

我们在任何的系统中,分页功能是必不可少的。然而,对于这个功能如果有一种快速开发的实现方式,当然可以节省我们很多的时间了。接下来,我就给大家基于不同的环境来说说如何使用一个分页插件:pagehelper,它是Mybatis的一个分页插件。
这里使用一个简单的springboot的demo项目来实现,前台页面使用的Thymeleaf模板引擎。
首先加入pageHelper的依赖。

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

然后在配置文件中加入pageHelper的相关配置。

  1. # pageHelper配置
  2. # 指定数据库
  3. pagehelper.helper-dialect=mysql
  4. # 页码<=0 查询第一页,页码>=总页数查询最后一页
  5. pagehelper.reasonable=true
  6. # 支持通过 Mapper 接口参数来传递分页参数
  7. pagehelper.support-methods-arguments=true

pageHelper就可以使用了。
(基本的springboot的搭建步骤就不说了,之前已经写过文章)
简单的去数据库查一张表,达到分页效果。
dao

  1. @Select(value = "select * from address")
  2. List<Map> pageListss();

service层和serviceImpl

  1. List<Map> pageListss( Integer pn);
  2. @Override
  3. public List<Map> pageListss(Integer pn) {
  4. //判断的目的是前台访问的路径没有pn参数,则pn当前页参数默认为1(第一页)
  5. if(pn==null){
  6. pn=1;
  7. }
  8. //参数(当前页,一页展示多少条)
  9. PageHelper.startPage(pn,3);
  10. //只有在startPage下面的第一个select动作会被分页
  11. List<Map> pageList=selectMapper.pageListss();
  12. //把查到的list列表进行pageInfo处理,返回一个分页列表
  13. PageInfo<Map> pageInfo=new PageInfo(pageList);
  14. return pageList;
  15. }

controller

  1. @Controller
  2. @RequestMapping(value = "/page")
  3. public class PageController {
  4. @Autowired
  5. SelectService selectService;
  6. @RequestMapping("list")//pn是当前页,页面传给后台
  7. public String list(Integer pn,Model model){
  8. //这时,从service返回来的列表list已经是被分页后的列表了
  9. List<Map> list=selectService.pageListss(pn);
  10. //把分页后的list放到model中,在页面展示信息(thymeleaf模板引擎使用model放置信息)
  11. model.addAttribute("list",list);
  12. return "test";
  13. }
  14. }

test.html

  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>pageHelper练习</title>
  6. </head>
  7. <body>
  8. <table border="1">
  9. <thead>
  10. <tr>
  11. <th>ID</th>
  12. <th>地址</th>
  13. <th>详细地址</th>
  14. <th>电话</th>
  15. <th>账号</th>
  16. </tr>
  17. </thead>
  18. <tbody>
  19. <tr th:each="user : ${list}">
  20. <!-- 将用户的主键 uId 存在在 name 属性中-->
  21. <td th:text="${user.id}"></td>
  22. <td th:text="${user.location}"></td>
  23. <!-- 使用dates对象格式化日期-->
  24. <td th:text="${user.detail}"></td>
  25. <!-- 三运运算判断是否已婚-->
  26. <td th:text="${user.phone}"></td>
  27. <td th:text="${user.account}"></td>
  28. </tr>
  29. </tbody>
  30. </table>
  31. 当前第 <span th:text="${list.pageNum}"></span> 页.
  32. 总共 <span th:text="${list.pages}"></span> 页.
  33. 一共 <span th:text="${list.total}"></span> 条记录
  34. <a th:href="@{/page/list?pn=1}">首页</a>
  35. <a th:href="@{ '/page/list?pn='+${list.pageNum-1}}">上一页</a>
  36. <a th:href="@{ '/page/list?pn='+${list.pageNum+1}}">下一页</a>
  37. <a th:href="@{ '/page/list?pn='+${list.pages}}">尾页</a>
  38. </body>
  39. </html>

访问路径http://localhost:8082/page/list pn参数会默认会1
结果
在这里插入图片描述
说明:上面的${list.pageNum}${list.pages}${list.total}等这些属性都是属于list的,此时这个list是被分页后的列表,是从service层传回来的pageInfo分页列表。
在这里插入图片描述
而这个被pageHelper插件处理后的pageInfo列表具有诸多属性。
pageInfo类说明(源码分析)

  1. public class PageInfo<T> implements Serializable {
  2. private static final long serialVersionUID = 1L;
  3. //当前页
  4. private int pageNum;
  5. //每页的数量
  6. private int pageSize;
  7. //当前页的数量
  8. private int size;
  9. //由于startRow和endRow不常用,这里说个具体的用法
  10. //可以在页面中"显示startRow到endRow 共size条数据"
  11. //当前页面第一个元素在数据库中的行号
  12. private int startRow;
  13. //当前页面最后一个元素在数据库中的行号
  14. private int endRow;
  15. //总记录数
  16. private long total;
  17. //总页数
  18. private int pages;
  19. //结果集
  20. private List<T> list;
  21. //前一页
  22. private int prePage;
  23. //下一页
  24. private int nextPage;
  25. //是否为第一页
  26. private boolean isFirstPage = false;
  27. //是否为最后一页
  28. private boolean isLastPage = false;
  29. //是否有前一页
  30. private boolean hasPreviousPage = false;
  31. //是否有下一页
  32. private boolean hasNextPage = false;
  33. //导航页码数
  34. private int navigatePages;
  35. //所有导航页号
  36. private int[] navigatepageNums;
  37. //导航条上的第一页
  38. private int navigateFirstPage;
  39. //导航条上的最后一页
  40. private int navigateLastPage;
  41. public PageInfo() {
  42. }
  43. /** * 包装Page对象 * * @param list */
  44. public PageInfo(List<T> list) {
  45. this(list, 8);
  46. }
  47. /** * 包装Page对象 * * @param list page结果 * @param navigatePages 页码数量 */
  48. public PageInfo(List<T> list, int navigatePages) {
  49. if (list instanceof Page) {
  50. Page page = (Page) list;
  51. this.pageNum = page.getPageNum();
  52. this.pageSize = page.getPageSize();
  53. this.pages = page.getPages();
  54. this.list = page;
  55. this.size = page.size();
  56. this.total = page.getTotal();
  57. //由于结果是>startRow的,所以实际的需要+1
  58. if (this.size == 0) {
  59. this.startRow = 0;
  60. this.endRow = 0;
  61. } else {
  62. this.startRow = page.getStartRow() + 1;
  63. //计算实际的endRow(最后一页的时候特殊)
  64. this.endRow = this.startRow - 1 + this.size;
  65. }
  66. } else if (list instanceof Collection) {
  67. this.pageNum = 1;
  68. this.pageSize = list.size();
  69. this.pages = this.pageSize > 0 ? 1 : 0;
  70. this.list = list;
  71. this.size = list.size();
  72. this.total = list.size();
  73. this.startRow = 0;
  74. this.endRow = list.size() > 0 ? list.size() - 1 : 0;
  75. }
  76. if (list instanceof Collection) {
  77. this.navigatePages = navigatePages;
  78. //计算导航页
  79. calcNavigatepageNums();
  80. //计算前后页,第一页,最后一页
  81. calcPage();
  82. //判断页面边界
  83. judgePageBoudary();
  84. }
  85. }
  86. .......
  87. }

这里只列出所有属性和构造方法,那么可以清晰的看到一些属性的含义,一些属性是如何初始化,并且初始化值是怎样的,更多详细情况可以自己去查看源码。

以上的分页需求,可以非常方便的使用。
项目经理再也不用担心我的分页了!

发表评论

表情:
评论列表 (有 0 条评论,170人围观)

还没有评论,来说两句吧...

相关阅读

    相关 PageHelper

    们在任何的系统中,分页功能是必不可少的。然而,对于这个功能如果有一种快速开发的实现方式,当然可以节省我们很多的时间了。接下来,我就给大家基于不同的环境来说说如何使用一个分...

    相关 jsp+pageHelper

    PageHelper 简介 PageHelper是一款mabatis分页插件,但是归根结底的原理还是基于limit关键字进行分页的。 使用方式 1. 如果是使用

    相关 PageHelper使用

    使用分页插件的好处: 在编写Web后台代码时,分页是必不可少的,当然最通常的思路是在Sql中使用分页关键字来进行分页。在实际开发中,更多的是使用分页插件来减少代码冗杂,使