当前位置:   article > 正文

pagehelper分页插件(SpringBoot,Mybatis整合前后端分析)_分页插件pagehelper

分页插件pagehelper

前言:在学习项目的过程中遇到了数据分页的功能,单纯的js前端不能处理大的数据量,需要后端整理好数据发送给前端,那么使用分页插件无疑是个好选择.

目录

pagehelper依赖

接口方法mapper

Mybatis

Service

ServiceImpl

PageResult类

返回数据类

Controller层

前端

打印出的数据

上一页,下一页功能实现

展示数据,搜索功能,跳转框功能实现


pagehelper依赖

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

接口方法mapper

  1. // 根据名字模糊查询
  2. List<BookLibrary> findBookByName(String name);

Mybatis

这个sql完成的功能是:前端的搜索功能 和 展示数据 做出分页的效果。

如果name的值是 ’ 1l ‘ ,那么展示全部数据,否则 模糊查询,这里sql正常写就行(不用在意PageNum和PageSize参数,service层会重写)。

  1. <select id="findBookByName" resultType="com.ma.entity.BookLibrary">
  2. SELECT * FROM book_library
  3. WHERE
  4. <choose>
  5. <when test="name == '1l'">
  6. 1=1
  7. </when>
  8. <otherwise>
  9. name LIKE CONCAT('%', #{name}, '%')
  10. </otherwise>
  11. </choose>
  12. </select>

Service

    List<BookLibrary> findBookByName(int pageNum,int pageSize,String name);

ServiceImpl

注意这一步操作:

 1.  如果要做分页需要两个条件 当前页pageNum,和每页的数量pageSize,以及我结合搜索功能的name,这三个参数。

2.  PageHelper.startPage(pageNum, pageSize); ,这步操作就是分页插件的分页,写在第一步。

3. 调用你的mapper接口正常的查询数据,注意查询数据的操作一定放在分页后面!

4. 新建出来PageInfo的类,把查询到的数据bookByPage放在pageInfo对象里。

5. 返回pegeInfoList集合。

  1. @Override
  2. public List<BookLibrary> findBookByName(int pageNum, int pageSize, String name) {
  3. PageHelper.startPage(pageNum, pageSize);
  4. List<BookLibrary> bookByPage = bookLibaryMapper.findBookByName(name);
  5. PageInfo<BookLibrary> pageInfo = new PageInfo<>(bookByPage);
  6. return pageInfo.getList();
  7. }

PageResult类

如果想要把这些数据给到前端直接用,那么需要一个类去存储分页的数据。

  1. package com.ma.common;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import lombok.ToString;
  6. import java.util.List;
  7. @Data
  8. @AllArgsConstructor
  9. @NoArgsConstructor
  10. @ToString
  11. public class PageResult<T> {
  12. //当前页
  13. private int pageNum;
  14. //每页的数量
  15. private int pageSize;
  16. //当前页的数量
  17. private int size;
  18. //由于startRow和endRow不常用,这里说个具体的用法
  19. //可以在页面中"显示startRow到endRow 共size条数据"
  20. //当前页面第一个元素在数据库中的行号
  21. private int startRow;
  22. //当前页面最后一个元素在数据库中的行号
  23. private int endRow;
  24. //总记录数
  25. private long total;
  26. //总页数
  27. private int pages;
  28. //结果集
  29. private List<T> list;
  30. //前一页
  31. private int prePage;
  32. //下一页
  33. private int nextPage;
  34. //是否为第一页
  35. private boolean isFirstPage;
  36. //是否为最后一页
  37. private boolean isLastPage;
  38. //是否有前一页
  39. private boolean hasPreviousPage;
  40. //是否有下一页
  41. private boolean hasNextPage;
  42. //导航页码数
  43. private int navigatePages;
  44. //所有导航页号
  45. private int[] navigatepageNums;
  46. //导航条上的第一页
  47. private int navigateFirstPage;
  48. //导航条上的最后一页
  49. private int navigateLastPage;
  50. }

返回数据类

  1. package com.ma.common;
  2. import lombok.Data;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. @Data
  6. public class R<T> {
  7. private Integer code; //编码:1成功,0和其它数字为失败
  8. private String msg; //错误信息
  9. private T data; //数据
  10. private Map map = new HashMap(); //动态数据
  11. public static <T> R<T> success(T object) {
  12. R<T> r = new R<T>();
  13. r.data = object;
  14. r.code = 1;
  15. return r;
  16. }
  17. public static <T> R<T> error(String msg) {
  18. R r = new R();
  19. r.msg = msg;
  20. r.code = 0;
  21. return r;
  22. }
  23. public R<T> add(String key, Object value) {
  24. this.map.put(key, value);
  25. return this;
  26. }
  27. }

Controller层

1. 返回值是一个PageResult类存储分页的数据

2. 把前端传过来的值,直接交给service重写的方法findBookByName去进行分页操作。

3. 创建PageInfo类,把数据放进这个类中。

4. 创建存储分页数据的PageResult类

5. 把pageInfo里面分好的数据放到将要存储分页数据的PageResult类中,返回给前端。

(这里的set方法数据不一致,看PageResult类set设置去。)

  1. @GetMapping("/booklibrary/getBooksByPage/{name}")
  2. public R<PageResult> getBooksByPage(@RequestParam("pageNum") int pageNum, @RequestParam("pageSize") int pageSize, @PathVariable String name) {
  3. List<BookLibrary> bookByName = bookLibaryService.findBookByName(pageNum, pageSize, name);
  4. PageInfo<BookLibrary> pageInfo = new PageInfo<>(bookByName);
  5. PageResult<BookLibrary> pageResult = new PageResult<>();
  6. pageResult.setData(pageInfo.getList());
  7. pageResult.setTotalRecords(pageInfo.getTotal());
  8. pageResult.setCurrentPageNum(pageInfo.getPageNum());
  9. pageResult.setRecordsPerPage(pageInfo.getPageSize());
  10. pageResult.setTotalPages(pageInfo.getPages());
  11. return R.success(pageResult);
  12. }

到这里如果前端接口正常,就可以返回你设置的分页数据,去进行分页操作了。

前端

分页代码

  1. <div class="container mt-3">
  2. <ul class="pagination">
  3. <li class="page-item"><a class="page-link" id="prevBtn">上一页</a></li>
  4. <li class="page-item"><a class="page-link" onclick="findBookByName('1l',1)">1</a></li>
  5. <li class="page-item"><a class="page-link" onclick="findBookByName('1l',2)">2</a></li>
  6. <li class="page-item"><a class="page-link" onclick="findBookByName('1l',3)">3</a></li>
  7. <li class="page-item"><a class="page-link" id="nextBtn">下一页</a></li>
  8. <span id="totalRecords" style="margin-left: 20px;"></span>
  9. <input type="text" id="pageNumInput" style="width: 80px; height: 40px;margin-left: 20px;">
  10. <button type="button" class="btn btn-info" id="jumpButton" onclick="jumpToPage()">跳转</button>
  11. </ul>
  12. </div>

展示部分代码

  1. let name = "1l"; // 查询全部
  2. let pageNum = 1;
  3. let pageSize = 5;
  4. function findBookByName(name, pageNum) {
  5. let url = '/booklibrary/getBooksByPage/' + encodeURIComponent(name) + '?pageNum=' + pageNum + '&pageSize=' + pageSize;
  6. $.ajax({
  7. url: url,
  8. type: 'GET',
  9. dataType: 'json',
  10. contentType: 'application/json',
  11. headers: {
  12. 'Authorization': 'Bearer ' + token
  13. },
  14. success: function (response) {
  15. console.log(response)
  16. let totalRecords = response.data.totalRecords; // 总共有几条数据
  17. let totalPages = response.data.totalPages; // 当前页的记录数
  18. let currentPageNum = response.data.currentPageNum; // // 总页数
  19. $('#totalRecords').text("总共:" + totalRecords + "条数据 " + "第" + currentPageNum + "/" + totalPages + "页");

打印出的数据

上一页,下一页功能实现

  1. $('#prevBtn').off().click(function () {
  2. if (pageNum > 1) {
  3. pageNum--;
  4. findBookByName(name, pageNum);
  5. } else {
  6. // 已经是第一页,弹出提示框
  7. alert("已经是第一页");
  8. }
  9. });
  10. $('#nextBtn').off().click(function () {
  11. if (pageNum < totalPages) {
  12. pageNum++;
  13. findBookByName(name, pageNum);
  14. } else {
  15. // 已经是最后一页,弹出提示框
  16. alert("已经是最后一页");
  17. }
  18. });

展示数据,搜索功能,跳转框功能实现

  1. // 页面初始化数据
  2. findBookByName(name, pageNum);
  3. // 显示全部数据
  4. function findBookByNameAll() {
  5. findBookByName("1l", pageNum);
  6. }
  7. // 搜索
  8. function search() {
  9. let name = $('#searchValue').val().trim().replace(/\s/g, '');
  10. findBookByName(name, pageSize);
  11. }
  12. // 跳转到指定页码
  13. function jumpToPage() {
  14. let pageNum = parseInt($('#pageNumInput').val());
  15. if (isNaN(pageNum) || pageNum < 1) {
  16. alert('请输入有效的页码');
  17. return;
  18. }
  19. findBookByName("1l", pageNum);
  20. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/88004
推荐阅读
相关标签
  

闽ICP备14008679号