📜  Spring – REST 分页

📅  最后修改于: 2022-05-13 01:55:34.933000             🧑  作者: Mango

Spring – REST 分页

Spring Framework 构建在 servlet 之上。这个特殊的 Web 框架具有非常重要的功能,我们可以利用这些功能开发高效和有效的 Web 应用程序。在 Spring Framework 之上,Spring Boot 于 2014 年 4 月发布。Spring Boot 背后的主要目标是 Auto-Configuration 特性。 Spring MVC(模型视图控制器)是嵌入在 Spring 的“Web Starter”依赖项中的 Spring Framework 的子域或子项目。它用于开发 Web 应用程序。 Web Starter 还包含用于开发 REST API 的功能。我们使用它来返回数据或数据列表,而不是 HTML 页面。
从数据源检索的数据可能非常大,不方便列出所有数据,太直接了。可以通过多种方式控制检索或返回的数据。例如,为了限制实体或对象的返回、它们的排序方式等。在这里,分页开始起作用。

Spring - REST 分页

分页功能

  1. 将输出限制为相应的一组项目。
  2. 可以从一组项目遍历到另一组。
  3. 可以处理数据值的大偏移量。
  4. 可以订购输出。例如 - 根据某些属性升序或降序。

使用 Spring 的 REST API 进行分页

项目结构——Maven

A. 文件:pom.xml (应用程序的配置)

XML


    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.6.4
         
    
    sia
    GFG-Pagination
    0.0.1-SNAPSHOT
    GFG-Pagination
    GFG
    
        11
    
    
        
            org.springframework.boot
            spring-boot-starter-data-jpa
        
        
            org.springframework.boot
            spring-boot-starter-web
        
 
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            mysql
            mysql-connector-java
            runtime
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    
 
    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                        
                            org.projectlombok
                            lombok
                        
                    
                
            
        
    


Java
// Java Program to Illustrate Bootstrapping of Application
 
package gfg;
 
// Importing required classes
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
// Annotation
@SpringBootApplication
// Class
public class GfgPaginationApplication {
 
    // Main driver method
    public static void main(String[] args)
    {
        SpringApplication.run(
            GfgPaginationApplication.class, args);
    }
}


Java
// Java Program to Illustrate Model Data
 
package gfg;
 
// Importing required classes
import javax.persistence.Entity;
import javax.persistence.Id;
import lombok.Data;
import lombok.RequiredArgsConstructor;
 
// Annotation
@Data
@RequiredArgsConstructor
@Entity(name = "user")
// Class
public class UserEntity {
 
    @Id String user;
    String username;
    String password;
}


Java
// Java Program to Illustrate Data Repository
 
package gfg;
 
// Importing required classes
import org.springframework.data.jpa.repository.JpaRepository;
 
// Interface
public interface UserRepository
    extends JpaRepository {
}


Java
// Java Program to Illustrate REST API
 
package gfg;
 
// Importing required classes
import java.util.List;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
@RequestMapping("/get")
public class PagedRestController {
 
    // links automatically created repository bean in
    // Spring Application context
    @Autowired UserRepository data;
 
    @GetMapping("/page-One")
    public List getPageOne()
    {
 
        // First page with 5 items
        Pageable paging = PageRequest.of(
            0, 5, Sort.by("user").ascending());
        Page page = data.findAll(paging);
 
        // Retrieve the items
        return page.getContent();
    }
 
    @GetMapping("/page-Two")
    public List getPageTwo()
    {
 
        // Second page with another 5 items
        Pageable paging = PageRequest.of(
            1, 5, Sort.by("user").ascending());
        Page page = data.findAll(paging);
 
        // Retrieve the items
        return page.getContent();
    }
}


B. GfgPaginationApplication。Java

Java

// Java Program to Illustrate Bootstrapping of Application
 
package gfg;
 
// Importing required classes
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
// Annotation
@SpringBootApplication
// Class
public class GfgPaginationApplication {
 
    // Main driver method
    public static void main(String[] args)
    {
        SpringApplication.run(
            GfgPaginationApplication.class, args);
    }
}

C. application.properties(属性的配置)

  • 此文件包含构建 Datasource 对象所需的所有属性及其值。
  • Datasource 对象由“Spring Data JPA”依赖项提供。
  • Spring Data JPA 具有 Hibernate 的默认实现。
  • 该文件还包含一些 Hibernate 属性。
  • 然后 MySQL 驱动程序使用构建的 Datasource 对象连接到数据库。
  • 因此,我们也可以与各自的数据库进行交互。

MySQL数据库实体条目概述

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/userdetails
spring.datasource.username=root
spring.datasource.password=password
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

D. 用户实体。Java

此类映射到数据库中的表。

1.持久化注解:

  • @Entity – 它指定类是一个实体。 'name' 属性用于将类名映射到数据库中的表名(如果它们不相同)。
  • @Id - 它指定应用它的属性充当我们可以访问数据库的各个表的主键。

2.龙目岛注解

  • @Data - 它在运行时自动为所有字段生成 Getter 和 Setter 方法。
  • @RequiredArgsConstructor – 它为所有必需字段生成构造函数,即带有关键字 final 或 @NonNull 注释的字段。如果不存在此类字段,则创建零参数构造函数。这个注解是@Data 注解的一部分。

例子:

Java

// Java Program to Illustrate Model Data
 
package gfg;
 
// Importing required classes
import javax.persistence.Entity;
import javax.persistence.Id;
import lombok.Data;
import lombok.RequiredArgsConstructor;
 
// Annotation
@Data
@RequiredArgsConstructor
@Entity(name = "user")
// Class
public class UserEntity {
 
    @Id String user;
    String username;
    String password;
}

E. 文件:用户存储库。Java

  • 该接口用于处理数据库,无需编写繁琐的 JDBC( Java数据库连接)方法。
  • 此接口扩展了“接口 JpaRepository”,其中 T 是 Object 类型,ID 是主键的类型。
public interface PagingAndSortingRepository
extends CrudRepository

PagingAndSortingRepository 接口的方法如下:

Method

Description

Page findAll(Pageable pageable)Returns a Page of entities meeting the paging restriction provided in the Pageable object.
Iterable findAll(Sort sortReturns all entities sorted by the given options.

例子:

Java

// Java Program to Illustrate Data Repository
 
package gfg;
 
// Importing required classes
import org.springframework.data.jpa.repository.JpaRepository;
 
// Interface
public interface UserRepository
    extends JpaRepository {
}

F. 文件:PagedRestController。Java

  • 此控制器类返回一个 UserEntities 对象列表作为响应。
  • 在这里,使用 PageRequest.of() 工厂方法创建了一个 Pageable 对象。
  • 此方法接受 3 个参数:
  1. 一个相应的页数。
  2. 每页要检索的条目数。
  3. 排序技术。

Pageable 的这个对象被传递给 PagingAndSortingRepository 的 findAll() 方法,该方法接受相同的相应对象并返回一个 Page 对象。然后最终返回从 Page 对象中检索到的项目。

例子:

Java

// Java Program to Illustrate REST API
 
package gfg;
 
// Importing required classes
import java.util.List;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
@RequestMapping("/get")
public class PagedRestController {
 
    // links automatically created repository bean in
    // Spring Application context
    @Autowired UserRepository data;
 
    @GetMapping("/page-One")
    public List getPageOne()
    {
 
        // First page with 5 items
        Pageable paging = PageRequest.of(
            0, 5, Sort.by("user").ascending());
        Page page = data.findAll(paging);
 
        // Retrieve the items
        return page.getContent();
    }
 
    @GetMapping("/page-Two")
    public List getPageTwo()
    {
 
        // Second page with another 5 items
        Pageable paging = PageRequest.of(
            1, 5, Sort.by("user").ascending());
        Page page = data.findAll(paging);
 
        // Retrieve the items
        return page.getContent();
    }
}

输出 1:

第一页中的项目

输出 2:

第二页中的项目