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

从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); ListUser 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 groupIdcom.github.pagehelper/groupId artifactIdpagehelper-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: countcountSql # 增加count查询步骤3最简单的使用Service public class UserService { Autowired private UserMapper userMapper; public PageInfoUser getUsers(int pageNum, int pageSize) { // 1. 设置分页参数就像告诉小助手我要第2页每页10条 PageHelper.startPage(pageNum, pageSize); // 2. 紧接着执行查询一定要紧跟 ListUser userList userMapper.selectAll(); // 3. 用PageInfo包装结果 return new PageInfo(userList); } }总结一下1.设置分页参数 2.执行查询3.用PageInfo包装结果// PageHelper流程化的三行代码 PageHelper.startPage(pageNum页码, pageSize每页条数); // 设置 ListT list xxxMapper.selectXxx(); // 查询 PageInfoT 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); // 执行查询 ListUser users userService.getAllUsers(); // 用PageInfo包装结果 PageInfoUser pageInfo new PageInfo(users); return Result.success(pageInfo); } }2.复杂查询分页Service public class OrderService { public PageInfoOrder searchOrders(OrderQuery query, int pageNum, int pageSize) { // 设置分页参数 PageHelper.startPage(pageNum, pageSize); // 执行带条件的查询 ListOrder 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 的完整信息//写下这一句的时候就封装了这些信息 PageInfoUser 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); ListUser users userMapper.selectAll(); // 多个排序字段 String orderBy age asc, create_time desc; PageHelper.startPage(pageNum, pageSize, orderBy);2.只统计总数不查数据// 有时我们只需要知道总数 PageHelper.startPage(1, 0); // pageSize0 表示只查count ListUser users userMapper.selectAll(); long total ((Page?) users).getTotal(); // users是空列表但total是总数3.Mapper接口参数分页// Service层 public PageInfoUser getUsersByParam(int pageNum, int pageSize, String name) { // 通过方法参数传递分页参数 return PageHelper.startPage(pageNum, pageSize) .doSelectPageInfo(() - userMapper.selectByName(name)); } //或者 public PageInfoUser getUsersByParam(int pageNum, int pageSize, String name) { return PageHelper.startPage(pageNum, pageSize) .setOrderBy(id desc) .doSelectPageInfo(() - { // 这里可以写复杂查询逻辑 return userMapper.selectByName(name); }); }4.多表关联查询分页// 在Mapper.xml中正常写多表查询 select idselectUserWithOrders resultMapuserWithOrdersMap 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 PageInfoUser getUsersWithOrders(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); ListUser users userMapper.selectUserWithOrders(); return new PageInfo(users); }六、配置详解# application.yml pagehelper: # 数据库方言 helper-dialect: mysql # 分页合理化 reasonable: true # 支持通过Mapper接口参数传递分页参数 support-methods-arguments: true # 分页参数映射 params: countcountSql # 默认值为 false该参数对使用 RowBounds 作为分页参数时有效 offset-as-page-num: true # 默认值为 falseRowBounds是否进行count查询 row-bounds-with-count: true # 默认值为 false当设置为 true 时如果 pageSize0 或者 RowBounds.limit 0 就会查询出全部的结果 page-size-zero: false # 默认值为 false分页标签t参数处理 return-page-info: true # 分页插件会从查询方法的参数值中自动根据上面 params 配置的字段中取值 # 查出对应的字段进行查询 params: countcountSql # 支持通过Mapper接口参数传递分页参数默认值false support-methods-arguments: falseok啊感谢大家的阅读到这里大家应该已经会用PageHelper了。如果有问题请多多指正谢谢大家无限进步共同成长。

相关文章:

从0到1学会使用PageHelper

本文的思维导图为什么我们需要PageHelper?想象一下,你经营着一家餐厅,有顾客要点菜了,就比如:“鱼香肉丝”,你要把菜端给顾客。这时候,你要怎么把菜给顾客呢(如何把数据展示给前端)?你有三个解…...

iOS / SwiftUI 输入法(键盘)布局处理总结(AI版)

文章目录📘 iOS / SwiftUI 输入法(键盘)处理总结一、问题背景二、输入框切换闪烁问题❌ 错误原因解决办法键盘动画(类似 Android Insets)uikitswiftUI📘 iOS / SwiftUI 输入法(键盘)…...

解锁Windows 10的Android生态:3大革新功能让跨设备体验无缝融合

解锁Windows 10的Android生态:3大革新功能让跨设备体验无缝融合 【免费下载链接】WSA-Windows-10 This is a backport of Windows Subsystem for Android to Windows 10. 项目地址: https://gitcode.com/gh_mirrors/ws/WSA-Windows-10 副标题:WS…...

直播录制从未如此简单:StreamCap 40+平台自动录制全攻略

直播录制从未如此简单:StreamCap 40平台自动录制全攻略 【免费下载链接】StreamCap Multi-Platform Live Stream Automatic Recording Tool | 多平台直播流自动录制客户端 基于FFmpeg 支持监控/定时/转码 项目地址: https://gitcode.com/gh_mirrors/st/StreamCa…...

IDEA中使用Claude Code

1、先安装好node.js 安装好之后验证是否安装成功 nodejs下载安装地址https://nodejs.p2hp.com/安装结束后,执行以下命令查看安装结果,若显示版本号则安装成功。 node --version 2、使用npm安装Claude Code ​​​​​​​npm install -g anthropic-ai…...

农旅电商运营必备:初级认证考试中的5大高频考点与避坑指南

农旅电商运营必备:初级认证考试中的5大高频考点与避坑指南 农旅电商作为乡村振兴战略下的新兴业态,正在经历从粗放式增长到精细化运营的关键转型期。对于准备参加初级认证考试的从业者而言,系统掌握核心运营逻辑远比死记硬背更重要。根据近三…...

正点原子lwIP实战解析——PHY芯片LAN8720A与YT8512C的配置与应用

1. 认识PHY芯片:网络通信的"翻译官" 当你用网线连接开发板时,数据究竟是如何从物理信号变成单片机可处理的数字信号的?这个关键角色就是PHY芯片。简单来说,PHY就像个精通多国语言的翻译官——它把网线里的模拟信号&…...

超高效!这款音视频转文字神器,让你告别手动输入!

今天给大家推荐一款非常实用的软件——“Whisper”,它是一款功能强大的音视频转文字工具。这款软件是绿色版,双击打开后,会弹出一个黑色的界面框,请不要关闭它。使用这款软件非常简单。首先,点击【选择文件】按钮&…...

科技企业如何借助智能工具加快技术研发与市场推广?

观点作者:科易网-国家科技成果转化(厦门)示范基地现状概述:科技成果转化与市场推广的双重困境 在数智时代,技术转移与成果转化正经历深刻变革。一方面,海量数据成为创新的核心要素,但传统科技企…...

Dify开发AI智能体的费用

Dify 的计费逻辑与 Coze 有显著不同,它最大的特点是“开源免费”与“云端订阅”并存。由于它不强制绑定大模型,你的总支出通常由“平台费 模型流量费”两部分组成。以下是截至 2026 年 4 月的详细费用拆解:1. 部署模式决定基础费用开源社区版…...

模力方舟:国内AI开发者的全流程加速平台

模力方舟:国内AI开发者的全流程加速平台 在AI技术快速发展的当下,如何让开发者更高效地将创意转化为实际应用成为行业关键命题。由Gitee推出的模力方舟(MoArk)平台,通过整合模型体验、微调训练、推理部署到应用变现的全流程能力,为…...

小电脑4种主流连接方案全解:直连屏/采集卡/网卡网线/NoMachine

在使用嵌入式开发板、迷你主机、机器人机载小电脑等设备时,如何高效连接、显示画面、远程控制是入门第一步。很多同学容易混淆“直连网线、网卡、采集卡、远程桌面”的区别,本文一次性讲清楚四种常用连接方式,包含用途、所需硬件、详细操作、…...

基于51单片机的太阳能追光系统设计与仿真:包含光敏控制、电机调速及两种模式的太阳跟踪系统

基于51单片机的太阳能追光系统设计,太阳跟踪系统设计,光敏控制系统protues仿真设计。 有仿真,程序,AD图,原文,相关资料。 本系统可以通过光敏电阻调节电机转速,有手动模式和我自动模式。 适用于…...

为什么你的STM32 DMA传输失败了?__HAL_LINKDMA宏的隐藏陷阱与解决方案

为什么你的STM32 DMA传输失败了?__HAL_LINKDMA宏的隐藏陷阱与解决方案 在STM32开发中,DMA(直接内存访问)传输是提升外设数据吞吐效率的关键技术。然而,许多开发者在实际项目中都会遇到DMA传输失败的问题,而…...

k8s与docker compose的思考

1.稍微复杂2.ip会漂移,各种端口转发性能有所损失。3.占用一定的资源4.master需要高可用5.更适合web无状态docker-compose则比较简单,搭建本地环境就一个配置文件的事情,简直是本地test环境神器。...

为什么又来学习C语言?

我是一名来自民办二本院校的大三学生,早在大一上时学校就安排了C语言的课程,但是当时我很是浮躁,心不在学习,甚至想着回去复读,所以并没有吸纳多少C语言的知识。现在大三,有了考研想法,想重拾C语…...

课堂笔记4月2日

1、计算机核心资源 CPU: 计算(lscpu)内存: 缓存数据(掉电丢失)硬盘: 持久化存储数据网络: 传播数据 2、查看 CPU 信息# 查看CPU[rootC001 ~]# lscpu Architecture: x86_64 CPU op-mod…...

杨氏矩阵找第N大(小)的O(N)线性算法 LeetCode 378. Kth Smallest Element in a Sorted Matrix 373. Find K Pairs 钓鱼问题

杨氏矩阵&#xff1a;一个N*N的矩阵&#xff0c;它的每行每列都单调递增(或者宽松一些,单调不减)&#xff0c;即a[i][j]<a[i1][j], a[i][j]<a[i][j1]。遇到的两道面试题&#xff1a; 1. 输出杨氏矩阵中最小的N个数。 2. 两个升序数组A和B&#xff0c;长度都是N。从两个数…...

我用AI替换了高级工程师,结果...

周二下午 2:47&#xff0c;我们的 CFO 在 Slack 上发了一条消息。 “你团队的年薪是 120 万美元。我们能谈谈优化吗&#xff1f;” 我知道要发生什么了。我们刚刚完成了 A 轮融资。风投想要"运营效率"。翻译&#xff1a;削减成本、更快交付、展示增长。 我们的高级…...

【等保合集】800余份等保三级、等保2.0、等保二级、等保测评作业指导、全套信息安全管理体系文件、标准规范方案报告合集(PPT+WORD+PDF)

等保2.0以GB/T 22239-2019为核心&#xff0c;二级&#xff08;指导保护级&#xff09;与三级&#xff08;监督保护级&#xff09;在身份认证、数据加密、备份恢复及管理制度上差异显著。测评作业指导书依据GB/T 28448编制&#xff0c;覆盖十大安全类&#xff1b;信息安全管理体…...

MBTI职业性格测试

...

【GIS操作指南】ArcMap界面坐标单位一键切换:从平面到经纬度的实战设置

1. 为什么需要切换坐标单位&#xff1f; 刚接触ArcMap的朋友可能会发现&#xff0c;软件右下角默认显示的坐标单位往往是米或千米这类平面单位。但在处理带有地理坐标的数据时&#xff0c;比如气象数据、GPS轨迹或者行政区划边界&#xff0c;我们更习惯使用经纬度来定位。这就好…...

手把手教你为RK3568(arm64)交叉编译BlueZ:利用Buildroot已有环境快速出包

手把手教你为RK3568&#xff08;arm64&#xff09;交叉编译BlueZ&#xff1a;利用Buildroot已有环境快速出包 在嵌入式Linux开发中&#xff0c;蓝牙协议栈BlueZ的交叉编译一直是让开发者头疼的问题。特别是当目标平台采用arm64架构时&#xff0c;依赖库的复杂性和工具链的配置难…...

从零搭建PX4无人机仿真环境:Gazebo场景构建与Offboard模式初探

1. 环境准备&#xff1a;从零搭建PX4开发基础 第一次接触PX4无人机开发的朋友&#xff0c;往往会被复杂的工具链吓到。其实只要跟着正确的步骤走&#xff0c;半小时内就能搭建好完整的仿真环境。我用的是一台装好Ubuntu 20.04的笔记本&#xff0c;建议至少预留30GB磁盘空间。 关…...

海康工业相机——Python二次开发实战:构建实时条形码识别系统

1. 环境准备与硬件选型 第一次接触海康工业相机时&#xff0c;我被它金属外壳下的精密光学元件震撼到了。这种工业级设备和我们平时用的消费级摄像头完全不同&#xff0c;它的稳定性、帧率和图像质量完全是为生产线环境设计的。如果你手头正好有台海康相机&#xff0c;跟着我的…...

别再只盯着输入了!时间序列预测中,被忽视的‘标签自相关’问题与FreDF解法

时间序列预测的盲区&#xff1a;标签自相关性如何悄悄破坏你的模型精度 想象一下&#xff0c;你花费数周时间调整模型架构、优化超参数&#xff0c;甚至尝试了最新的Transformer变体&#xff0c;但预测结果始终差强人意。问题可能并不出在你精心设计的输入特征工程上&#xff0…...

ESP32定时器深度解析:从基础API到低功耗场景实战

1. ESP32定时器基础入门 第一次接触ESP32的硬件定时器时&#xff0c;我被它强大的功能和灵活的配置选项深深吸引。相比常见的软件定时器&#xff0c;ESP32的硬件定时器能提供微秒级精度和64位计时范围&#xff0c;这在物联网设备开发中简直是神器。 举个生活中的例子&#xff0…...

Pyinstaller:打包Python文件成exe可执行文件

1、pyinstaller安装pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple2、打包单个文件如果所有代码是写在一个.py文件里的&#xff0c;可以尝试使用这种方式pyinstaller -F filesname.py成功运行后会在桌面生成三个文件&#xff1a;可执行文件.exe就在dist…...

从CH341驱动入手,彻底搞懂Linux USB转串口驱动的三层架构(Serial/TTY/USB)

从CH341驱动剖析Linux USB转串口的三层架构设计 在嵌入式开发和工业控制领域&#xff0c;USB转串口设备扮演着关键角色。当我们为一块开发板编写底层驱动&#xff0c;或是调试一个突然"失联"的串口设备时&#xff0c;真正考验开发者功力的不是简单的驱动加载&#xf…...

佛山高铁隧道灯生产厂家选型实操攻略,4步规避采购风险

高铁隧道工程中&#xff0c;灯具选型直接影响工程质量与后期运维成本&#xff0c;佛山作为照明产业带&#xff0c;高铁隧道灯生产厂家数量众多&#xff0c;如何科学筛选成为工程采购的关键。本文结合实操经验&#xff0c;整理详细选型步骤&#xff0c;助力采购避坑。首先跟大家…...