PageHelp插件使用

news/2025/12/14 16:03:30/文章来源:https://www.cnblogs.com/binlicoder/p/19349079

PageHelp插件使用

一、PageHelper 是什么?

PageHelper 是 MyBatis 的一个开源分页插件,它通过拦截 MyBatis 执行的 SQL 语句,自动在原SQL上添加分页语句(如 MySQL 的 LIMIT),并同时查询总记录数。

核心特点:

  • 简单易用:只需要一行代码即可实现分页
  • 支持多种数据库:MySQL、Oracle、PostgreSQL、SQLServer 等
  • 零侵入:不需要修改原有Mapper和SQL语句
  • 功能丰富:支持多种分页方式、排序、Count查询优化等

二、为什么要用 PageHelper?

在没有分页插件时,我们需要手动写分页SQL:

sql

-- 传统方式需要写两条SQL
SELECT COUNT(*) FROM users WHERE age > 18;  -- 查询总数
SELECT * FROM users WHERE age > 18 LIMIT 0, 10;  -- 查询数据

PageHelper 的优势:

  1. 代码简洁:一行代码代替复杂的分页逻辑
  2. 维护方便:分页逻辑与业务逻辑分离
  3. 功能强大:自动处理总数统计、页码计算等
  4. 性能优化:支持多种 Count 查询优化策略

三、集成与配置

1. 添加依赖

Maven 项目:

xml

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

Gradle 项目:

gradle

implementation 'com.github.pagehelper:pagehelper-spring-boot-starter:1.4.2'

2. 配置文件(application.yml)

yaml

pagehelper:helper-dialect: mysql  # 数据库方言:mysql, oracle, postgresql 等reasonable: true       # 分页合理化:true时,pageNum<=0会查询第一页,pageNum>总页数会查询最后一页support-methods-arguments: true  # 支持通过Mapper接口参数来传递分页参数params: count=countSql  # 用于从Map或ServletRequest中参数名的映射page-size-zero: false   # 当pageSize=0时返回所有结果

四、核心使用方法

1. 基本分页查询

这是最常用的方式,在查询方法前调用 PageHelper.startPage()

java

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;/*** 分页查询用户列表*/public PageInfo<User> getUsersByPage(int pageNum, int pageSize) {// 关键代码:在查询方法前调用,第一个参数是页码,第二个是每页大小PageHelper.startPage(pageNum, pageSize);// 正常的查询,不需要任何修改List<User> userList = userMapper.selectAllUsers();// 用PageInfo对结果进行包装,PageInfo包含了丰富的分页信息PageInfo<User> pageInfo = new PageInfo<>(userList);return pageInfo;}
}

2. Mapper 接口和 XML

UserMapper.java:

java

@Mapper
public interface UserMapper {List<User> selectAllUsers();List<User> selectUsersByCondition(UserQuery query);
}

UserMapper.xml:

xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper"><!-- 正常的查询SQL,不需要任何分页语句 --><select id="selectAllUsers" resultType="User">SELECT id, name, age, email FROM users</select><select id="selectUsersByCondition" parameterType="UserQuery" resultType="User">SELECT id, name, age, email FROM usersWHERE 1=1<if test="name != null and name != ''">AND name LIKE CONCAT('%', #{name}, '%')</if><if test="minAge != null">AND age >= #{minAge}</if><if test="maxAge != null">AND age <= #{maxAge}</if></select>
</mapper>

3. 实体类

java

// 用户实体
@Data
public class User {private Long id;private String name;private Integer age;private String email;
}// 查询条件实体
@Data
public class UserQuery {private String name;private Integer minAge;private Integer maxAge;
}

五、PageInfo 对象详解

PageInfo 对象包含了完整的分页信息,非常适合返回给前端:

java

// 测试分页查询
@Test
public void testPageInfo() {PageHelper.startPage(2, 5); // 查询第2页,每页5条List<User> userList = userMapper.selectAllUsers();PageInfo<User> pageInfo = new PageInfo<>(userList);// 打印分页信息System.out.println("当前页: " + pageInfo.getPageNum());System.out.println("每页大小: " + pageInfo.getPageSize());System.out.println("当前页数据: " + pageInfo.getList());System.out.println("总记录数: " + pageInfo.getTotal());System.out.println("总页数: " + pageInfo.getPages());System.out.println("是否是第一页: " + pageInfo.isIsFirstPage());System.out.println("是否是最后一页: " + pageInfo.isIsLastPage());System.out.println("是否有上一页: " + pageInfo.isHasPreviousPage());System.out.println("是否有下一页: " + pageInfo.isHasNextPage());
}

PageInfo 常用属性:

  • list:分页后的数据列表
  • pageNum:当前页码
  • pageSize:每页显示数量
  • total:总记录数
  • pages:总页数
  • prePage:上一页页码
  • nextPage:下一页页码
  • isFirstPage/isLastPage:是否第一页/最后一页
  • hasPreviousPage/hasNextPage:是否有上一页/下一页
  • navigatePages:导航页码数(默认8)
  • navigatepageNums:所有导航页号

六、多种使用方式

1. 方式一:startPage + PageInfo(推荐)

java

PageHelper.startPage(1, 10);
List<User> list = userMapper.selectByExample(example);
PageInfo<User> pageInfo = new PageInfo<>(list);

2. 方式二:使用Page对象

java

PageHelper.startPage(1, 10);
List<User> list = userMapper.selectByExample(example);
PageInfo<User> pageInfo = new PageInfo<>(list);// 或者直接使用Page对象
Page<User> page = (Page<User>) list;
System.out.println("总数: " + page.getTotal());

3. 方式三:使用Mapper接口参数(需要配置)

java

// 在接口方法中添加RowBounds参数
List<User> selectByRowBounds(UserExample example, RowBounds rowBounds);// 使用
List<User> list = userMapper.selectByRowBounds(example, new RowBounds(0, 10));

七、高级功能

1. 排序功能

java

// 单字段排序
PageHelper.startPage(1, 10, "id desc");// 多字段排序
PageHelper.startPage(1, 10, "age asc, name desc");// 或者使用OrderBy
PageHelper.startPage(1, 10).setOrderBy("create_time desc");

2. 复杂查询条件 + 分页

java

public PageInfo<User> searchUsers(UserQuery query, int pageNum, int pageSize) {PageHelper.startPage(pageNum, pageSize);List<User> userList = userMapper.selectUsersByCondition(query);return new PageInfo<>(userList);
}

3. 只分页不查询总数(提升性能)

java

// 第三个参数设为false,不执行count查询
PageHelper.startPage(1, 10, false);
List<User> list = userMapper.selectAllUsers();

八、完整实战示例

1. Controller 层

java

@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserService userService;/*** 分页查询用户列表*/@GetMappingpublic Result<PageInfo<User>> getUsers(@RequestParam(defaultValue = "1") int pageNum,@RequestParam(defaultValue = "10") int pageSize,@RequestParam(required = false) String name,@RequestParam(required = false) Integer minAge,@RequestParam(required = false) Integer maxAge) {UserQuery query = new UserQuery();query.setName(name);query.setMinAge(minAge);query.setMaxAge(maxAge);PageInfo<User> pageInfo = userService.searchUsers(query, pageNum, pageSize);return Result.success(pageInfo);}
}// 统一返回结果封装
@Data
class Result<T> {private int code;private String message;private T data;public static <T> Result<T> success(T data) {Result<T> result = new Result<>();result.setCode(200);result.setMessage("success");result.setData(data);return result;}
}

2. Service 层

java

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public PageInfo<User> searchUsers(UserQuery query, int pageNum, int pageSize) {// 开启分页PageHelper.startPage(pageNum, pageSize);// 执行查询List<User> userList = userMapper.selectUsersByCondition(query);// 返回分页结果return new PageInfo<>(userList);}
}

3. 前端调用示例

http

GET /api/users?pageNum=2&pageSize=5&name=张&minAge=18

4. 返回结果示例

json

{"code": 200,"message": "success","data": {"pageNum": 2,"pageSize": 5,"total": 23,"pages": 5,"list": [{"id": 6,"name": "张三","age": 25,"email": "zhangsan@example.com"},// ... 其他4条数据],"prePage": 1,"nextPage": 3,"isFirstPage": false,"isLastPage": false,"hasPreviousPage": true,"hasNextPage": true}
}

九、注意事项

  1. 确保 PageHelper.startPage() 后紧跟查询语句

    java

    // ✅ 正确
    PageHelper.startPage(1, 10);
    List<User> list = userMapper.selectAll();// ❌ 错误:中间不能有其他代码
    PageHelper.startPage(1, 10);
    System.out.println("开始查询"); // 这行代码会导致分页失效
    List<User> list = userMapper.selectAll();
    
  2. 线程安全:PageHelper 基于 ThreadLocal,确保在同一个线程内使用

  3. Count查询优化:对于复杂查询,可以自定义Count查询

    xml

    <select id="selectWithCustomCount" resultType="User">SELECT * FROM users WHERE ...
    </select><select id="selectWithCustomCount_COUNT" resultType="long">SELECT COUNT(*) FROM users WHERE ...
    </select>
    

总结

PageHelper 是一个非常强大且易用的 MyBatis 分页插件,通过简单的 PageHelper.startPage() 调用,就可以实现完整的分页功能。它的主要优点在于:

  • 使用简单:一行代码实现分页
  • 功能丰富:支持排序、多种分页方式等
  • 兼容性好:支持多种数据库
  • 性能优秀:提供Count查询优化

掌握了 PageHelper 的使用,可以极大提高开发效率和代码质量。建议多动手实践,很快就能熟练掌握!

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

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

相关文章

毕设项目 基于大数据的K-means广告效果分析

基于大数据的K-means广告效果分析 项目运行效果&#xff1a; 毕业设计 基于大数据的K-means广告效果分析&#x1f9ff; 项目分享:见文末! 一、分析背景和目的 在大数据时代的背景下&#xff0c;广告主可以购买媒介变成直接购买用户&#xff0c;广告的精准投放对广告主、服务…

VGGT如何重塑三维视觉:从单图理解到多视角重建的技术演进

VGGT如何重塑三维视觉&#xff1a;从单图理解到多视角重建的技术演进 【免费下载链接】vggt VGGT Visual Geometry Grounded Transformer 项目地址: https://gitcode.com/gh_mirrors/vg/vggt 视觉几何基础Transformer&#xff08;VGGT&#xff09;正在重新定义三维场景理…

点大商城系统v2全开源版基础上增加22复制7人成团功能的一些开发经验导图支持(链动n+1功能+排队免单功能+大屏数据)

说明:点大商城已经全开源&#xff0c;全系支持二次开发&#xff08;功能修改、功能修复、增加功能、模板UI美化&#xff09;完全按照用户需求进行开发&#xff0c;有功能您尽管提分享最近用户开发案例需求&#xff0c;可能也能给你新脑洞&#xff08;22复制7人成团&#xff09;…

【硕士生必看】毕业论文初稿写崩了?Paperzz智能生成+深度查重,助你3天逆袭,导师直呼“这水平够发核心”!

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 https://www.paperzz.cc/dissertationhttps://www.paperzz.cc/dissertation 副标题&#xff1a; 硕士论文不是“写”出来的&#xff0c;是“炼”出来的&#xff01;Paperzz帮你搞定文献、大纲、生成、查重、…

shell 容器执行脚本有异常时直接退出

shell 容器执行脚本有异常时直接退出# pod.yaml # set -e:当脚本中有命令执行返回非0时,脚本会立即终止执行并异常退出。 # set -u:当脚本中引用了未定义的变量时,脚本会立即终止执行并异常退出。 ... containers:…

【单片机毕业设计】【mcugc-mcu910】基于单片机的温控风扇

一、基本介绍 功能&#xff1a; 1、通过DS1302同步时间&#xff0c;并可修正时间&#xff0c;同时可设定风扇开关时间 2、通过DS18B20检测温度&#xff0c;当温度大于设置最小值&#xff0c;才开启风扇&#xff0c;在最小值和最大值之间&#xff0c;低速转动&#xff0c;大于最…

08cms房产多城市版最新v8.7含小程序及装修网的安装及配置方法整理出来希望能帮到大家

目前市面上很多假货&#xff01;都是用很早期的版本来冒充&#xff0c;大家要提高警惕&#xff01;此系统默认已经授权&#xff0c;无域名使用限制了&#xff0c;但是框架特殊 配置也比较陌生&#xff0c;我整理出配置方法分享给大家&#xff08;另外我这里有所有补丁 从低版本…

彻底掌握pyenv:Shim机制如何让Python版本管理如鱼得水

彻底掌握pyenv&#xff1a;Shim机制如何让Python版本管理如鱼得水 【免费下载链接】pyenv Simple Python version management 项目地址: https://gitcode.com/GitHub_Trending/py/pyenv 你是否曾在多个Python项目间切换时&#xff0c;被版本兼容性问题搞得焦头烂额&…

【博士生必看】博士论文初稿写不动了?Paperzz智能辅助+权威查重,助你突破瓶颈,导师说“这思路可以申基金”!

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 https://www.paperzz.cc/dissertationhttps://www.paperzz.cc/dissertation 副标题&#xff1a; 博士论文不是“熬”出来的&#xff0c;是“智”出来的&#xff01;Paperzz帮你搞定海量文献、复杂大纲、深度…

记录一次微前端改造:把 10+ 个独立 Vue 项目整合到一起

记录一次微前端改造&#xff1a;把 10 个独立 Vue 项目整合到一起 最近主导了公司前端项目的微前端化改造&#xff0c;踩了不少坑&#xff0c;也有一些收获。趁着记忆还新鲜&#xff0c;把过程记录下来&#xff0c;希望能给有类似需求的同学一些参考。 声明&#xff1a;我也是第…

科技赋能味觉创意 “心语酪印” 西安首秀 打造可定制酸奶消费新场景

当古城西安的千年文脉遇上智能科技的创意火花&#xff0c;一场颠覆传统乳品消费的革新悄然启幕。2025 年 12 月 13 日&#xff0c;西安未央国际核心商圈人流涌动&#xff0c;国内首创智能奶皮子酸奶贩卖机品牌 “心语酪印” 以 “让美好发声” 为主题惊艳亮相。这台打破了 “贩…

ScienceDecrypting完全攻略:三步搞定科研文档解密难题

ScienceDecrypting完全攻略&#xff1a;三步搞定科研文档解密难题 【免费下载链接】ScienceDecrypting 项目地址: https://gitcode.com/gh_mirrors/sc/ScienceDecrypting 还在为那些带有使用期限的科研文档而烦恼吗&#xff1f;ScienceDecrypting正是为你量身打造的解决…

【Java-小程序毕设项目】基于微信小程序的个人健康管理系统+SpringBoot后端实现

【Java-小程序毕设项目】基于微信小程序的个人健康管理系统SpringBoot后端实现 weixin184-基于微信小程序的个人健康管理系统SpringBoot后端实现 文章目录【Java-小程序毕设项目】基于微信小程序的个人健康管理系统SpringBoot后端实现一、内容包括二、运行环境三、需求分析四、…

完整教程:构建AI智能体:九十五、YOLO视觉大模型入门指南:从零开始掌握目标检测

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Windows系统中msg命令的完整使用方法及相关示例

Windows系统中msg命令的完整使用方法及相关示例 在 Windows 系统中&#xff0c;msg 是内置的命令行工具&#xff0c;用于向本地/远程 Windows 终端会话发送消息。以下是 msg ** 命令的完整使用方法**&#xff0c;包括语法、参数、示例和注意事项&#xff0c;覆盖本地/远程、单…

Velero压缩引擎深度解析:从架构原理到实战调优

Velero压缩引擎深度解析&#xff1a;从架构原理到实战调优 【免费下载链接】velero Backup and migrate Kubernetes applications and their persistent volumes 项目地址: https://gitcode.com/GitHub_Trending/ve/velero 你是否曾经面对Kubernetes集群备份时&#xff…

【大气】大气模型计算不同海拔层的温度、气压、密度和声速Matlab仿真

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿…

LookingGlass与OBS集成:实现专业级游戏直播录屏

LookingGlass与OBS集成&#xff1a;实现专业级游戏直播录屏 【免费下载链接】LookingGlass An extremely low latency KVMFR (KVM FrameRelay) implementation for guests with VGA PCI Passthrough. 项目地址: https://gitcode.com/gh_mirrors/lo/LookingGlass Looking…

65、Mono编程入门指南:从基础到GUI应用

Mono编程入门指南:从基础到GUI应用 1. Mono简介与优势 Mono在2011年8月由Xamarin进行了首次正式发布。尽管未来发展未知,但它显然未被弃用。在Linux已有众多编程语言的情况下,使用Mono和.NET仍有诸多理由: - .NET具备“一次编译,到处运行”的特性,能在Linux和Windows间…

如何快速掌握umy-ui:面向Vue开发者的终极性能优化指南

如何快速掌握umy-ui&#xff1a;面向Vue开发者的终极性能优化指南 【免费下载链接】umy-ui umy-ui&#xff0c;一套为开发者准备的基于 Vue 2.0 的桌面端组件库&#xff0c;完美解决表格万级数据渲染卡顿&#xff0c;编辑表格卡顿问题 项目地址: https://gitcode.com/gh_mirr…