百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

SpringBoot 各种分页查询方式详解(全网最全)

mhr18 2025-06-18 22:57 4 浏览 0 评论

一、分页查询基础概念与原理

1.1 什么是分页查询

分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难找到想要的那本。但如果书被整齐地放在多个书架上(每书架相当于一页),并标有编号,查找起来就方便多了。

分页查询的核心价值体现在:

  • 提升用户体验:避免用户面对海量数据时的信息过载
  • 提高系统性能:减少单次请求传输的数据量
  • 降低服务器压力:避免一次性处理过多数据

1.2 分页查询的基本参数

所有分页实现都围绕以下几个核心参数展开:

参数名

说明

默认值示例

使用场景说明

pageNum

当前页码(从0或1开始)

1

用户想查看第几页数据

pageSize

每页显示记录数

10

控制单页数据量

totalPages

总页数

计算得出

用于生成分页导航

totalElements

总记录数

查询得出

显示数据总量信息

sortField

排序字段

createTime

按哪个字段排序

sortOrder

排序方向(ASC/DESC)

DESC

升序还是降序排列

1.3 分页查询的SQL原理

在数据库层面,不同数据库的分页实现语法有所差异:

MySQL分页语法:

SELECT * FROM table_name LIMIT offset, pageSize
-- 例如:获取第2页,每页10条
SELECT * FROM user LIMIT 10, 10

Oracle分页语法:

SELECT * FROM (
    SELECT a.*, ROWNUM rn FROM (
        SELECT * FROM table_name ORDER BY sort_field
    ) a WHERE ROWNUM <= pageNum*pageSize
) WHERE rn > (pageNum-1)*pageSize

PostgreSQL分页语法:

SELECT * FROM table_name LIMIT pageSize OFFSET offset

1.4 SpringBoot中的分页抽象

Spring Data项目对分页进行了高度抽象,主要包含以下核心接口:

  1. Pageable:分页请求的抽象接口,包含分页和排序信息
  2. Page:包含数据和分页信息的接口
  3. Sort:排序规则的抽象

这种抽象使得开发者可以用统一的方式处理不同数据源的分页,无论是JPA、MongoDB还是Elasticsearch。

二、SpringBoot基础分页实现

2.1 使用Spring Data JPA实现分页

2.1.1 基础环境搭建

首先确保你的项目包含必要依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

2.1.2 实体类定义

定义一个简单的用户实体:

@Entity
@Table(name = "t_user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(nullable = false, length = 50)
    private String username;
    
    @Column(nullable = false, length = 100)
    private String email;
    
    @Column(name = "create_time", updatable = false)
    @CreationTimestamp
    private LocalDateTime createTime;
    
    // 省略getter/setter和toString
}

2.1.3 Repository接口定义

创建支持分页的Repository接口:

public interface UserRepository extends JpaRepository<User, Long> {
    
    // 方法1:使用预定义的findAll(Pageable)
    // 已由父接口提供,无需额外声明
    
    // 方法2:自定义查询+分页
    @Query("SELECT u FROM User u WHERE u.email LIKE %:email%")
    Page<User> findByEmailContaining(@Param("email") String email, Pageable pageable);
    
    // 方法3:基于方法命名规则的查询
    Page<User> findByUsernameContaining(String username, Pageable pageable);
}

2.1.4 服务层实现

@Service
@RequiredArgsConstructor
public class UserService {
    private final UserRepository userRepository;
    
    /**
     * 基础分页查询
     * @param pageNum 页码(从0开始)
     * @param pageSize 每页大小
     * @return 分页数据
     */
    public Page<User> getUsers(int pageNum, int pageSize) {
        // 构建分页请求
        Pageable pageable = PageRequest.of(pageNum, pageSize);
        return userRepository.findAll(pageable);
    }
    
    /**
     * 带条件的分页查询
     * @param username 用户名模糊查询条件
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 分页数据
     */
    public Page<User> getUsersByUsername(String username, int pageNum, int pageSize) {
        Pageable pageable = PageRequest.of(pageNum, pageSize);
        return userRepository.findByUsernameContaining(username, pageable);
    }
}

2.1.5 控制器层

@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {
    private final UserService userService;
    
    /**
     * 获取用户分页列表
     * @param page 页码,默认为0
     * @param size 每页大小,默认为10
     * @return 分页结果
     */
    @GetMapping
    public ResponseEntity<Page<User>> listUsers(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size) {
        Page<User> users = userService.getUsers(page, size);
        return ResponseEntity.ok(users);
    }
    
    /**
     * 根据用户名搜索用户
     * @param username 搜索关键词
     * @param page 页码
     * @param size 每页大小
     * @return 分页结果
     */
    @GetMapping("/search")
    public ResponseEntity<Page<User>> searchUsers(
            @RequestParam String username,
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size) {
        Page<User> users = userService.getUsersByUsername(username, page, size);
        return ResponseEntity.ok(users);
    }
}

2.1.6 分页结果分析

调用/api/users?page=0&size=5将返回类似如下的JSON结构:

{
  "content": [
    {
      "id": 1,
      "username": "user1",
      "email": "user1@example.com",
      "createTime": "2023-01-01T10:00:00"
    },
    // ...其他4条数据
  ],
  "pageable": {
    "sort": {
      "sorted": false,
      "unsorted": true,
      "empty": true
    },
    "pageNumber": 0,
    "pageSize": 5,
    "offset": 0,
    "paged": true,
    "unpaged": false
  },
  "last": false,
  "totalPages": 20,
  "totalElements": 100,
  "number": 0,
  "size": 5,
  "sort": {
    "sorted": false,
    "unsorted": true,
    "empty": true
  },
  "first": true,
  "numberOfElements": 5,
  "empty": false
}

总结

本文全面探讨了SpringBoot中的各种分页查询技术,从基础的JPA和MyBatis实现,到高级的分页技巧和复杂场景解决方案。我们涵盖了:

  1. 分页的核心概念与原理
  2. 基础分页实现方式
  3. 高级分页功能(排序、动态条件等)
  4. 前端整合与最佳实践
  5. 性能优化与常见问题
  6. 特殊场景解决方案
  7. 测试策略
  8. 未来发展方向

分页作为数据展示的基础功能,其实现质量直接影响用户体验和系统性能。希望本文能帮助你在实际项目中实现高效、稳定的分页功能。记住,没有放之四海而皆准的分业方案,最重要的是根据你的具体业务需求和技术环境选择最适合的实现方式。

由于篇幅原因,这里只展示了一种方法,关注微信公众号获取更多更全的分页方法。

关注我?别别别,我怕你笑出腹肌找我赔钱。


头条对markdown的文章显示不太友好,想了解更多的可以关注微信公众号:“Eric的技术杂货库”,有更多的干货以及资料下载。

相关推荐

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

备份软件调用rman接口备份报错RMAN-06820 ORA-17629 ORA-17627

一、报错描述:备份归档报错无法连接主库进行归档,监听问题12541RMAN-06820:WARNING:failedtoarchivecurrentlogatprimarydatab...

增量备份修复物理备库gap(增量备份恢复数据库步骤)

适用场景:主备不同步,主库归档日志已删除且无备份.解决方案:主库增量备份修复dg备库中的gap.具体步骤:1、停止同步>alterdatabaserecovermanagedstand...

一分钟看懂,如何白嫖sql工具(白嫖数据库)

如何白嫖sql工具?1分钟看懂。今天分享一个免费的sql工具,毕竟现在比较火的NavicatDbeaverDatagrip都需要付费才能使用完整功能。幸亏今天有了这款SQLynx,它不仅支持国内外...

「开源资讯」数据管理与可视化分析平台,DataGear 1.6.1 发布

前言数据齿轮(DataGear)是一款数据库管理系统,使用Java语言开发,采用浏览器/服务器架构,以数据管理为核心功能,支持多种数据库。它的数据模型并不是原始的数据库表,而是融合了数据库表及表间关系...

您还在手工打造增删改查代码么,该神器带你脱离苦海

作为Java开发程序,日常开发中,都会使用Spring框架,完成日常的功能开发;在相关业务系统中,难免存在各种增删改查的接口需求开发。通常来说,实现增删改查有如下几个方式:纯手工打造,编写各种Cont...

Linux基础知识(linux基础知识点及答案)

系统目录结构/bin:命令和应用程序。/boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev:dev是Device(设备)的缩写,该目录...

PL/SQL 杂谈(二)(pl/sql developer使用)

承接(一)部分。我们从结构和功能这两个方面展示PL/SQL的关键要素。可以看看PL/SQL的优雅的代码。写出一个好的代码,就和文科生写出一篇优秀的作文一样,那么赏心悦目。1、与SQL的集成PL/S...

电商ERP系统哪个好用?(电商erp哪个好一点)

电商ERP系统哪个好用?做电商的,谁还没被ERP折腾过?有老板说:“我们早就上了ERP,订单、库存、财务全搞定,系统用得飞起。”也有运营吐槽:“系统是上了,可库存老不准,订单漏单错单天天有,财务对账还...

汽车检测线系统实例,看集中控制与PLC分布控制

PLC可编程控制器,上个世纪70年代初,为取代早期继电器控制线路,开始采取存储指令方式,完成顺序控制而设计的。开始仅有逻辑运算、计时、计数等简单功能。随着微处理的发展,PLC可编程能力日益提高,已经能...

苹果五件套成公司年会奖品主角,几大小技巧教你玩转苹果新品

钱江晚报·小时新闻记者张云山随着春节的临近,各家大公司的年会又将陆续上演。上周,各大游戏公司的年会大奖,苹果五件套又成了标配。在上海的游戏公司中,莉莉丝奖品列表拉得相当长,从特等奖到九等奖还包含了特...

取消回复欢迎 发表评论: