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

PageHelper 解析及实现原理

PageHelper 解析及实现原理
  • 一、PageHelper介绍
  • 二、PageHelper代码实现
    • 1.导入插件
    • 2.业务代码
  • 三、PageHelper实现原理

一、PageHelper介绍

面向关系型数据库的 SQL 查询和数据导出时,如果数据条数非常大,直接将所有数据一次性查出或者导出显然是不可行的。这时候就需要进行分页查询或分页导出,将查询或导出的数据按照指定大小分页加载或写入,从而提高查询或导出的效率。而分页查询或分页导出的实现过程比较繁琐,需要考虑很多细节问题,容易出错。因此,出现了一些支持分页查询或分页导出的插件或工具类,例如 MyBatis-Plus 的分页插件 PageHelper。
PageHelper是Mybatis-Plus中的一个插件,主要用于实现数据库的分页查询功能。其核心原理是将传入的页码和条数赋值给一个Page对象,并保存到本地线程ThreadLocal中。接下来,PageHelper会进入Mybatis的拦截器环节,在拦截器中获取并处理刚才保存在ThreadLocal中的分页参数。这些分页参数会与原本的SQL语句和内部已经定义好的SQL进行拼接,从而完成带有分页处理的SQL语句的构建。

二、PageHelper代码实现

1.导入插件

pom.xml中导入依赖

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

在springboot配置文件(application.yml)中声明插件

#pagehelper分页插件配置 pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql

2.业务代码

举例说明:有一个员工表,里面有数据若干,将员工数据全部查询并分页显示
Controller层代码(此处返回的是一个封装好的Result和PageResult类后续给出源码)

@GetMapping("/page") @ApiOperation("员工分页查询") public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO){ log.info("员工分页查询,参数为{}",employeePageQueryDTO); PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO); return Result.success(pageResult); }

ServiceImpl:employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize()分别是,要查询第几页、每页有几条数据

@Override public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) { //分页查询使用pagehelper插件,pom引入 //开始分页查询 PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize()); Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO); long total = page.getTotal(); List<Employee> records = page.getResult(); return new PageResult(total,records); }

Mapper层:

<select id="pageQuery" resultType="com.sky.entity.Employee"> select * from employee <where> <if test="name != null and name != ''"> and name like concat('%',#{name},'%') </if> </where> order by create_time asc </select>

辅助理解的代码 Result类和PageResult类

public class PageResult implements Serializable { private long total; //总记录数 private List records; //当前页数据集合 } @Data public class Result<T> implements Serializable { private Integer code; //编码:1成功,0和其它数字为失败 private String msg; //错误信息 private T data; //数据 public static <T> Result<T> success() { Result<T> result = new Result<T>(); result.code = 1; return result; } public static <T> Result<T> success(T object) { Result<T> result = new Result<T>(); result.data = object; result.code = 1; return result; } public static <T> Result<T> error(String msg) { Result result = new Result(); result.msg = msg; result.code = 0; return result; } }

三、PageHelper实现原理

核心原理是将传入的页码和条数赋值给一个Page对象,并保存到本地线程ThreadLocal中。接下来,PageHelper会进入Mybatis的拦截器环节,在拦截器中获取并处理刚才保存在ThreadLocal中的分页参数。这些分页参数会与原本的SQL语句和内部已经定义好的SQL进行拼接,从而完成带有分页处理的SQL语句的构建。


如有问题,欢迎联系博主

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

相关文章:

  • 对比VBA学习Python,让办公更自动化!
  • 很多人卡在这一步:OpenClaw不会安装?这个一键版解决了
  • 【Linux】进程 PCB、task_struct、fork初识
  • 基于二进制的遗传算法的考虑排放目标和输电损耗的经济调度研究(Python代码实现)
  • 扫地机机器人研发岗深度解析与技术指南
  • 140个企业级实战场景剖析以及AI大模型项目实战
  • 函数式编程思想
  • 2026钻床市场热门:这些工厂钻床受追捧,目前优质的钻床品牌技术引领与行业解决方案解析 - 品牌推荐师
  • 汇源全屋定制作为全屋定制专业制造商,价格大概多少钱? - 工业推荐榜
  • 基于改进粒子群算法的含碳捕集微网多时间尺度低碳经济调度(Matlab代码实现)
  • Flutter 三方库 system_resources_2 的鸿蒙化适配指南 - 实时监控鸿蒙端侧 CPU 负载、内存占用与系统资源动态感知
  • 星焰家居这个不锈钢全屋定制厂商品牌靠不靠谱,值得推荐吗? - myqiye
  • 2026年热门的CNC 精密压铸加工公司推荐:医疗设备精密压铸加工/智能家居精密压铸加工采购指南厂家怎么选 - 行业平台推荐
  • # 发散创新:WebHID 在浏览器端实现外设通信的全新实践 在现代Web 开
  • 2026年评价高的储能弹簧工厂推荐:耐腐蚀弹簧/小家电电磁阀弹簧/高压直流继电器弹簧精选厂家推荐 - 行业平台推荐
  • Python开发英语记忆单词软件 - 优化
  • FFMpeg + WebSocket + JSMpeg 搭建低延迟视频系统(总览篇)
  • 2026年01月深圳CE:加速寿命试验/合规类/国内外认证/机构类/测试服务/温度老化试验/电子电气检测/腐蚀试验/选择指南 - 优质品牌商家
  • 2026国内小白纹绣培训重实操机构推荐榜:野生眉学校、零基础学纹眉、零基础小白、零基础纹眉学校、零结痂雾眉、韩式定妆学校选择指南 - 优质品牌商家
  • PAT 乙级 1078
  • 谁懂啊!OpenClaw(小龙虾)爆火不是没道理
  • Python基于flask的博客系统设计与实现
  • 总结AI蓝牙音箱生产厂,国内靠谱厂家Top10有哪些? - 工业品网
  • Flutter 三方库 shelf_cors_headers 的鸿蒙化适配指南 - 实现具备跨域安全访问策略的服务端拦截器、支持端侧微服务网关与分布式请求治理实战
  • 聊聊扬州月子中心按需定制,哪家品牌靠谱又有高性价比? - 工业设备
  • win11下解决eNSP AR启动40/41错误解决方案
  • Flutter 三方库 health_connector_core 的鸿蒙化适配指南 - 实现具备跨平台标准的数据采集与同步架构、支持端侧健康指标建模与设备总线协同实战
  • 牛客练习001:反转链表
  • 基于Matlab 2017a的单相交交变频电路仿真研究:阻感负载下的傅立叶分析与原理讲解
  • python flask django教师教学计划系统 计算机科学拔尖学生培养基地