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

PageHelper的使用及底层原理

业务系统在spring项目中引入 PageHelper 来实现分页方案,在实际使用过程中,发现在对 Mysql 数据库进行查询时,每条语句的末尾都自动拼接上了limit子句,且每次查询会先执行一次“select count(0)…”语句,与预期不符,因此想探究一下 PageHelper 的底层原理。

一、PageHelper的使用

PageHelper 是国内非常优秀的一款开源 mybatis 分页插件,它支持常用的主流数据库,例如 Oracle、Mysql、MariaDB、SQLite、Hsqldb 等。

PageHelper 的安装很简单,只需要在 pom.xml 中加入以下依赖即可:

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

PageHelper 的使用也非常简单,只需要在查询之前调 PageHelper.startPage() 方法即可开始分页。例如:

public PageInfo<BusinessPO> businessList(BusinessQuery businessQuery) {//开始分页PageHelper.startPage(pageNum, pageSize);//查询QueryWrapper<BusinessPO> queryWrapper = generateQuery(businessQuery);List<BusinessPO> businessPOS = businessMapper.selectList(queryWrapper);//封装分页对象PageInfoPageInfo<BusinessPO> pageInfo = new PageInfo<>(businessPOS);return pageInfo;}

其中,pageNum 表示要查询的页码pageSize 表示每页的记录数。调用 startPage 方法之后,PageHelper 会自动将下一次查询作为分页查询,并且会在查询之后返回一个 Page 对象,然后可以将这个对象转换为 PageInfo 对象,从而获得分页相关的信息。

二、PageHelper的底层原理

首先调用 PageHelper 的 startPage 方法开启分页,方法中会将分页参数存到一个变量 ThreadLocal LOCAL_PAGE中;

然后调用 mapper 进行查询,这里实际上会被 PageInterceptor 类拦截,执行其重写的 interceptor 方法,该方法中主要做了以下两件事:

获取到 MappedStatement,拿到业务写好的 sql,将 sql 改造成 select count(0) 并执行查询,并将执行结果存到 LOCAL_PAGE 里的Page 中的 total 属性,表示总条数
获取到 xml 中的 sql 语句,并 append 一些分页 sql 段,然后执行,将执行结果存到 LOCAL_PAGE 里的 Page 中的 list 属性,这里的Page 类实际是 ArrayList 的子类。
可以看出,结果是封装到了 Page 中,最后交由 PageInfo,从中可以获取到总条数、总页数等参数。


文章转载自:

http://Li8YgGQi.Lctrz.cn
http://cTyIVlEz.Lctrz.cn
http://FyCLBgPI.Lctrz.cn
http://6oO7co7j.Lctrz.cn
http://ZlSO9xH6.Lctrz.cn
http://b9Q6mkLb.Lctrz.cn
http://T3mgAwkI.Lctrz.cn
http://cLlhxAny.Lctrz.cn
http://EQuiZJ6p.Lctrz.cn
http://WPZMkDlT.Lctrz.cn
http://tAsrIiBS.Lctrz.cn
http://YaK1zWRA.Lctrz.cn
http://FIlrpvzx.Lctrz.cn
http://rFu83LcW.Lctrz.cn
http://owkbrYWm.Lctrz.cn
http://tW47CSc3.Lctrz.cn
http://1gAIWROS.Lctrz.cn
http://nU71fSYV.Lctrz.cn
http://x0z2l6Wc.Lctrz.cn
http://Q1TYLqRj.Lctrz.cn
http://N5tr4Ffq.Lctrz.cn
http://UyMjFfQG.Lctrz.cn
http://s3rAMoBL.Lctrz.cn
http://ObVriSPs.Lctrz.cn
http://jWLKwaLq.Lctrz.cn
http://uHtpVOya.Lctrz.cn
http://DIFkLV1y.Lctrz.cn
http://d83Ly46V.Lctrz.cn
http://JZY6fi9Y.Lctrz.cn
http://VTFgdp9J.Lctrz.cn
http://www.dtcms.com/a/369997.html

相关文章:

  • 探寻卓越:高级RAG技术、架构与实践深度解析
  • 【51单片机】【protues仿真】基于51单片机PM2.5空气质量检测系统
  • AI工具深度测评与选型指南 - 图像生成与编辑类
  • RabbitMQ工作模式(下)
  • Custom SRP - Complex Maps
  • tp报错解决
  • MySQL MHA 高可用集群搭建
  • 《AI大模型应知应会100篇》第68篇:移动应用中的大模型功能开发 —— 用 React Native 打造你的语音笔记摘要 App
  • Mac Intel 芯片 Docker 一键部署 Neo4j 最新版本教程
  • 正态分布 - 正态分布的经验法则(68-95-99.7 法则)
  • 【操作系统-Day 25】死锁 (Deadlock):揭秘多线程编程的“终极杀手”
  • (二).net面试(static)
  • 为什么服务器有主备BMC?
  • Dotnet 项目手动部署到AWS 和Github action CICD 流程总结
  • (2)桌面云、并行计算、分布式、网格计算
  • Java中的死锁
  • SQL 进阶指南:视图的创建与使用(视图语法 / 作用 / 权限控制)
  • SQL 实战指南:电商订单数据分析(订单 / 用户 / 商品表关联 + 统计需求)
  • 附050.Kubernetes Karmada Helm部署联邦及使用
  • 【PCIe EP 设备入门学习专栏 -- 8 PCIe EP 架构详细介绍】
  • STM32HAL 快速入门(十九):UART 编程(二)—— 中断方式实现收发及局限分析
  • 【星闪】Hi2821 | PWM脉宽调制模块 + 呼吸灯例程
  • 具身智能模拟器:解决机器人实机训练场景局限与成本问题的创新方案
  • 【嵌入式】【科普】AUTOSAR学习路径
  • 大麦APP抢票-核心
  • Linux笔记---TCP套接字编程
  • SQL面试题及详细答案150道(81-100) --- 子查询篇
  • CentOS系统停服,系统迁移Ubuntu LTS
  • 基于Spring Boot的幼儿园管理系统
  • 《sklearn机器学习——聚类性能指标》Fowlkes-Mallows 得分