当前位置: 首页 > news >正文

从0到1学会使用PageHelper

本文的思维导图

为什么我们需要PageHelper?

想象一下,你经营着一家餐厅,有顾客要点菜了,就比如:“鱼香肉丝”,你要把菜端给顾客。

这时候,你要怎么把菜给顾客呢(如何把数据展示给前端)?你有三个解决方案:

1.不分页:你要把厨房里所有的鱼香肉丝(可能是1000份)全端上桌

2.手动分页:你每次跑去厨房,数10份端出来,来回跑几十趟

3.PageHelper:你告诉助手:“给我第2桌的10份”,助手自动处理好

在代码中的体现就是

//原始分页 String sql = "SELECT * FROM users LIMIT " + (pageNum-1)*pageSize + "," + pageSize; //还要再写一个count查询:SELECT COUNT(*) FROM users
//PageHelper分页 PageHelper.startPage(pageNum, pageSize); List<User> users = userMapper.selectAll();

你认为你会选择什么呢?肯定是PageHelper啊。

那么PageHelper是什么呢?

是什么

PageHelper是 MyBatis 的一个物理分页插件,,其核心是MyBatis的拦截器,目前不知道也没关系核心作用是自动生成分页SQL,让开发者无需手动编写复杂的分页语句

其特点决定了他非常好用,那么他的特点是什么呢?

1.物理分页(性能优):在数据库查询时就只查当前页数据(如 MySQL 的LIMIT),性能远优于内存分页(一次性查全量再截取)。

2.无侵入不修改原有SQL、不改动 Mapper 接口,只需一行代码开启分页。

3.多兼容:自动适配 MySQL、Oracle、SQL Server、PostgreSQL 等十几种数据库

4.功能全:自动统计总条数、支持排序、分页合理化、自定义 COUNT SQL。

5.对Spring Boot 友好:提供starter,一键集成

行,知道了这些,那么要怎么用呢?

怎么做(如何使用PageHelper)

一,快速入门

步骤1:添加依赖

<!-- 在 pom.xml 中添加 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>最新版本</version> <!-- 如 1.4.6 --> <!--如果你用的 MyBatis版本较新,推荐使用 1.5.0 --> </dependency>

步骤2:基本配置

# application.yml pagehelper: helper-dialect: mysql # 数据库方言:mysql, oracle, sqlite等,dialect就是方言的意思 reasonable: true # 分页合理化:超出总页数时显示最后一页 support-methods-arguments: true # 支持通过Mapper接口参数传递 params: count=countSql # 增加count查询

步骤3:最简单的使用

@Service public class UserService { @Autowired private UserMapper userMapper; public PageInfo<User> getUsers(int pageNum, int pageSize) { // 1. 设置分页参数(就像告诉小助手:我要第2页,每页10条) PageHelper.startPage(pageNum, pageSize); // 2. 紧接着执行查询(一定要紧跟!) List<User> userList = userMapper.selectAll(); // 3. 用PageInfo包装结果 return new PageInfo<>(userList); } }

总结一下:1.设置分页参数 2.执行查询3.用PageInfo包装结果

// PageHelper流程化的三行代码 PageHelper.startPage(pageNum页码, pageSize每页条数); // 设置 List<T> list = xxxMapper.selectXxx(); // 查询 PageInfo<T> pageInfo = new PageInfo<>(list); // 包装

二、PageHelper的核心概念比喻

你的餐厅有1000道菜(数据库记录)客人要看菜单,但你不可能把1000道菜全打印在一张纸上。

PageHelper的概念

在餐厅的比喻

作用

pageNum

第几页菜单

客人说:"给我看第2页菜单"

pageSize

每页几道菜

每页显示10道菜

PageHelper.startPage()

告诉后厨:"按10道菜一页来准备"

设置分页参数

PageInfo

智能菜单本

包含:当前页、总页数、总菜数等

count查询

先数一下总共有多少道菜

自动统计总数

三、完整使用示例

1.基础分页查询

@RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; /** * 分页查询用户列表 * @param pageNum 页码(默认第1页) * @param pageSize 每页条数(默认10条) */ @GetMapping("/list") public Result getUserList( @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) { // 设置分页参数 PageHelper.startPage(pageNum, pageSize); // 执行查询 List<User> users = userService.getAllUsers(); // 用PageInfo包装结果 PageInfo<User> pageInfo = new PageInfo<>(users); return Result.success(pageInfo); } }

2.复杂查询分页

@Service public class OrderService { public PageInfo<Order> searchOrders(OrderQuery query, int pageNum, int pageSize) { // 设置分页参数 PageHelper.startPage(pageNum, pageSize); // 执行带条件的查询 List<Order> orders = orderMapper.selectByCondition(query); return new PageInfo<>(orders); } } // 查询条件对象 @Data public class OrderQuery { private String orderNo; // 订单号 private Integer status; // 订单状态 private Date startTime; // 开始时间 private Date endTime; // 结束时间 private String customerName; // 客户名 }

我们使用PageInfo来包装返回的信息,那么PageInfo里面是什么样子的呢?

四、PageInfo 的完整信息

//写下这一句的时候就封装了这些信息 PageInfo<User> pageInfo = new PageInfo<>(userList); // 前端能拿到的所有信息: { "pageNum": 2, // 当前页码 "pageSize": 10, // 每页数量 "size": 10, // 当前页实际数量 "total": 156, // 总记录数 "pages": 16, // 总页数 "list": [...], // 数据列表 // 导航页信息 "prePage": 1, // 上一页 "nextPage": 3, // 下一页 "isFirstPage": false, // 是否第一页 "isLastPage": false, // 是否最后一页 "hasPreviousPage": true, // 是否有上一页 "hasNextPage": true, // 是否有下一页 // 导航页码 "navigatePages": 8, // 导航页码数 "navigatepageNums": [1, 2, 3, 4, 5, 6, 7, 8], // 所有导航页码 "navigateFirstPage": 1, // 导航条第一页 "navigateLastPage": 8 // 导航条最后一页 }

PageHelper的常用字段:

pageInfo.getTotal(); // 总记录数 pageInfo.getPages(); // 总页数 pageInfo.getPageNum(); // 当前页码 pageInfo.getPageSize(); // 每页条数 pageInfo.getList(); // 当前页数据列表 pageInfo.isIsFirstPage(); // 是否第一页 pageInfo.isIsLastPage(); // 是否最后一页

五、高级用法

1.排序功能

//比如说按照创建时间倒序排列 //单个排序字段 String orderBy = "create_time desc"; PageHelper.startPage(pageNum, pageSize, orderBy); List<User> users = userMapper.selectAll(); // 多个排序字段 String orderBy = "age asc, create_time desc"; PageHelper.startPage(pageNum, pageSize, orderBy);

2.只统计总数,不查数据

// 有时我们只需要知道总数 PageHelper.startPage(1, 0); // pageSize=0 表示只查count List<User> users = userMapper.selectAll(); long total = ((Page<?>) users).getTotal(); // users是空列表,但total是总数

3.Mapper接口参数分页

// Service层 public PageInfo<User> getUsersByParam(int pageNum, int pageSize, String name) { // 通过方法参数传递分页参数 return PageHelper.startPage(pageNum, pageSize) .doSelectPageInfo(() -> userMapper.selectByName(name)); } //或者 public PageInfo<User> getUsersByParam(int pageNum, int pageSize, String name) { return PageHelper.startPage(pageNum, pageSize) .setOrderBy("id desc") .doSelectPageInfo(() -> { // 这里可以写复杂查询逻辑 return userMapper.selectByName(name); }); }

4.多表关联查询分页

// 在Mapper.xml中正常写多表查询 <select id="selectUserWithOrders" resultMap="userWithOrdersMap"> SELECT u.*, o.order_no, o.amount FROM user u LEFT JOIN orders o ON u.id = o.user_id WHERE u.status = 1 ORDER BY u.create_time DESC </select>
// Service中 public PageInfo<User> getUsersWithOrders(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); List<User> users = userMapper.selectUserWithOrders(); return new PageInfo<>(users); }

六、配置详解

# application.yml pagehelper: # 数据库方言 helper-dialect: mysql # 分页合理化 reasonable: true # 支持通过Mapper接口参数传递分页参数 support-methods-arguments: true # 分页参数映射 params: count=countSql # 默认值为 false,该参数对使用 RowBounds 作为分页参数时有效 offset-as-page-num: true # 默认值为 false,RowBounds是否进行count查询 row-bounds-with-count: true # 默认值为 false,当设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果 page-size-zero: false # 默认值为 false,分页标签<t>参数处理 return-page-info: true # 分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值 # 查出对应的字段进行查询 params: count=countSql # 支持通过Mapper接口参数传递分页参数,默认值false support-methods-arguments: false

ok啊,感谢大家的阅读,到这里大家应该已经会用PageHelper了。如果有问题,请多多指正,谢谢大家,无限进步,共同成长。

http://www.jsqmd.com/news/604516/

相关文章:

  • 跨越平台鸿沟:在非ROS环境中通过Rosbridge与ROS 2 Humble高效通信
  • 超高效!这款音视频转文字神器,让你告别手动输入!
  • 【工业级Python内存治理白皮书】:覆盖CPython 3.8–3.12的7层内存管控架构,含可落地的监控-预警-自愈SOP手册
  • AI显微镜-Swin2SR惊艳效果展示:JPG噪点去除+边缘重构真实案例
  • 3步解锁视频自由:B站m4s缓存转MP4全攻略
  • 国际靠谱温变变色纱线公司哪家强? - 企业推荐官【官方】
  • STM32驱动AW9523B IO扩展芯片:从寄存器映射到多设备管理实战
  • 解锁Windows 10的Android生态:3大革新功能让跨设备体验无缝融合
  • AssetStudio终极指南:从Unity游戏中提取3D模型、纹理和音频资源的完整教程
  • 【仅限前500名开放】自动驾驶C++算法性能审计清单(含17项ASAM OpenSCENARIO兼容性检测项+Clang-Tidy定制规则集)
  • 家长必看!专业自闭症康复机构大揭秘 - 品牌测评鉴赏家
  • Dockerfile从零入门:手把手教你打包Node.js应用,解决镜像构建的常见坑
  • CVPR2022逆向蒸馏(Reverse Distillation)源码解读与复现:从One-Class Embedding到异常图生成
  • 夜光荧光发光纱线源头厂家直供 高亮持久价优打造吸睛爆款 - 企业推荐官【官方】
  • 基于Vue的社区医疗公益服务系统[vue]-计算机毕业设计源码+LW文档
  • 如何快速解决Hackintosh配置难题:OpCore-Simplify终极解决方案指南
  • Docker镜像推送到私有仓库完整指南:从命名规范到AWS ECR实战
  • AI辅助开发:借助快马多模型能力打造智能静电地板施工方案设计器
  • 自闭症机构大揭秘:如何为孩子找到最佳选择? - 品牌测评鉴赏家
  • 2026实测|5款AI自动生成PPT工具推荐,小白也能10分钟出专业稿 - 品牌测评鉴赏家
  • 国内专业温变纱线生产厂家该选哪家 - 企业推荐官【官方】
  • 科研人效率工具:如何用CiteSpace 6.3.R1快速梳理文献,找到你的论文创新点?
  • STM32F103C8T6 Bootloader跳转APP触发HardFault:中断管理不当的排查与修复
  • MBTI职业性格测试
  • 54.替换数字(字符串/双指针法)
  • 量子门矩阵运算慢如蜗牛,如何用现代C++20 constexpr+模板元编程将单核QVM仿真提速19.3倍?
  • 026 实测|5 款 AI 生成 PPT 工具推荐,新手也能 10 分钟搞定专业汇报 - 品牌测评鉴赏家
  • NaViL-9B效果展示:复杂背景图中多目标识别+关系推理能力演示
  • 2026年SCI论文AI率超标怎么办?3步从60%降到期刊要求以内
  • 2026实测|3款AI生成PPT工具横评,告别熬夜改稿,新手也能直接冲 - 品牌测评鉴赏家