百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

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

liuian 2025-07-27 21:59 12 浏览

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

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的技术杂货库”,有更多的干货以及资料下载。

相关推荐

快速上手maven

Maven的作用在开发过程中需要用到各种各样的jar包,查找和下载这些jar包是件费时费力的事,特别是英文官方网站,可以将Maven看成一个整合了所有开源jar包的合集,我们需要jar包只需要从Mav...

Windows系统——配置java环境变量

怎么配置java环境变量呢?首先是安装好jdk然后我的电脑右键选择属性然后选择左侧高级系统设置高级然后点环境变量然后在用户变量或系统变量中配置,用户变量指的是只有当前用户可用,系统变量指的是系统中...

ollama本地部署更改默认C盘,Windows配置环境变量方法

ollama是一个大语言模型(LLM——LargeLanguageModel),本地电脑安装网上也要很多教程,看上去非常简单,一直下一步,然后直接就可以使用了。但是我在实操的时候并不是这样,安装完...

# Windows 环境变量 Path 显示样式更改

#怎样学习Java##Windows环境变量Path显示样式更改##1、传统Path环境变量显示:```---》键盘上按【WIN+I】打开系统【设置】---》依次点击---》【系统...

如何在Windows中创建用户和系统环境变量

在Windows中创建环境变量之前您应该了解的事情在按照本指南中所示的任何步骤创建指向文件夹、文件或其他任何内容的用户和系统变量之前,您应该了解两件事。第一个也是最重要的一个是了解什么是环境变量。...

Windows 中的环境变量是什么?

Windows中的环境变量是什么?那么,Windows中的环境变量是什么?简而言之,环境变量是描述应用程序和程序运行环境的变量。所有类型的程序都使用环境变量来回答以下问题:我安装的计算机的名称是什么...

【Python程序开发系列】谈一谈Windows环境变量:系统和用户变量

这是我的第350篇原创文章。一、引言环境变量(environmentvariables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量是在操作...

系统小技巧:还原Windows10路径环境变量

有时,我们在Windows10的“运行”窗口中执行一些命令或运行一些程序,这时即便没有指定程序的具体路径,只输入程序的名称(如notepad.exe),便可以迅速调用成功。这是因为Windows默认...

Windows10系统的“环境变量”在哪里呢?

当我们在操作系统是Windows10的电脑里安装了一些软件,要通过配置环境变量才能使用软件时,在哪里能找到“环境变量”窗口呢?可以按照下面的步骤找到“环境变量”。说明:下面的步骤和截图是在Window...

系统小技巧:彻底弄懂Windows 10环境变量

每当我们进行系统清理时,清理软件总能自动找到Windows的临时文件夹之所在,然后加以清理,即便是我们重定向了TEMP目录也是如此。究其原因,是因为清理软件会根据TEMP环境变量来判断现有临时文件夹的...

MySQL 5.7 新特性大全和未来展望

本文转自微信公众号:高可用架构作者:杨尚刚引用美图公司数据库高级DBA,负责美图后端数据存储平台建设和架构设计。前新浪高级数据库工程师,负责新浪微博核心数据库架构改造优化,以及数据库相关的服务器存...

MySQL系列-源码编译安装(v8.0.25)

一、前言生产环境建议使用二进制安装法,其优点是部署简单、快速、方便,并且相对"yum/rpm安装"方法能更方便地自定义文件存放的目录结构,方便用脚本批量部署,方便日后运维管理。在生产...

MySQL如何实时同步数据到ES?试试这款阿里开源的神器!

前几天在网上冲浪的时候发现了一个比较成熟的开源中间件——Canal。在了解了它的工作原理和使用场景后,顿时产生了浓厚的兴趣。今天,就让我们跟随我的脚步,一起来揭开它神秘的面纱吧。简介canal翻译为...

技术老兵十年专攻MySQL:编写了763页核心总结,90%MySQL问题全解

MySQL是开放源码的关系数据库管理系统,由于性能高、成本低、可靠性好,成为现在最流行的开源数据库。MySQL学习指南笔记领取方式:关注、转发后私信小编【111】即可免费获得《MySQL进阶笔记》的...

Mysql和Hive之间通过Sqoop进行数据同步

文章回顾理论大数据框架原理简介大数据发展历程及技术选型实践搭建大数据运行环境之一搭建大数据运行环境之二本地MAC环境配置CPU数和内存大小查看CPU数sysctl machdep.cpu...