如何使用 Spring Boot 实现分页和排序?

全文目录:

    • 开篇语
      • [1. 创建 Spring Boot 项目](#1. 创建 Spring Boot 项目)
      • [2. 配置数据库连接](#2. 配置数据库连接)
      • [3. 创建实体类](#3. 创建实体类)
      • [4. 创建 Repository 接口](#4. 创建 Repository 接口)
      • [5. 创建分页和排序服务](#5. 创建分页和排序服务)
      • [6. 创建控制器](#6. 创建控制器)
      • [7. 测试分页和排序](#7. 测试分页和排序)
      • [8. 总结](#8. 总结)
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

在 Spring Boot 中,实现分页和排序是通过 Spring Data JPA 提供的 PageableSort 接口来完成的。Spring Data JPA 是 Spring 生态系统的一部分,它可以轻松地与数据库交互,并且支持分页和排序功能。本文将详细介绍如何在 Spring Boot 项目中实现分页和排序。

1. 创建 Spring Boot 项目

首先,你需要创建一个 Spring Boot 项目,确保引入了 Spring Data JPA 相关的依赖。可以通过以下方式添加 Maven 依赖:

xml 复制代码
<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- Spring Boot Starter Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- H2 Database (作为示例数据库) -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Spring Boot Starter Test -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
</dependencies>

2. 配置数据库连接

application.properties 中配置数据库连接(此处使用的是 H2 内存数据库作为例子):

properties 复制代码
# H2 Database 配置
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true

# Hibernate 配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

3. 创建实体类

假设我们要管理一个简单的 Employee 实体。我们可以创建一个 Employee 类,并为它添加必要的 JPA 注解。

java 复制代码
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Employee {

    @Id
    private Long id;
    private String name;
    private String department;

    // Getters and Setters

    public Employee(Long id, String name, String department) {
        this.id = id;
        this.name = name;
        this.department = department;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }
}

4. 创建 Repository 接口

接下来,我们需要创建一个 EmployeeRepository 接口,继承 JpaRepositoryPagingAndSortingRepository,这样就可以轻松实现分页和排序功能。

java 复制代码
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.PagingAndSortingRepository;

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Long> {
}

PagingAndSortingRepository 提供了许多方便的分页和排序方法,如 findAll(Pageable pageable)

5. 创建分页和排序服务

接下来,我们创建一个服务层 EmployeeService,其中包含分页和排序的方法。Pageable 用于分页,Sort 用于排序。

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;

@Service
public class EmployeeService {

    @Autowired
    private EmployeeRepository employeeRepository;

    // 获取分页和排序的员工列表
    public Page<Employee> getEmployees(int page, int size, String sortBy, String direction) {
        Pageable pageable;
        
        // 根据请求的排序方向选择排序方式
        if ("desc".equalsIgnoreCase(direction)) {
            pageable = PageRequest.of(page, size, Sort.by(Sort.Order.desc(sortBy)));
        } else {
            pageable = PageRequest.of(page, size, Sort.by(Sort.Order.asc(sortBy)));
        }

        return employeeRepository.findAll(pageable);
    }
}

6. 创建控制器

我们可以创建一个 REST 控制器来处理分页和排序请求,向客户端返回分页结果。

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    @GetMapping("/employees")
    public Page<Employee> getEmployees(
            @RequestParam int page,
            @RequestParam int size,
            @RequestParam String sortBy,
            @RequestParam String direction) {
        return employeeService.getEmployees(page, size, sortBy, direction);
    }
}

7. 测试分页和排序

现在,你可以通过以下 API 请求来测试分页和排序功能:

请求示例:
  • URL : http://localhost:8080/employees?page=0&size=5&sortBy=name&direction=asc
    • page: 当前页码(从 0 开始)。
    • size: 每页的大小。
    • sortBy: 排序字段(如 name)。
    • direction: 排序方向(ascdesc)。
返回结果:
json 复制代码
{
  "content": [
    {
      "id": 1,
      "name": "Alice",
      "department": "HR"
    },
    {
      "id": 2,
      "name": "Bob",
      "department": "Engineering"
    },
    ...
  ],
  "pageable": {
    "sort": {
      "unsorted": false,
      "sorted": true,
      "empty": false
    },
    "offset": 0,
    "pageSize": 5,
    "pageNumber": 0,
    "paged": true,
    "unpaged": false
  },
  "totalElements": 100,
  "totalPages": 20,
  "last": false,
  "size": 5,
  "number": 0,
  "sort": {
    "sorted": true,
    "unsorted": false,
    "empty": false
  },
  "first": true,
  "numberOfElements": 5,
  "empty": false
}

在这个例子中,content 中是当前页的数据,totalElements 表示数据的总条数,totalPages 表示总页数,number 表示当前页码。

8. 总结

通过 Spring Data JPA 提供的 PagingAndSortingRepositoryPageableSort 接口,我们可以非常方便地实现分页和排序功能。Spring Boot 让分页和排序操作变得更加简洁和高效,减少了开发中的繁琐代码。

  • Pageable 主要用于分页,PageRequest.of(page, size, sort) 可以创建分页请求。
  • Sort 主要用于排序,Sort.by(Sort.Order.asc("name")) 用于指定排序字段和排序方式。
  • 使用 findAll(Pageable pageable) 方法可以轻松获取分页数据。

这种方式使得我们能够在 Spring Boot 项目中非常便捷地实现数据的分页查询和排序功能。

... ...

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

相关推荐
TDengine (老段)7 分钟前
TDengine 语言连接器(Go)
大数据·数据库·物联网·golang·时序数据库·tdengine·iotdb
加油,旭杏7 分钟前
【Redis】数据结构和内部编码
数据库·redis·缓存
JZC_xiaozhong10 分钟前
制造企业如何通过实现数据统一?
大数据·spring boot·后端·制造·mdm·主数据管理·数据集成与应用集成
极限实验室10 分钟前
Easysearch 自动备份:快照生命周期管理
数据库
uhakadotcom43 分钟前
Python中orjson、json、json5三大JSON库简单对比与实用教程
后端·面试·github
怒放的生命.1 小时前
《MySQL从入门到精通》
android·数据库·mysql
南雨北斗1 小时前
Docker部署的优缺点
后端
嶂蘅1 小时前
OK!用大白话说清楚设计模式(二)
前端·后端·面试
你们补药再卷啦2 小时前
newbee商城购物车模块mapper.xml
java·数据库·sql
AronTing2 小时前
03-Spring Cloud Gateway 深度解析:从核心原理到生产级网关实践
后端·面试·架构