网站首页 > 文章精选 正文
前言
我们在做页面查询的时候由于页面无法一次性展示所有的数据,所以采用一种分段式的展示策略—分页查询,实现分页查询的方式有很多种方式,比如sql中的limit,mybatisplus带的分页插件等等,这里我们介绍一下如何在SpringBoot中使用PageHelper插件实现分页查询。
正文
PageHelper
PageHelper是针对MyBatis最方便的分页插件PageHelper支持任何复杂的单表,多表查询。 它有以下特点:
- PageHelper不支持嵌套结果映射.
- PageHelper本质上是两次查询,第一次是对记录总数量的查询,第二次是对记录的查询。
- 对记录的查询是利用了mybatis提供的拦截器,取得ThreadLocal的pageSize和pageNo,重新拼装分页sql,完成分页。实际上是在sql后面拼接limit来实现的。
limit分页查询的弊端:
- 当limit offset rows中的offset很大时,会出现效率问题,所以数据规模大是不推荐使用PageHelper来实现分页。
- 实际的开发过程中我们采用自己手写两次查询,在第二次对记录的查询是采用子查询的方式来对性能进行优化。
select * from test where val=4 limit 300000,5
优化成:
select * from test a inner join (select id from test where val=4 limit 300000,5) b on a.id=b.id
所以,如果在数据量不大的情况下可以使用PageHelper,否则就不推荐使用PageHelper了。
SpringBoot使用PageHelper实现数据分页
Maven依赖
<!--pagehelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
application.properties:配置类
#Paging assistant configuration
#配置数据库
pagehelper.helper-dialect=mysql
#页参数合理化
pagehelper.reasonable=true
#启用了分页,并且先执行了count后面的查询也拼接了limit
pagehelper.support-methods-arguments=true
#如果POJO或者Map中发现了countSql属性,就会作为count参数使用
pagehelper.params=count=countSql
#mybatis log
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
PageRequestPam:请求的抽象类
/**
* 分页模糊查询请求的封装类
*/
@Setter
@Getter
@ToString
public abstract class PageRequestPam implements Serializable {
private static final long serialVersionUID = 1L;
private int pageNum; //页面序号
private int pageSize; //页面大小
}
UserInfoForSearchRes:请求类
/**
* 这是用户查询的封装类
*/
@Setter
@Getter
@ToString
@ApiModel("用户查询请求类")
public class UserInfoForSearchRes extends PageRequestPam {
private static final long serialVersionUID = -5625703056478578435L;
@ApiModelProperty( notes = "用户名", example = "xiyuan666")
private String userName;
@ApiModelProperty( notes = "查询开始时间")
private Date searchStartTime;
@ApiModelProperty( notes = "查询结束时间")
private Date searchEndTime;
}
PageUtils:分页的结果工具类
public class PageUtils {
/**
* 将分页信息封装到统一的接口
* @param pam
* @param pageInfo
* @return
*/
public static Page getPageResult(PageRequestPam pam, PageInfo<?> pageInfo) {
Page page = new Page();
page.setPageNo(pageInfo.getPageNum());
page.setPageSize(pageInfo.getPageSize());
page.setTotalSize(pageInfo.getTotal());
page.setTotalPages(pageInfo.getPages());
page.setValue(pageInfo.getList());
return page;
}
}
Page:分页结果的封装类
/**
* 分页查询的结果封装类
*/
@Data
public class Page implements Serializable {
private static final long serialVersionUID = 1L;
private int pageNo;//当前页
private int pageSize;//当前页大小
private long totalSize;//记录总数
private int totalPages;//页码总数
private Object value;
}
验证
分页查询接口
@PostMapping("/queryUserListPage")
@ApiOperation(value = "用户分页模糊查询")
@ControllerMethodLog
public ResponseResult queryUserListPage(@RequestBody UserInfoForSearchRes userInfoForSearchRes) {
long startTime = System.currentTimeMillis(); //获取开始时间
int pageNum = userInfoForSearchRes.getPageNum();
int pageSize = userInfoForSearchRes.getPageSize();
PageHelper.startPage(pageNum, pageSize);
List<UserInfoPojo> list = userService.getUserInfoByPage(userInfoForSearchRes);
Page page= PageUtils.getPageResult(userInfoForSearchRes, new PageInfo<UserInfoPojo>(list));
long endTime = System.currentTimeMillis(); //获取结束时间
log.info("用户模块分页查询-总条数:" + list.size() + "用时:" + (endTime - startTime) + "ms");
return ResponseResult.success(page, ConstantsUtil.QUERY_SUCCESS);
}
通过knife4j访问分页查询接口
控制台打印信息
作者:溪源的奇思妙想
原文链接:
https://blog.csdn.net/weixin_40990818/article/details/109478502
猜你喜欢
- 2025-06-09 PageHelper - 最方便的 MyBatis 分页插件
- 2025-06-09 50个Java编程技巧,免费送给大家(java编程基础知识入门)
- 2025-06-09 SpringBoot 各种分页查询方式详解(全网最全)
- 2025-06-09 SpringBatch - R&W, 我与富婆的这一年
- 2025-06-09 面试官:说说MyBatis分页插件(PageHelper)工作原理和配置过程?
- 2025-06-09 面试二:pagehelper是怎么实现分页的,
- 2025-06-09 SpringBoot集成Mybatis-Plus分页插件
- 2025-06-09 【开发技术】Mybatis中进行多表关联查询?性能是不是会变好呢?
- 2025-06-09 每天从外包系统同步百万数据,用什么方案?Java实战讲解
- 2025-06-09 MyBatis插件开发实战:手写一个分页插件
- 最近发表
-
- 面试中常被问到的Hash表,你了解吗
- JAVA面试考点:一文搞懂一致性Hash的原理和实现
- 一次性搞清楚equals和hashCode(hashcode() 与equals()区别,简单说明)
- HashMap.Key的故事:Key为什么出现Hash碰撞及冲突呢?
- hash冲突的几种解决方案对比(hash冲突的解决方式)
- 游戏王LN 无头骑士(无头骑士cv)
- Linux ln、unlink命令用法(linux link命令详解)
- n和l分不清矫正发音方法,这三步就够了
- golang引用私有gitlab项目代码(golang引入当前包下的文件)
- Instamic:录音领域中的 GoPro,让你想录就录,随心所欲
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)