使用PageHelper实现分页查询(详细):

实现环境:

语言 编程工具 框架 分页插件 前端 前端数据获取
Java IDEA SpringBoot pageHelper BootStrap Thymeleaf

**项目背景:**我们需要在mydb这个数据库的user表中查询并在 一个HTML页面中分页显示出表中的数据。

一、我们先实现显示出全部内容

我们先从头到尾的创建一个SpringBoto项目,然后再实现分页。

1、首先我们创建一个新的SpringBoot项目:

2、创建实体类User:

package com.example.pagehelper.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;//这里使用Lombok直接生成get和set方法以及构造函数
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {int id;String name;int age;String pwd;
}

3、创建dao层 mapper接口:

package com.example.pagehelper.mapper;import com.example.pagehelper.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;//使用注解将Mapper添加到IOC容器
@Mapper
public interface UserMapper {//通过注解查询出全部数据@Select("select * from user")List<User> queryUser();
}

4、创建业务层接口userService:

package com.example.pagehelper.service;import com.example.pagehelper.pojo.User;import java.util.List;public interface userService {List<User> queryUser();
}

5、创建业务层实现类 userServiceImpl:

package com.example.pagehelper.service;import com.example.pagehelper.mapper.UserMapper;
import com.example.pagehelper.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service("userService")
public class userServiceImpl implements userService{@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> queryUser() {return userMapper.queryUser();}
}

6、创建userController类:

package com.example.pagehelper.controller;import com.example.pagehelper.pojo.User;
import com.example.pagehelper.service.userServiceImpl;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import javax.annotation.Resource;
import java.util.List;@Controller
public class userController {@Resourceprivate userServiceImpl userService;@RequestMapping("/user")public String queryUser(Model model){List<User> users = userService.queryUser();model.addAttribute("user",users);return "allUser";}
}

7、配置application.properties配置文件:

#JDBC连接信息配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456#设置为 true 来自动中断循环。
spring.main.allow-circular-references=true#thymeleaf配置
#前缀
spring.thymeleaf.prefix=classpath:/templates/
#后缀
spring.thymeleaf.suffix=.html
#表示前端页面文件为HTML5
spring.thymeleaf.mode=HTML5
#字符集编码为UTF-8
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
spring.thymeleaf.cache=false
spring.thymeleaf.enabled=true

8、编写HTML页面代码:

<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head><title>用户列表</title><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- 引入 Bootstrap --><link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body><div class="container"><div class="row clearfix"><div class="col-md-12 column"><table class="table table-hover table-striped"><thead><tr><th>用户ID</th><th>用户名</th><th>年龄</th><th>密码</th><th>操作</th></tr></thead><tr th:each="user,iterStat : ${alluser}"><td th:text="${user.id}"></td><td th:text="${user.name}"></td><td th:text="${user.age}"></td><td th:text="${user.pwd}"></td><td><a th:href="#">更改</a> |<a th:href="#">删除</a></td></tr></table></div></div>
</div>

此时我们整个项目的全部显示就算是完成了(以上代码会出现一个问题,解决方法可见文末!!!)

到此我们的显示就没问题了,接下来我们再实现分页显示。

二、实现分页显示

这里我们通过 pagehelper 插件来实现分页显示:

官方使用文档:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

1、导包:

我们要使用PageHelper插件的话,需要先在pom文件中导入相关的依赖包。

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

2、配置application.properties:

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

3、开始使用PageHelper:

这里官方给了几种不同的方法:

//第一种,RowBounds方式的调用
List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectIf(1);//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<User> list = userMapper.selectIf(1);//第四种,参数方法调用
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {List<User> selectByPageNumSize(@Param("user") User user,@Param("pageNum") int pageNum, @Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List<User> list = userMapper.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<User> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List<User> list = userMapper.selectByPageNumSize(user);//第六种,ISelect 接口方式
//jdk6,7用法,创建接口
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {@Overridepublic void doSelect() {userMapper.selectGroupBy();}
});
//jdk8 lambda用法
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(()-> userMapper.selectGroupBy());//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {@Overridepublic void doSelect() {userMapper.selectGroupBy();}
});
//对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {@Overridepublic void doSelect() {userMapper.selectLike(user);}
});
//lambda
total = PageHelper.count(()->userMapper.selectLike(user));

4、userServiceImpl类:

前面的User类,UserMapper以及userService都不需要更改,我们直接在userServiceImpl中添加分页查询的方法即可。

    //分页查询功能public List<User> queryUserByPage(Integer pageNum,Integer pageSize){PageHelper.startPage(pageNum,pageSize);return userMapper.queryUser();}

5、userController类:

添加一个控制器。

@RequestMapping("/allByPage")public String allBookByPage(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "5") Integer pageSize,//设置默认页面大小为5Model model){//为了程序的严谨性,判断非空:if(pageNum == null){//若pageNum为空pageNum = 1;   //设置默认当前页为1}if(pageNum <= 0){  //若为负数pageNum = 1;   //设置默认值为1}if(pageSize == null){ //若页面大小为空pageSize = 5;    //设置默认每页显示的数据数}try {//调用分页查询的方法List<User> users = userService.queryUserByPage(pageNum,pageSize);model.addAttribute("alluser",users);//查询出的数据传到前端PageInfo pageInfo = new PageInfo(users,pageSize);//设置页面大小model.addAttribute("pageInfo",pageInfo);//将页面信息传到前端}finally {PageHelper.clearPage(); //清理 ThreadLocal 存储的分页参数,保证线程安全}return "allUser";}

6、HTML页面:

在table标签后面添加切换页面按钮。

<ul class="pagination justify-content-end" style="float: right"><!--首页--><li class="page-item"><a class="page-link" th:href="'allByPage?pageNum='+${pageInfo.navigateFirstPage}">首页</a></li><!--上一页--><li class="page-item"><a class="page-link" th:href="'allByPage?pageNum='+${pageInfo.prePage}">上一页</a></li><!--循环遍历显示中间的页数--><li th:each="list:${pageInfo.navigatepageNums}"><a th:href="'allByPage?pageNum='+${list}" th:text="${list}" th:if="${list != pageInfo.pageNum}"></a><span style="font-weight: bold;background: #6faed9;" th:if="${list == pageInfo.pageNum}" th:text="${list}" ></span></li><!--下一页--><li class="page-item" th:if="${pageInfo.hasNextPage}"><a class="page-link" th:href="'allByPage?pageNum='+${pageInfo.nextPage}">下一页</a></li><!--尾页--><li class="page-item"><a class="page-link" th:href="'allByPage?pageNum='+${pageInfo.navigateLastPage}">尾页</a></li>
</ul>

7、结果展示:

第一页:

第二页:

三、可能出现的问题:

2022-05-16 16:55:33.656 ERROR 10964 --- [nio-8080-exec-1] org.thymeleaf.TemplateEngine   : [THYMELEAF][http-nio-8080-exec-1] Exception processing template "allUser": An error happened during template parsing (template: "class path resource [templates/allUser.html]")

如果出现找不到html资源的错误,可能是因为我们在使用 thymeleaf 时出现错误,如获取controller传过来的数据时等等;此时我们应该仔细检查一下在使用 thymeleaf 的过程中是否有语法错误。

在上述代码中,我们就会出现一个这样的问题:

首先,此时我们可以先考虑是不是在controller查询的时候出了问题,我们可以在controller中输出一下我们查询出来的数据:

这里我们可以看到虽然报错了,但是数据是查出来了的。这时就可以确定问题肯定是在HTML代码中了。

然后我们查看HTML代码:

这里可以发现,我们在a标签中多写了两个 th: ,且后面没有去获取一个值;所以这里才会报错!

**总结:**遇到这种问题要么是controller中查询数据时出了问题使得HTML中获取不到;要么就是HTML中thymelefa语法有问题,只要仔细检查thymelefa语法即可。

使用PageHelper实现分页查询(详细)相关推荐

  1. Springboot Mybatis使用PageHelper实现分页查询

    以下介绍实战中数据库框架使用的是mybatis,对整合mybatis此处不做介绍. 使用pageHelper实现分页查询其实非常简单,共两步: 一.导入依赖: pom.xml添加依赖: <!-- ...

  2. PageHelper实现分页查询

    文章目录 前言 一.PageHelper实现分页查询 二.PageHelper的基本使用 1. 先编写持久层 2.编写业务逻辑层 3..编写控制层 4.使用JsonPage返回结果 总结 前言 分页查 ...

  3. Springboot Mybatis使用pageHelper实现分页查询

    以下介绍实战中数据库框架使用的是mybatis,对整合mybatis此处不做介绍. 使用pageHelper实现分页查询其实非常简单,共两步: 一.导入依赖: 二.添加配置: 那么开始, 第一步: p ...

  4. mybatis 分页查询_MyBatis之分页查询:MyBatis PageHelper

    MyBatis,作为目前流行的ORM框架,大大方便了日常开发.而对于分页查询,虽然可以通过SQL的limit语句实现,但是比较繁琐.而MyBatis PageHelper的出现,则解决了这一痛点.这里 ...

  5. pageHelper与PageInfo联合进行分页查询原理

    示例代码 : 此条查询语句会被分页处理, 返回对应的结果集数据, 即users集合 question : 既然进行了分页处理, 那怎么获取数据的总条数呢? 其实users集合其实是Page对象, Pa ...

  6. 分页查询PageHelper

    分页查询的优点 所谓分页,就是查询结果数据较多时,采用按页显示的方法,而不是一次性全部显示 分页的优点: 服务器:一次性查询所有信息,服务器压力大,分页查询服务器压力小 客户端:一次性显示所有信息,需 ...

  7. mybatis-plus分页查询详解

    文章目录 一.官方文档 二.内置的分页方法 1.内置方法 2.selectPage单元测试 3.PaginationInnerInterceptor分页插件配置 三.分页原理分析 四.自定义分页方法 ...

  8. mybatis-plus分页查询三种方法

    mybatis-plus分页查询 一.前期准备表 1.配置类 二.使用selectPage 1.Service 2.结果 三.使用2种分页查询的写法 1.xml 2.Mapper 3.第一种写法 4. ...

  9. 大数据量下 PageHelper 分页查询性能问题的解决办法

    作者:岁月安然 blog.csdn.net/baidu_38083619/article/details/82463058 前因 项目一直使用的是PageHelper实现分页功能,项目前期数据量较少一 ...

最新文章

  1. java获取下一季末_java取当前周期、月初至月末、季度初至季度末日期。
  2. oracle expdp 权限不足 1031,关于expdp,impdp操作需要的权限
  3. [PA2014]Pakowanie
  4. 【源资讯 第37期】一个时代的终结 —— 再见, Flash !
  5. java8中的Lamba表达式
  6. 【spring boot】【thymeleaf】SPEL调用静态方法和静态属性
  7. 计算机组成原理--主存储器
  8. 【Envi风暴】Envi5.4经典安装图文教程
  9. python合并两个excel文件_利用Python将多个excel文件合并为一个文件
  10. 文件不能自动求和_Excel求和公式函数的使用方法教程
  11. cmd切换为administrator用户
  12. Centos7没有ip地址
  13. Java API下载和查阅方法
  14. mysql execute stmt_mysql_stmt_execute()
  15. 推荐电视剧 大秦帝国之裂变 2008
  16. 浅谈prometheus(普罗米修斯) client golang
  17. 一个人靠不靠谱,就看这 8 个细节
  18. 小红书api_【实习精选】oppo、小红书等名企实习汇总(96)
  19. Rust 引入其他的 rs 文件
  20. 一文带你读懂“亚当理论”的精髓:期货股票交易操作守则与操作技巧

热门文章

  1. matlab:画正方体框
  2. 制作正方体html+css3(动画)
  3. 高分子PEG分子量从1000-40000不等,DSPE-PEG9-Mal
  4. ImageMagick:png序列转gif(适合处理带透明度的图片)
  5. 【Android开源控件】SmartRefreshLayout实现下拉刷新,上划加载
  6. datafaker-测试数据生成工具使用
  7. python gui测试工具_在Suse10下尝试dogtail(一个python的GUI测试工具..
  8. 诺基亚6升级+Android8,诺基亚6.2喜迎Android10操作系统更新
  9. iOS【彻底清空APP缓存】
  10. (15.1.8)2015互联网女皇报告:互联网仍在缓慢增长