MyBatis分页:PageHelper

MyBatis分页:PageHelper

📖 前言:为什么需要分页?

在处理大量数据时,一次性从数据库查询并返回所有结果是不可行的,这会带来巨大的性能和内存开销。分页是解决这一问题的标准方案。而PageHelper是一个极其流行的MyBatis物理分页插件,它能以“非侵入式”的方式,让我们无需在SQL中编写LIMIT子句,即可轻松实现分页。

🎯 什么是PageHelper?

PageHelper是一个MyBatis插件,它通过AOP拦截即将执行的SQL查询。当你发起一个分页请求时,它会自动为你追加对应数据库方言的分页语句(如MySQL的LIMIT),从而实现物理分页。其最大的优点是你只需编写最纯粹的业务查询SQL,将分页逻辑与业务逻辑完全解耦。

🔧 Spring Boot集成

1. 添加依赖

pom.xml中引入官方的starter依赖:

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>2.1.0</version> </dependency>
2. 关于配置 (application.yml )

在很多情况下,由于starter强大的自动检测能力(例如,它可以根据JDBC URL自动识别数据库类型),PageHelper可以零配置工作,但强烈建议进行显式配置

为什么推荐配置?

  • 稳定性:明确指定helper-dialect可以避免因JDBC URL不规范导致的方言识别失败。
  • 功能开启:可以方便地开启reasonable(分页参数合理化)等高级功能。
  • 清晰性:配置即文档,让项目配置一目了然。

推荐配置 (application.yml)

pagehelper:helper-dialect: mysql         # 明确指定数据库方言reasonable: true              # 开启分页参数合理化

🚀 核心用法:两种主流风格 (Page vs PageInfo)

PageHelper的核心魅力在于其简洁的调用方式。主要有两种风格,一种是使用PageInfo全家桶,另一种是像您展示的那样,使用Page对象手动封装。

1:使用 PageInfo (便捷的一站式方案)

这是官方最推荐的用法,它将所有分页信息封装在一个PageInfo对象中,非常方便。

流程:

  1. PageHelper.startPage(pageNum, pageSize);
  2. List<T> list = yourMapper.select(...);
  3. PageInfo<T> pageInfo = new PageInfo<>(list);
  4. pageInfo对象返回给前端。
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic PageInfo<User> findUsersByPage(int pageNum, int pageSize) {// 1. 开启分页PageHelper.startPage(pageNum, pageSize);// 2. 执行查询 (这是一个普通的、不带分页的查询)List<User> userList = userMapper.findAll();// 3. 将查询结果封装到PageInfo对象中PageInfo<User> pageInfo = new PageInfo<>(userList);return pageInfo;}
}
核心属性与方法

PageInfo是PageHelper返回的核心对象,它包含了丰富的分页信息,可以直接序列化为JSON返回给前端。

属性类型说明
pageNumint当前页码
pageSizeint每页数量
sizeint当前页的数量
totallong总记录数
pagesint总页数
listList<T>当前页的数据列表
prePageint上一页页码
nextPageint下一页页码
isFirstPageboolean是否为第一页
isLastPageboolean是否为最后一页
hasPreviousPageboolean是否有上一页
hasNextPageboolean是否有下一页

优点PageInfo对象包含了总页数、总条数、是否有上一页/下一页等所有前端分页组件需要的信息,一步到位。

2:强转为 Page<T>

这种方式同样非常流行,它提供了更高的自定义灵活性。

工作原理:当PageHelper.startPage()被调用后,PageHelper会确保紧跟其后的MyBatis查询返回的List对象,其实际类型是com.github.pagehelper.PagePage类继承自ArrayList,但额外包含了分页信息(如总条数total)。

// 1. 开启分页
PageHelper.startPage(1, 10);// 2. mapper.list() 表面上返回的是 List<Emp>,
//    但其在运行时的真实类型是 Page<Emp>
List<Emp> empList = empMapper.list();// 3. 因此,可以安全地进行强制类型转换
Page<Emp> page = (Page<Emp>) empList;
使用场景

Page<T> 主要用于需要高度自定义返回格式的场景。开发者通过将其强转后,可以精确地提取出 totallist 数据,然后封装进自己项目规定的 PageBeanResultVO 等DTO(数据传输对象)中,完全掌控API的响应结构。

优点:返回给前端的JSON结构完全由您自己定义,可以做到最精简,不受PageInfo固定结构的限制。

核心属性与方法

Page<T> 对象提供了获取分页所需的最基本、最核心的数据:

方法名返回类型说明
getTotal()long获取总记录数
getResult()List<T>获取当前页的数据列表 (等同于对象本身)
getPages()int获取总页数
getPageNum()int获取当前页码
getPageSize()int获取每页显示数量
getStartRow()long获取当前页的起始行号 (从1开始)
getEndRow()long获取当前页的结束行号

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/100464.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/100464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gin框架:构建高性能Go Web应用

Gin框架&#xff1a;构建高性能Go Web应用 Gin是Go语言中最受欢迎的Web框架之一&#xff0c;以其高性能、简洁API和丰富的中间件支持而闻名。本文将带你从零开始&#xff0c;逐步掌握Gin框架的核心概念和高级特性&#xff0c;并通过实际代码示例演示如何构建高效的Web应用程序。…

IO进程——线程、IO模型

一、线程Thread1、引入1.1 概念相当于是一个轻量级的进程&#xff0c;为了提高系统的性能引入线程&#xff0c;在同一进程中可以创建多个线程&#xff0c;共享进程资源1.2 进程和线程比较相同点&#xff1a;都为操作系统提供了并发执行的能力不同点&#xff1a;调度和资源&…

人工智能概念:NLP任务的评估指标(BLEU、ROUGE、PPL、BERTScore、RAGAS)

文章目录一、评估指标基础1. 准确率&#xff08;Accuracy&#xff09;2. 精确率&#xff08;Precision&#xff09;3. 召回率&#xff08;Recall&#xff09;4. F1-Score5. 示例二、文本生成专用指标1. BLEU&#xff1a;机器翻译与标准化文案的“质量标尺”1.1 计算流程&#x…

团队对 DevOps 理解不统一会带来哪些问题

团队对DevOps理念与实践的理解不统一、片面甚至扭曲&#xff0c;是导致众多企业DevOps转型失败的根本原因&#xff0c;它将直接引发一系列深层次的、相互关联的严重问题。核心体现在&#xff1a;转型极易沦为“为了工具而工具”的盲目自动化&#xff0c;导致最核心的文化变革被…

企业级实战:构建基于Qt、C++与YOLOv8的模块化工业视觉检测系统(基于QWidget)

目录一、概述二、项目目标与技术架构2.1 核心目标2.2 技术选型2.3 软件架构三、AI推理DLL的开发 (Visual Studio 2019)3.1 定义DLL接口 (DetectorAPI.h)3.2 实现核心功能 (DetectorAPI.cpp)四、Qt Widget GUI应用程序的开发4.1 项目配置 (.pro 文件)4.2 UI设计 (mainwindow.ui)…

SVN自动化部署工具 脚本

SVN自动化部署工具 功能概述 这是一个自动化部署SVN仓库的bash脚本&#xff0c;主要功能包括&#xff1a; 自动安装SVN服务&#xff08;如未安装&#xff09; 创建SVN项目仓库 配置多用户权限 设置自动同步到网站目录 提供初始检出功能 下载地址 https://url07.ctfile…

Facebook主页变现功能被封?跨境玩家该如何申诉和预防

不少跨境玩家在运营Facebook公共主页时&#xff0c;最期待的就是通过变现工具获得稳定收入。但现实中&#xff0c;经常会遇到一个扎心的问题&#xff1a;主页好不容易做起来&#xff0c;却突然收到提示——“你的变现功能已被停用”。这意味着收入中断&#xff0c;甚至可能导致…

安装es、kibana、logstash

下载 elk 下载地址 elasticsearch地址: https://www.elastic.co/cn/downloads/elasticsearch kibana地址: https://www.elastic.co/cn/downloads/kibana logstash地址: https://www.elastic.co/cn/downloads/logstash 解压elk 创建es全家桶文件夹 cd /usr/local mkdir elk …

Django admin 后台开发案例【字段/图片】

这是一个简单的django admin 管理后台,这个应用案例主要是给运营人员进行填写数据 主要功能包括: 上传图片功能【选择上传时可以预览】【替换已有数据中的图片时可以预览新旧图片】 每条数据都将会记录操作历史。记录操作人是谁?修改内容是什么?并且定位责任到某一员。 …

【C++】const和static的用法

目录&#x1f680;前言&#x1f4bb;const&#xff1a;“只读”的守护者&#x1f4af;修饰普通变量&#x1f4af;修饰指针&#x1f4af;修饰函数&#x1f4af;修饰类成员&#x1f4af;修饰对象&#x1f31f;static&#xff1a;“静态存储”与“作用域控制”&#x1f4af;修饰全…

F019 vue+flask海外购商品推荐可视化分析系统一带一路【三种推荐算法】

文章结尾部分有CSDN官方提供的学长 联系方式名片 B站up&#xff1a; 麦麦大数据 关注B站&#xff0c;有好处&#xff01; 编号: F019 关键词&#xff1a;海外购 推荐系统 一带一路 python 视频 VueFlask 海外购电商大数据推荐系统源码 &#xff08;三种推荐算法 全新界面布局…

【大数据专栏】流式处理框架-Apache Fink

Apache Fink 1 前言 1.1 功能 1.2 用户 国际 国内 1.3 特点 ◆ 结合Java、Scala两种语言 ◆ 从基础到实战 ◆ 系统学习Flink的核心知识 ◆ 快速完成从入门到上手企业开发的能力提升 1.4 安排 ◆ 初识Flink ◆ 编程模型及核心概念 ◆ DataSet API编程 ◆ Data…

向内核社区提交补丁

一、背景 内核的版本一直以来一直在持续迭代&#xff0c;离不开众多开发者的贡献。有时候我们会根据项目要求基于现有的内核版本开发一些新的功能或者修复掉一些特定场下的问题&#xff0c;我们是可以将其提交给社区的。 一般提交社区有两个基本原则&#xff0c;一是提交的补…

TENGJUN-USB TYPE-C 24PIN测插双贴连接器(H14.3,4脚插板带柱):USB4.0高速传输时代的精密连接方案解析

在高速数据传输与多设备互联需求日益增长的当下&#xff0c;USB TYPE-C接口凭借其可逆插拔、高兼容性的优势成为主流&#xff0c;而TENGJUN推出的USB TYPE-C 24PIN测插双贴连接器&#xff08;规格&#xff1a;H14.3&#xff0c;4脚插板带柱&#xff09; &#xff0c;以对USB4.0…

企业级 Docker 应用:部署、仓库与安全加固

1 Docker简介及部署方法 1.1 Docker简介 Docker之父Solomon Hykes&#xff1a;Docker就好比传统的货运集装箱 Note 2008 年LXC(LinuX Contiainer)发布&#xff0c;但是没有行业标准&#xff0c;兼容性非常差 docker2013年首次发布&#xff0c;由Docker, Inc开发1.1.1 什么是do…

rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中

同一项目下多个可执行文件&#xff0c;多个子项目参照以下&#xff1a; 一、项目目录 项目/|-- client/|-- main.rs|-- Cargo.toml|-- server/|-- main.rs|-- Cargo.toml|-- Cargo.toml二、项目公共 Cargo.toml [workspace] # 定义Rust工作区配置 members …

mac本地安装mysql

本人环境 macOs 14.5 1.下载安装mysql https://dev.mysql.com/downloads/mysql/ 配置环境变量&#xff0c;打开terminal vim ~/.bash_profile 添加MYSQL_HOME/usr/local/mysql 在PATH中添加 通过mysql --version命令查看版本 2.开启mysql 打开终端teminal,输入命令 sudo…

面试前端遇到的问题

面试官让我写一个delay函数然后这是我写的代码async function delay(){setTimeout(function() {}, 3000); }面试官就和我说不是这个&#xff0c;用promise当时就蒙了&#xff0c;什么东西&#xff0c;为什么要用promise然后问豆包说Promise 是 JavaScript 中用于处理异步操作的…

Ubuntu Desktop 22.04.5 LTS 使用默认的 VNC 远程桌面

1. 打开 VNC 打开设置 - 分享 - 远程桌面2. 配置 VNC 打开远程桌面 启用vnc 选择vnc密码访问 配置密码3. 固定密码 远程桌面的访问密码在每次开机后会刷新一次&#xff0c;可以通过以下方式固定 打开【应用程序】&#xff0d;【附件】&#xff0d;密码和加密密钥&#xff08;或…

【无线安全实验4】基于伪随机数的WPS PIN码逆向(精灵尘埃/仙尘攻击)

文章目录1 原理分析1.1 WPS连接过程1.1.1 初始阶段1.1.2 注册阶段1.2 WPS攻击原理1.2.1 在线攻击1.2.2 离线攻击1.2.2.1 Ralink模式1.2.2.2 eCos模式2 实验过程3 参考资料在2011年 Stefan Viehbck 演示过WPS的在线暴力攻击&#xff0c;由于PIN码猜测最多只需11000种组合&#x…