首页 > 其他分享 >Spring Boot + Thymeleaf 使用PageHelper实现分页

Spring Boot + Thymeleaf 使用PageHelper实现分页

时间:2022-10-09 18:01:34浏览次数:73  
标签:pageNum 分页 pageSize Spring Boot PageHelper countryMapper startPage


一、概述

使用分页插件来实现分页功能。好处是,分页条你可以自行排版,不受页面约束。(前端使用的是thymeleaf)

我使用的是spring boot 2.1.11.RELEASE,如果按照以下步骤不能实现分页,那可能是pagehelper的版本问题,更换版本试一下。

二、使用

首先在项目pom.xml中加入pagehelper插件的依赖

<!--pagehelper分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>

配置

pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
pagehelper.params=count=countSql

controller

//分页查询数据
@GetMapping("/usermanage")
public String usermanage(Model model,
@RequestParam(required = false,defaultValue="1",value="pageNum")Integer pageNum,
@RequestParam(defaultValue="5",value="pageSize")Integer pageSize){

//为了程序的严谨性,判断非空:
if(pageNum == null){
pageNum = 1; //设置默认当前页
}
if(pageNum <= 0){
pageNum = 1;
}
if(pageSize == null){
pageSize = 5; //设置默认每页显示的数据数
}
System.out.println("当前页是:"+pageNum+"显示条数是:"+pageSize);

//1.引入分页插件,pageNum是第几页,pageSize是每页显示多少条,默认查询总数count
PageHelper.startPage(pageNum,pageSize);
//2.紧跟的查询就是一个分页查询-必须紧跟.后面的其他查询不会被分页,除非再次调用PageHelper.startPage
try {
List<User> userList = userService.getAll();//service查询所有的数据的接口
System.out.println("分页数据:"+userList);
//3.使用PageInfo包装查询后的结果,5是连续显示的条数,结果list类型是Page<E>
PageInfo<User> pageInfo = new PageInfo<User>(userList,pageSize);
//4.使用model/map/modelandview等带回前端
model.addAttribute("pageInfo",pageInfo);
}finally {
PageHelper.clearPage(); //清理 ThreadLocal 存储的分页参数,保证线程安全
}
//5.设置返回的jsp/html等前端页面
// thymeleaf默认就会拼串classpath:/templates/xxxx.html
return "admin/user/list";
}

重要提示:

  1. 只有紧跟在PageHelper.startPage()方法后的第一个Mybatis的查询(Select)方法会被分页。
  2. 请不要在系统中配置多个分页插件(使用Spring时,mybatis-config.xml和Spring配置方式,请选择其中一种,不要同时配置多个分页插件)!
  3. 对于带有for update的sql,会抛出运行时异常,对于这样的sql建议手动分页,毕竟这样的sql需要重视。
  4. 由于嵌套结果方式会导致结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确。

还有就分页插件支持以下几种调用方式(你任选),复制粘贴就好: 

//第一种,RowBounds方式的调用
List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));

//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectIf(1);

//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<Country> list = countryMapper.selectIf(1);

//第四种,参数方法调用
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
List<Country> selectByPageNumSize(
@Param("user") User user,
@Param("pageNum") int pageNum,
@Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List<Country> list = countryMapper.selectByPageNumSize(user, 1, 10);

//第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {
//其他fields
//下面两个参数名和 params 配置的名字一致
private Integer pageNum;
private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
List<Country> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List<Country> list = countryMapper.selectByPageNumSize(user);

//第六种,ISelect 接口方式
//jdk6,7用法,创建接口
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
@Override
public void doSelect() {
countryMapper.selectGroupBy();
}
});
//jdk8 lambda用法
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(()-> countryMapper.selectGroupBy());

//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
@Override
public void doSelect() {
countryMapper.selectGroupBy();
}
});
//对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> countryMapper.selectGroupBy());

//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {
@Override
public void doSelect() {
countryMapper.selectLike(country);
}
});
//lambda
total = PageHelper.count(()->countryMapper.selectLike(country));

前端thmeleaf

<!--显示分页信息-->
<div class="modal-footer no-margin-top">
<div class="col-md-6">
当前第 [[${pageInfo.pageNum}]]页,共 [[${pageInfo.pages}]] 页.一共 [[${pageInfo.total}]] 条记录
</div>

<ul class="pagination pull-right no-margin">
<li th:if="${pageInfo.hasPreviousPage}">
<a th:href="'/usermanage?pageNum=1'">首页</a>
</li>

<li class="prev" th:if="${pageInfo.hasPreviousPage}">
<a th:href="'/usermanage?pageNum='+${pageInfo.prePage}">
<i class="ace-icon fa fa-angle-double-left"></i>
</a>
</li>
<!--遍历条数-->
<li th:each="nav:${pageInfo.navigatepageNums}">
<a th:href="'/usermanage?pageNum='+${nav}" th:text="${nav}" th:if="${nav != pageInfo.pageNum}"></a>
<span style="font-weight: bold;background: #6faed9;" th:if="${nav == pageInfo.pageNum}" th:text="${nav}" ></span>
</li>

<li class="next" th:if="${pageInfo.hasNextPage}">
<a th:href="'/usermanage?pageNum='+${pageInfo.nextPage}">
<i class="ace-icon fa fa-angle-double-right"></i>
</a>
</li>

<li>
<a th:href="'/usermanage?pageNum='+${pageInfo.pages}">尾页</a>
</li>
</ul>
</div>

<div>当前页号:<span th:text="${pageInfo.pageNum}"></span></div>
<div>每页条数:<span th:text="${pageInfo.pageSize}"></span></div>
<div>起始行号:<span th:text="${pageInfo.startRow}"></span></div>
<div>终止行号:<span th:text="${pageInfo.endRow}"></span></div>
<div>总结果数:<span th:text="${pageInfo.total}"></span></div>
<div>总页数:<span th:text="${pageInfo.pages}"></span></div>
<hr />
<div>是否为第一页:<span th:text="${pageInfo.isFirstPage}"></span></div>
<div>是否为最后一页:<span th:text="${pageInfo.isLastPage}"></span></div>
<div>是否有前一页:<span th:text="${pageInfo.hasPreviousPage}"></span></div>
<div>是否有下一页:<span th:text="${pageInfo.hasNextPage}"></span></div>

这是使用的thymeleaf语法来集成PageHelper实现的分页,很多从JSP转thymeleaf的同学可以直接使用这个代码就好了。

说明一点哈,这些都是需要引入CSS,js,jquery之类的,基本上版本通用的,PageHelper官网就有,不要不引入就来跟我说没有效果。

PageHelper官网:https://pagehelper.github.io/docs/howtouse/

标签:pageNum,分页,pageSize,Spring,Boot,PageHelper,countryMapper,startPage
From: https://blog.51cto.com/u_11334685/5740993

相关文章

  • SpringMVC之参数验证
    SpringMVC之参数验证目录SpringMVC之参数验证一、为什么使用参数验证1.1、参数验证作用二、怎么使用参数验证2.1、小结三、具体操作流程3.1、在pojo类中添加需要使用的注......
  • 从SpringBoot启动,阅读源码设计
    服务启动堪称Spring源码设计的答案;一、背景说明初学SpringBoot框架时,第一次启动服务,直呼什么鬼?只需要简单的几步配置,几个核心的注解,就可以快速实现工程的搭建和运行;虽......
  • spring boot集成redis基础入门
    redis支持持久化数据,不仅支持key-value类型的数据,还拥有list,set,zset,hash等数据结构的存储。可以进行master-slave模式的数据备份更多redis相关文档请查看redis官方文......
  • Spring 深入——IoC 容器 01
    IoC容器的实现学习——01目录IoC容器的实现学习——01简介IoC容器系列的设计与实现:BeanFactory和ApplicationContextBeanFactoryloadBeanDefinition()ApplicationConte......
  • SpringBoot启动配置原理
    https://cloud.tencent.com/developer/article/1802822?from=article.detail.1449134#SpringBoot启动配置原理几个重要的事件回调机制配置在META-INF/spring.factori......
  • SpringBoot实现Mysql读写分离
    前言在高并发的场景中,关于数据库都有哪些优化的手段?常用的有以下的实现方法:读写分离、加缓存、主从架构集群、分库分表等,在互联网应用中,大部分都是读多写少的场景,设置......
  • springBooot项目启动失败小集锦
     1.端口冲突问题***************************APPLICATIONFAILEDTOSTART***************************Description:TheTomcatconnectorconfiguredtolistenonpo......
  • 如何屏蔽掉SpringBoot项目中自己不想使用的模块
    最近在修改离职同事几年前的代码,没有文档,向正常启动跑个单元测试都困难。比如我这次想测试一下我写的查询,结果单元测试运行的时候就提示Mailserverisnotavailable,当......
  • SpringCloud随笔
    SpringCloud随笔1.初识SpringCloud与微服务背景:由于单体应用讲各种模块整合在一起,并且部署在一个进程内,所以我们通常对其中一个业务模块的修改也必须将整个应用重新打包......
  • SpringBoot启动原理
    https://cloud.tencent.com/developer/article/1747423?from=article.detail.1449134背景1>大家都知道SpringBoot是通过main函数启动的,这里面跟踪代码到处都没有找到whi......