news 2026/6/10 13:23:03

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
完整 Oracle 12c 分页 Demo(Spring Boot+MyBatis+PageHelper)

一、核心代码实现

1. pom.xml(依赖配置)

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <!-- 稳定版,适配PageHelper --> <relativePath/> </parent> <groupId>com.example</groupId> <artifactId>oracle-page-demo</artifactId> <version>1.0.0</version> <dependencies> <!-- Spring Boot核心 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.0</version> </dependency> <!-- PageHelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.7</version> </dependency> <!-- Oracle驱动 --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>21.9.0.0</version> </dependency> <!-- SQL解析 --> <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>4.6</version> </dependency> <!-- 测试 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

2. application.properties(配置文件)

# 服务器端口 server.port=8080 # Oracle数据库配置 spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver spring.datasource.url=jdbc:oracle:thin:@localhost:1521:ORCL # 替换为你的Oracle地址 spring.datasource.username=your_username # 替换为你的用户名 spring.datasource.password=your_password # 替换为你的密码 # MyBatis配置 mybatis.mapper-locations=classpath:mybatis/mapper/*.xml mybatis.type-aliases-package=com.example.oraclepage.entity mybatis.configuration.map-underscore-to-camel-case=true # 下划线转驼峰 # PageHelper配置 pagehelper.helper-dialect=oracle12c # 指定自定义的Oracle 12c方言 pagehelper.reasonable=true # 分页合理化(页码越界自动修正) pagehelper.support-methods-arguments=true # 支持Mapper参数传分页参数 pagehelper.params=count=countSql

3. Oracle12cDialect.java(自定义方言)

package com.example.oraclepage.config; import com.github.pagehelper.Page; import com.github.pagehelper.dialect.AbstractHelperDialect; import com.github.pagehelper.page.PageAutoDialect; import org.apache.ibatis.cache.CacheKey; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.springframework.stereotype.Component; import java.util.Map; /** * 自定义Oracle 12c分页方言(适配OFFSET ... FETCH语法) */ @Component public class Oracle12cDialect extends AbstractHelperDialect { // 注册方言别名,与配置文件中的pagehelper.helper-dialect对应 static { PageAutoDialect.registerDialectAlias("oracle12c", Oracle12cDialect.class); } /** * 生成Oracle 12c分页SQL(核心方法) * @param sql 原始查询SQL * @param page 分页对象 * @param pageKey 缓存Key * @return 拼接后的分页SQL */ @Override public String getPageSql(String sql, Page page, CacheKey pageKey) { StringBuilder sqlBuilder = new StringBuilder(sql.length() + 60); sqlBuilder.append(sql); // Oracle 12c分页语法:OFFSET 跳过行数 ROWS FETCH NEXT 取行数 ROWS ONLY int offset = page.getStartRow(); // 跳过的行数((页码-1)*每页条数) int limit = page.getPageSize(); // 每页条数 sqlBuilder.append(" OFFSET ").append(offset).append(" ROWS FETCH NEXT ").append(limit).append(" ROWS ONLY"); // 更新缓存Key(用于MyBatis缓存) pageKey.update(offset); pageKey.update(limit); return sqlBuilder.toString(); } /** * 处理分页参数(Oracle 12c直接拼接SQL,无需额外参数处理) */ @Override public Object processPageParameter(MappedStatement ms, Map<String, Object> paramMap, Page page, BoundSql boundSql) { return paramMap; } }

4. User.java(实体类)

package com.example.oraclepage.entity; /** * 测试用用户实体类(需与数据库表字段对应) */ public class User { private Long id; // 用户ID private String userName; // 用户名(对应数据库user_name) private String email; // 邮箱 // Getter & Setter public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } // toString @Override public String toString() { return "User{" + "id=" + id + ", userName='" + userName + '\'' + ", email='" + email + '\'' + '}'; } }

5. UserMapper.java(Mapper 接口)

package com.example.oraclepage.mapper; import com.example.oraclepage.entity.User; import org.apache.ibatis.annotations.Mapper; import java.util.List; /** * 用户Mapper接口 */ @Mapper public interface UserMapper { /** * 查询所有用户(PageHelper自动分页) */ List<User> selectAllUsers(); }

6. UserMapper.xml(Mapper 映射文件)

<?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.oraclepage.mapper.UserMapper"> <!-- 查询所有用户 --> <select id="selectAllUsers" resultType="com.example.oraclepage.entity.User"> SELECT id, user_name, email FROM t_user <!-- 替换为你的实际表名 --> </select> </mapper>

7. UserService.java(业务层)

package com.example.oraclepage.service; import com.example.oraclepage.entity.User; import com.example.oraclepage.mapper.UserMapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * 用户业务层 */ @Service public class UserService { @Autowired private UserMapper userMapper; /** * 分页查询用户 * @param pageNum 页码(从1开始) * @param pageSize 每页条数 * @return 分页结果(包含数据+分页信息) */ public PageInfo<User> getUsersByPage(int pageNum, int pageSize) { // 开启分页(核心:PageHelper自动拼接Oracle 12c分页SQL) PageHelper.startPage(pageNum, pageSize); // 执行查询(无需修改SQL,PageHelper自动处理) List<User> userList = userMapper.selectAllUsers(); // 包装为PageInfo(包含总条数、总页数、当前页等信息) return new PageInfo<>(userList); } }

8. OraclePageApplication.java(启动类)

package com.example.oraclepage; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * 项目启动类 */ @SpringBootApplication @MapperScan("com.example.oraclepage.mapper") // 扫描Mapper接口 public class OraclePageApplication { public static void main(String[] args) { SpringApplication.run(OraclePageApplication.class, args); } }

9. 测试 Controller(可选)

package com.example.oraclepage.controller; import com.example.oraclepage.entity.User; import com.example.oraclepage.service.UserService; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * 测试接口 */ @RestController public class UserController { @Autowired private UserService userService; /** * 分页查询用户接口 * 访问示例:http://localhost:8080/users?pageNum=1&pageSize=10 */ @GetMapping("/users") public PageInfo<User> getUsers( @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) { return userService.getUsersByPage(pageNum, pageSize); } }

二、测试

  1. CREATE TABLE t_user ( id NUMBER PRIMARY KEY, user_name VARCHAR2(50), email VARCHAR2(100) ); -- 插入测试数据 INSERT INTO t_user VALUES (1, 'zhangsan', 'zhangsan@test.com'); INSERT INTO t_user VALUES (2, 'lisi', 'lisi@test.com'); INSERT INTO t_user VALUES (3, 'wangwu', 'wangwu@test.com'); COMMIT;
  2. 启动项目:运行OraclePageApplication,访问http://localhost:8080/users?pageNum=1&pageSize=2
  3. 查看结果:返回的 JSON 包含list(当前页数据)、total(总条数)、pages(总页数)等信息,且底层执行的 SQL 为:
    SELECT id, user_name, email FROM t_user OFFSET 0 ROWS FETCH NEXT 2 ROWS ONLY

三、注意事项

  1. 确保 Oracle 版本为 12c 及以上(OFFSET ... FETCH是 12c 新增语法);
  2. 替换配置文件中的数据库地址、用户名、密码为你的实际信息;
  3. 表名 / 字段名需与实体类、Mapper.xml 中的配置一致;
  4. PageHelper 版本建议与 Spring Boot 版本适配(避免依赖冲突)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 3:06:29

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

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

作者头像 李华
网站建设 2026/6/10 13:35:24

CSV大文件处理全流程:数据清洗、去重与格式标准化深度实践

第一章 大文件处理核心挑战与解决方案1.1 内存优化策略处理GB级CSV文件时&#xff0c;传统方法如Pandas的read_csv()会引发内存溢出。我们采用以下解决方案&#xff1a;import csv from collections import defaultdictdef streaming_reader(file_path, chunk_size10000):with …

作者头像 李华
网站建设 2026/6/6 10:20:18

动态可视化报告制作:DeepSeek+Mermaid生成交互式流程图/甘特图

摘要&#xff1a; 在信息爆炸的时代&#xff0c;清晰、动态且交互式的数据可视化已成为高效沟通和决策的关键。本文将深入探讨如何结合先进的 AI 技术&#xff08;以 DeepSeek 为代表&#xff09;与轻量级图表描述语言 Mermaid&#xff0c;高效生成包含交互式流程图和甘特图的动…

作者头像 李华
网站建设 2026/6/3 6:58:52

Amazon Bedrock AgentCore:AI Agent 规模化落地的终极方案

一、前言 AI Agent 的价值早已不止于概念验证&#xff0c;但从原型到规模化生产的落地之路&#xff0c;始终被基础设施搭建、安全管控、跨系统协作等难题卡住。而 Amazon Bedrock AgentCore 的出现&#xff0c;正以 “模块化 全托管” 的企业级方案&#xff0c;打破这一瓶颈 …

作者头像 李华
网站建设 2026/5/29 5:13:37

云舟观测报表管理功能:从业务到智能运维

一、背景 数字化转型背景下&#xff0c;企业云端业务规模与复杂度攀升&#xff0c;对精细化运维需求迫切。云舟观测作为全栈监控运维平台&#xff0c;其报表管理功能是支撑用户掌控业务与云产品健康状况的核心环节。 业务层面&#xff0c;企业在巡检、运维、业务监控等场景中…

作者头像 李华