SpringBoot使用PageHelper分页详解

 更新时间:2023年10月25日 09:40:32   作者:刻苦的樊同学  
这篇文章主要介绍了SpringBoot使用PageHelper分页详解,我们在任何的系统中,分页功能是必不可少的,然而,对于这个功能如果有一种快速开发的实现方式,当然可以节省我们很多的时间了,接下来,我就给大家基于不同的环境来说说如何使用一个分页插件,需要的朋友可以参考下

pagehelper

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

首先加入pageHelper的依赖

<dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.5</version>
        </dependency>

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

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

使用

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

dao层

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

service层和serviceImpl层

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

controller层

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

test.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>pageHelper练习</title>
</head>
<body>
<table border="1">
    <thead>
    <tr>
        <th>ID</th>
        <th>地址</th>
        <th>详细地址</th>
        <th>电话</th>
        <th>账号</th>
    </tr>
    </thead>
    <tbody>
    <tr th:each="user : ${list}">
        <!-- 将用户的主键 uId 存在在 name 属性中-->
        <td th:text="${user.id}"></td>
        <td th:text="${user.location}"></td>
        <!-- 使用dates对象格式化日期-->
        <td th:text="${user.detail}"></td>
        <!-- 三运运算判断是否已婚-->
        <td th:text="${user.phone}"></td>
        <td th:text="${user.account}"></td>
    </tr>
    </tbody>
</table>
当前第 <span th:text="${list.pageNum}"></span> 页.
总共 <span th:text="${list.pages}"></span> 页.
一共 <span th:text="${list.total}"></span> 条记录
<a th:href="@{/page/list?pn=1}" rel="external nofollow" >首页</a>
<a th:href="@{'/page/list?pn='+${list.pageNum-1}}" rel="external nofollow" >上一页</a>
<a th:href="@{'/page/list?pn='+${list.pageNum+1}}" rel="external nofollow" >下一页</a>
<a th:href="@{'/page/list?pn='+${list.pages}}" rel="external nofollow" >尾页</a>

</body>
</html>

访问路径//localhost:8082/page/list pn参数会默认会1 结果

在这里插入图片描述

说明:上面的${list.pageNum},${list.pages},${list.total}等这些属性都是属于list的,此时这个list是被分页后的列表,是从service层传回来的pageInfo分页列表。

在这里插入图片描述

而这个被pageHelper插件处理后的pageInfo列表具有诸多属性。

pageInfo类说明(源码分析)

public class PageInfo<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    //当前页
    private int pageNum;
    //每页的数量
    private int pageSize;
    //当前页的数量
    private int size;
 
    //由于startRow和endRow不常用,这里说个具体的用法
    //可以在页面中"显示startRow到endRow 共size条数据"
 
    //当前页面第一个元素在数据库中的行号
    private int startRow;
    //当前页面最后一个元素在数据库中的行号
    private int endRow;
    //总记录数
    private long total;
    //总页数
    private int pages;
    //结果集
    private List<T> list;
 
    //前一页
    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;
 
    public PageInfo() {
    }
 
    /**
     * 包装Page对象
     *
     * @param list
     */
    public PageInfo(List<T> list) {
        this(list, 8);
    }
 
    /**
     * 包装Page对象
     *
     * @param list          page结果
     * @param navigatePages 页码数量
     */
    public PageInfo(List<T> list, int navigatePages) {
        if (list instanceof Page) {
            Page page = (Page) list;
            this.pageNum = page.getPageNum();
            this.pageSize = page.getPageSize();
 
            this.pages = page.getPages();
            this.list = page;
            this.size = page.size();
            this.total = page.getTotal();
            //由于结果是>startRow的,所以实际的需要+1
            if (this.size == 0) {
                this.startRow = 0;
                this.endRow = 0;
            } else {
                this.startRow = page.getStartRow() + 1;
                //计算实际的endRow(最后一页的时候特殊)
                this.endRow = this.startRow - 1 + this.size;
            }
        } else if (list instanceof Collection) {
            this.pageNum = 1;
            this.pageSize = list.size();
 
            this.pages = this.pageSize > 0 ? 1 : 0;
            this.list = list;
            this.size = list.size();
            this.total = list.size();
            this.startRow = 0;
            this.endRow = list.size() > 0 ? list.size() - 1 : 0;
        }
        if (list instanceof Collection) {
            this.navigatePages = navigatePages;
            //计算导航页
            calcNavigatepageNums();
            //计算前后页,第一页,最后一页
            calcPage();
            //判断页面边界
            judgePageBoudary();
        }
    }
.......
}

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

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

到此这篇关于SpringBoot使用PageHelper分页详解的文章就介绍到这了,更多相关SpringBoot使用PageHelper内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • xxl-job的部署及springboot集成使用示例详解

    xxl-job的部署及springboot集成使用示例详解

    XXL-Job是一个分布式任务调度平台,可进行任务调度、管理和监控,并提供任务分片、失败重试、动态分配等功能,这篇文章主要介绍了xxl-job的部署及springboot集成使用,需要的朋友可以参考下
    2023-06-06
  • Apache Arrow Parquet存储与使用

    Apache Arrow Parquet存储与使用

    这篇文章主要为大家介绍了Apache Arrow Parquet存储与使用原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 基于selenium-java封装chrome、firefox、phantomjs实现爬虫

    基于selenium-java封装chrome、firefox、phantomjs实现爬虫

    这篇文章主要介绍了基于selenium-java封装chrome、firefox、phantomjs实现爬虫,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2020-10-10
  • Springboot jpa @Column命名大小写问题及解决

    Springboot jpa @Column命名大小写问题及解决

    这篇文章主要介绍了Springboot jpa @Column命名大小写问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java中IO流简介_动力节点Java学院整理

    Java中IO流简介_动力节点Java学院整理

    Java io系统的设计初衷,就是为了实现“文件、控制台、网络设备”这些io设置的通信。接下来通过本文给大家介绍Java中IO流简介,感兴趣的朋友一起看看吧
    2017-05-05
  • Java设计模式之装饰模式详解

    Java设计模式之装饰模式详解

    这篇文章主要介绍了Java设计模式中的装饰者模式,装饰者模式即Decorator Pattern,装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能,装饰模式又名包装模式。装饰器模式以对客户端透明的方式拓展对象的功能,是继承关系的一种替代方案
    2022-08-08
  • Spring Boot 中整合 MyBatis-Plus详细步骤(最新推荐)

    Spring Boot 中整合 MyBatis-Plus详细步骤(最新推荐)

    本文详细介绍了如何在SpringBoot项目中整合MyBatis-Plus,包括整合步骤、基本CRUD操作、分页查询、批量操作、自定义SQL操作等,通过这些步骤,开发者可以快速实现数据库操作,提高开发效率,感兴趣的朋友一起看看吧
    2025-01-01
  • 利用Java将2019拆分成三个素数平方和的方法实例

    利用Java将2019拆分成三个素数平方和的方法实例

    这篇文章主要给大家介绍了关于利用Java将2019拆分成三个素数平方和的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • SpringBoot如何使用MyBatisPlus逆向工程自动生成代码

    SpringBoot如何使用MyBatisPlus逆向工程自动生成代码

    本文介绍如何使用SpringBoot、MyBatis-Plus进行逆向工程自动生成代码,并结合Swagger3.0实现API文档的自动生成和访问,通过详细步骤和配置,确保Swagger与SpringBoot版本兼容,并通过配置文件和测试类实现代码生成和Swagger文档的访问
    2024-12-12
  • Java Mybatis foreach嵌套foreach List<list<Object>>问题

    Java Mybatis foreach嵌套foreach List<list<Object>&

    在MyBatis的mapper.xml文件中,foreach元素常用于动态生成SQL查询条件,此元素包括item(必选,元素别名)、index(可选,元素序号或键)、collection(必选,指定迭代对象)、open、separator、close(均为可选,用于定义SQL结构)
    2024-09-09

最新评论