news 2026/2/9 11:05:26

Spring Boot+MyBatis:用 PageHelper 实现 Oracle 12c 的 OFFSET 分页

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot+MyBatis:用 PageHelper 实现 Oracle 12c 的 OFFSET 分页

在分页场景中,不同数据库的分页语法差异很大 —— 比如 MySQL 用LIMIT,而Oracle 12c 开始支持更灵活的OFFSET ... FETCH语法。今天结合 PageHelper,分享如何在 Spring Boot 中适配 Oracle 12c 的分页方式。

一、PageHelper 基础:引入与自动配置

首先在 Spring Boot 中引入 PageHelper 依赖(以 Maven 为例):

<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.7</version> <!-- 建议用最新稳定版 --> </dependency> <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>4.6</version> <!-- 适配SQL解析的版本 --> </dependency>

Spring Boot 会自动配置 PageHelper,无需额外代码~

二、核心:自定义 Oracle 12c 分页方言

PageHelper 默认的 Oracle 方言用的是ROWNUM语法(适配旧版本),而 Oracle 12c 支持更简洁的OFFSET ... FETCH。我们需要自定义方言,重写分页 SQL 生成逻辑

步骤 1:编写 Oracle 12c 方言类

继承AbstractHelperDialect,实现getPageSql方法,拼接OFFSET ... FETCH语法:

@Component public class Oracle12cDialect extends AbstractHelperDialect { // 注册方言别名,后续配置用 static { PageAutoDialect.registerDialectAlias("oracle12c", Oracle12cDialect.class); } @Override public String getPageSql(String sql, Page page, CacheKey pageKey) { StringBuilder sqlBuilder = new StringBuilder(sql.length() + 40); sqlBuilder.append(sql); // 拼接Oracle 12c的分页语法:OFFSET 跳过行数 FETCH NEXT 取行数 ROWS ONLY int offset = page.getStartRow(); int limit = page.getPageSize(); sqlBuilder.append(" OFFSET ").append(offset).append(" ROWS FETCH NEXT ").append(limit).append(" ROWS ONLY"); pageKey.update(offset); pageKey.update(limit); return sqlBuilder.toString(); } @Override public Object processPageParameter(MappedStatement ms, Map<String, Object> paramMap, Page page, BoundSql boundSql) { // 这里无需额外参数(OFFSET/FETCH直接拼接在SQL中),返回原参数即可 return paramMap; } }

步骤 2:配置方言

application.properties中指定使用自定义的oracle12c方言:

# 指定Oracle 12c方言 pagehelper.helper-dialect=oracle12c # 分页合理化(pageNum<=0查第1页,pageNum>总页数查最后一页) pagehelper.reasonable=true # 支持通过Mapper接口传分页参数 pagehelper.support-methods-arguments=true

三、使用示例:一行代码实现分页

在 Service 层调用PageHelper.startPage,后续 MyBatis 查询会自动拼接 Oracle 12c 的分页 SQL:

@Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public Page<User> listUsers(int pageNum, int pageSize) { // 1. 开启分页(pageNum:页码;pageSize:每页条数) PageHelper.startPage(pageNum, pageSize); // 2. 执行查询(自动拼接OFFSET ... FETCH) List<User> userList = userMapper.selectAll(); // 3. 包装为Page对象(包含总条数、分页信息) return new PageInfo<>(userList).toPage(); } }

四、对比:Oracle 旧版与 12c 分页语法

  • 旧版(ROWNUM):需要嵌套子查询,语法繁琐
    SELECT * FROM ( SELECT t.*, ROWNUM rn FROM (SELECT * FROM user) t WHERE ROWNUM <= 20 ) WHERE rn > 10
  • Oracle 12c(OFFSET/FETCH):简洁直观(PageHelper 通过自定义方言自动生成)
    SELECT * FROM user OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

通过自定义 PageHelper 方言,就能让 MyBatis 完美适配 Oracle 12c 的现代分页语法啦~

完整 Oracle 12c 分页 Demo(SpringBoot+MyBatis+PageHelper)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 11:52:48

跨越进程的对话之从管道到gRPC的通信技术演进

在一台Linux服务器上&#xff0c;一个简单的管道命令 cat README.md | grep rcore 背后&#xff0c;是两个进程通过内核中转的无缝协作&#xff0c;这是进程间通信最原始却有效的体现。当这种协作需求从单机扩展到全球分布式系统时&#xff0c;游戏规则彻底改变了。当操作系统的…

作者头像 李华
网站建设 2026/2/8 0:14:51

学长亲荐8个AI论文工具,自考毕业论文格式规范必备!

学长亲荐8个AI论文工具&#xff0c;自考毕业论文格式规范必备&#xff01; AI 工具如何助力自考论文写作 对于自考学生而言&#xff0c;毕业论文的撰写无疑是一项挑战。从选题到结构搭建&#xff0c;再到内容创作和格式规范&#xff0c;每一个环节都需要投入大量时间和精力。而…

作者头像 李华
网站建设 2026/2/4 16:25:03

天猫代运营TP是什么意思?

在品牌征战线上市场的过程中&#xff0c;天猫无疑是最为核心和复杂的战场之一。其庞大的生态、精细的规则与激烈的竞争&#xff0c;催生了一个高度专业化的服务行业。当品牌方&#xff0c;尤其是初入局或不具备成熟电商团队的品牌&#xff0c;在寻求外部运营支持时&#xff0c;…

作者头像 李华
网站建设 2026/2/7 23:28:52

构建智能呼吸灯:PWM调光技术在LED控制中的应用!

随着智能照明系统的普及&#xff0c;具备动态光效的LED呼吸灯在氛围灯、状态指示等场景中备受青睐。聚焦于PWM调光技术在LED控制中的实际应用&#xff0c;阐述如何通过调节PWM信号的占空比与频率&#xff0c;实现灯光的平滑过渡与低闪烁呼吸效果&#xff0c;提升系统能效与用户…

作者头像 李华
网站建设 2026/2/7 8:31:54

一人AI公司:一个人如何打造属于自己的AI创业帝国?(优化版)

一人AI公司&#xff1a;一个人如何打造属于自己的AI创业帝国&#xff1f;&#xff08;优化版&#xff09; 关键词&#xff1a;AI创业、独立开发者、一人公司、生成式AI、低代码开发引言&#xff1a;当AI成为你的“超级副驾驶” 2025年&#xff0c;人工智能不再是大厂专属的奢侈…

作者头像 李华
网站建设 2026/2/8 19:41:12

项目分享|GPT-SoVITS-WebUI:用AI复刻任何声音,只需5秒

引言 在语音合成与转换领域&#xff0c;如何快速实现高相似度的语音克隆、跨语言语音生成一直是技术难点。而GPT-SoVITS-WebUI的出现&#xff0c;为解决这些问题提供了全新方案。作为一款开源的少样本语音转换与文本转语音&#xff08;TTS&#xff09;工具&#xff0c;它凭借轻…

作者头像 李华