新闻详情

新闻详情

首页 / 资讯中心 / 详情

Spring Boot整合PageHelper实现高效MyBatis分页

发布时间:2026/11/1 21:50:40来源:尧图网络
Spring Boot整合PageHelper实现高效MyBatis分页
1. 项目概述在Spring Boot项目中整合MyBatis进行数据库操作时分页查询是最常见的需求之一。传统的分页实现方式往往需要在SQL中手动编写limit语句这种方式不仅繁琐而且难以维护。PageHelper作为MyBatis的物理分页插件通过拦截器机制自动处理分页逻辑让开发者只需关注业务查询本身。我在多个企业级项目中实际使用PageHelper后发现它能够将原本需要10-20行代码的分页逻辑简化为2-3行配置同时支持多种数据库方言包括MySQL、Oracle、PostgreSQL等主流数据库。最新版本的PageHelper 6.x已全面支持JDK8特性与Spring Boot 3.x也能完美兼容。2. 核心原理与配置2.1 分页插件工作原理PageHelper基于MyBatis的Interceptor机制实现。当执行Mapper方法时插件会拦截Executor的query方法通过解析ThreadLocal中存储的分页参数自动重写原始SQL语句。以MySQL为例原始SQLSELECT * FROM user WHERE status 1添加分页后会被改写为SELECT * FROM user WHERE status 1 LIMIT 0,10这种物理分页方式相比内存分页先查询全部数据再截取性能更高特别是在大数据量场景下差异明显。2.2 Spring Boot集成配置在pom.xml中添加依赖建议使用最新稳定版dependency groupIdcom.github.pagehelper/groupId artifactIdpagehelper-spring-boot-starter/artifactId version1.4.6/version /dependencyapplication.yml基础配置示例pagehelper: helper-dialect: mysql reasonable: true support-methods-arguments: true params: countcountSql关键参数说明helper-dialect指定数据库方言reasonable分页合理化超出总页数时返回最后一页params分页参数别名设置3. 实际应用详解3.1 基础分页查询在Service层实现典型分页查询public PageInfoUser getUsers(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); ListUser users userMapper.selectAll(); return new PageInfo(users); }PageHelper.startPage()方法会设置线程本地分页参数接下来的第一个查询语句会自动应用分页。PageInfo对象包含丰富的分页信息当前页码pageNum每页数量pageSize总记录数total总页数pages实际数据列表list3.2 复杂多表分页对于多表关联查询PageHelper同样适用public PageInfoUserDTO getUsersWithRoles(int pageNum) { PageHelper.startPage(pageNum, 10); ListUserDTO list userMapper.selectUsersWithRoles(); return new PageInfo(list); }对应的Mapper XMLselect idselectUsersWithRoles resultTypeUserDTO SELECT u.*, r.role_name FROM user u LEFT JOIN user_role ur ON u.id ur.user_id LEFT JOIN role r ON ur.role_id r.id /select3.3 分页排序功能结合排序参数使用public PageInfoUser getUsersSorted(int pageNum, String orderBy) { PageHelper.startPage(pageNum, 10).setOrderBy(orderBy); return new PageInfo(userMapper.selectAll()); }调用示例// 按创建时间倒序 pageInfo userService.getUsersSorted(1, create_time desc);4. 高级特性与优化4.1 自定义分页SQL对于特殊分页需求可以使用SelectProvider注解SelectProvider(type UserSqlBuilder.class, method buildSelectByExample) ListUser selectByExample(UserExample example); class UserSqlBuilder { public String buildSelectByExample(UserExample example) { return new SQL() {{ SELECT(*); FROM(user); if (example.getStatus() ! null) { WHERE(status #{status}); } }}.toString(); } }4.2 分页性能优化COUNT查询优化pagehelper: count-suffix: _COUNT对应Mapper中定义专用count查询select idselectAll_COUNT resultTypelong SELECT COUNT(1) FROM user /select禁用不必要的count查询PageHelper.startPage(1, 10, false); // 第三个参数设为false跳过count4.3 多数据源支持在多数据源环境下需要为每个数据源单独配置方言Bean ConfigurationProperties(prefix spring.datasource.ds1) public DataSource ds1() { return DataSourceBuilder.create().build(); } Bean public PageInterceptor pageInterceptor() { PageInterceptor interceptor new PageInterceptor(); Properties props new Properties(); props.setProperty(helperDialect, mysql); interceptor.setProperties(props); return interceptor; }5. 常见问题排查5.1 分页失效场景未遵循调用规范// 错误示例startPage与查询语句不在同一线程 new Thread(() - { userMapper.selectAll(); }).start(); // 正确做法 PageHelper.startPage(1, 10); userMapper.selectAll();分页语句后存在其他查询PageHelper.startPage(1, 10); userMapper.selectAll(); // 这个会被分页 userMapper.selectOther(); // 这个也会被分页解决方案使用PageHelper.clearPage()清除分页参数5.2 特殊数据库适配对于达梦等特殊数据库需配置dialectAliaspagehelper: dialect-alias: dmoracle5.3 与MyBatis-Plus共存同时使用PageHelper和MyBatis-Plus时需注意拦截器顺序Bean Order(0) // 确保先执行 public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } Bean Order(1) public PageInterceptor pageInterceptor() { return new PageInterceptor(); }6. 最佳实践建议统一分页参数处理public class PageRequest { Min(1) private int pageNum 1; Range(min 1, max 100) private int pageSize 10; private String orderBy; }全局响应封装public class PageResultT { private long total; private ListT rows; public static T PageResultT of(PageInfoT pageInfo) { PageResultT result new PageResult(); result.setTotal(pageInfo.getTotal()); result.setRows(pageInfo.getList()); return result; } }前端分页组件对接// VueElementUI示例 el-pagination :current-pagequeryParams.pageNum :page-sizequeryParams.pageSize :totaltotal current-changehandlePageChange /在实际项目开发中我发现合理设置pageSize默认值非常重要。根据业务场景通常建议后台管理系统10-20条/页移动端列表5-10条/页报表导出可设置较大值如1000条对于超大数据量的分页如百万级建议采用上一页/下一页模式而非直接跳页可以通过记录上一页最后一条记录的ID来实现高效分页SELECT * FROM table WHERE id #{lastId} ORDER BY id LIMIT 10
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/1 1:42:41

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/1 2:34:07

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/1 2:01:57

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/1 3:13:10

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/1 2:11:52

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/1 3:23:38

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉