Sprint Boot教程之五十:Spring Boot JpaRepository 示例

Spring Boot JpaRepository 示例

Spring Boot建立在 Spring 之上,包含 Spring 的所有功能。由于其快速的生产就绪环境,使开发人员能够直接专注于逻辑,而不必费力配置和设置,因此如今它正成为开发人员的最爱。Spring Boot 是一个基于微服务的框架,在其中创建生产就绪的应用程序只需很少的时间。以下是 Spring Boot 的一些功能:

  • 它可以避免 Spring 中繁重的 XML 配置。
  • 它提供了 REST 端点的轻松维护和创建。
  • 它包括一个嵌入式的 Tomcat 服务器。
  • 部署很简单,war和jar文件可以轻松地部署在Tomcat服务器中。

有关更多信息,请参阅本文:Spring Boot 简介。在本文中,我们将讨论如何使用JpaRepository来管理 Spring Boot 应用程序中的数据。

Jpa存储库

JpaRepository 是 Repository 的一个JPA(Java 持久性 API)特定扩展。它包含CrudRepository 和 PagingAndSortingRepository的完整 API 。因此,它包含用于基本 CRUD 操作的 API 以及用于分页和排序的 API。

句法:

复制代码
public interface JpaRepository<T,ID> 
extends PagingAndSortingRepository<T,ID>, QueryByExampleExecutor<T>  

这里:

  • T: 存储库管理的域类型(通常是实体/模型类名)
  • ID: 存储库管理的实体的 id 类型(通常是在实体/模型类中创建的 @Id 的包装类)

插图:

复制代码
public interface DepartmentRepository extends JpaRepository<Department, Long> {}

方法

JpaRepository 中的一些最重要的方法如下

方法 1:saveAll():

保存所有给定的实体。

句法:

复制代码
<S extends T> List<S> saveAll(Iterable<S> entities)

参数:实体,注意它们不能为空,也不能包含空。

返回类型:已保存的实体;永远不会为空。返回的 Iterable 将与作为参数传递的 Iterable 具有相同的大小。

**抛出异常:**如果给定的实体或其某个实体为空,则会抛出IllegalArgumentException 。

方法 2:getById():

返回具有给定标识符的实体的引用。根据 JPA 持久性提供程序的实现方式,这很可能始终返回一个实例并在首次访问时抛出 EntityNotFoundException。其中一些会立即拒绝无效标识符。

句法:

复制代码
T getById(ID id)

参数:id -- 不能为空。

**返回类型:**对具有给定标识符的实体的引用。

方法 3:flush():

刷新数据库中所有待处理的更改。

句法:

复制代码
void flush()
方法 4:saveAndFlush():

保存实体并立即刷新更改。

句法:

复制代码
<S extends T> S saveAndFlush(S entity)

**参数:**要保存的实体。不能为空。

返回类型:已保存的实体

方法 5:deleteAllInBatch():

批量删除给定实体,这意味着它将创建单个查询。此类操作会导致 JPA 一级缓存和数据库不同步。在调用此方法之前,请考虑刷新 EntityManager。

句法:

复制代码
 void deleteAllInBatch(Iterable<T> entities)

参数 **:**要删除的实体,不能为空。

实现:

让我们考虑一个使用 JpaRepository 管理 Department 实体的 Spring Boot 应用程序。数据保存在 H2 数据库中。我们使用 RESTful 控制器。

**步骤1:**使用IntelliJ IDEA创建Spring Boot项目,创建一个Spring Boot项目。

**第 2 步:**添加以下依赖项

  • Spring Web
  • H2 Database
  • Lombok
  • Spring Data JPA

示例:这是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">

<!-- Model version -->
<modelVersion>4.0.0</modelVersion>

<!-- Parent configuration for Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<!-- Project metadata -->
<groupId>com.amiya</groupId>
<artifactId>Spring-Boot-Demo-Project</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>Spring-Boot-Demo-Project</name>
<description>Demo project for Spring Boot</description>

<!-- Java version property -->
<properties>
<java.version>17</java.version>
</properties>

<!-- Dependencies required for the project -->
<dependencies>
<!-- Spring Boot Starter Web: To build web applications -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Spring Boot Starter Data JPA: To work with JPA for data access -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- Spring Boot Starter Validation: For Jakarta EE bean validation -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

<!-- H2 Database: In-memory database for development and testing -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

<!-- Lombok: To reduce boilerplate code in Java classes -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

<!-- Build configuration -->
<build>
<plugins>
<!-- Spring Boot Maven Plugin: To package the application as a jar/war -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<!-- Exclude Lombok from the final build -->
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

步骤 3:创建下面列出的 4 个包,并在这些包中创建一些类和接口,如下图所示

  • entity
  • repository
  • service
  • controller

注意

  • 绿色圆形图标"I"按钮是界面
  • 蓝色圆形图标"C"按钮属于类

**步骤 4:**实体包内部

在 Department.java 文件中创建一个简单的POJO 类。

package com.amiya.springbootdemoproject.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* Represents a Department entity in the application.
*/
@Entity
@Data // Generates getters, setters, toString, equals, and hashCode methods.
@NoArgsConstructor // Generates a no-args constructor.
@AllArgsConstructor // Generates a constructor with all arguments.
@Builder // Generates a builder pattern for creating instances.
public class Department {
@Id // Specifies the primary key of the entity.
@GeneratedValue(strategy = GenerationType.AUTO) // Auto-generates the primary key value.
private Long departmentId; // Unique identifier for the department.
private String departmentName; // Name of the department.
private String departmentAddress; // Address of the department.
private String departmentCode; // Code representing the department.
}

**步骤 5:**存储库包内部

创建一个简单的接口,并将该接口命名为 DepartmentRepository。正如我们上面讨论的那样,这个接口将扩展JpaRepository 。

例子:

// Java Program to Illustrate DepartmentRepository File

// Importing necessary packages
package com.amiya.springbootdemoproject.repository;

import com.amiya.springbootdemoproject.entity.Department;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

/**
* Repository interface for Department entity.
* Provides CRUD operations and custom query methods through JpaRepository.
*/
@Repository // Indicates that this interface is a Spring Data repository.
public interface DepartmentRepository extends JpaRepository<Department, Long> {}

**步骤 6:**服务包内

在包内创建一个名为DepartmentService 的 接口和一个名为DepartmentServiceImpl 的类。

示例 1-A:

// Java Program to Demonstrate DepartmentService File

// Importing required packages
package com.amiya.springbootdemoproject.service;

import com.amiya.springbootdemoproject.entity.Department;
import java.util.List;

/**
* Service interface for Department entity.
* Defines methods for CRUD operations and additional business logic.
*/
public interface DepartmentService {
/**
* Saves a department entity.
* @param department the department to save
* @return the saved department
*/
Department saveDepartment(Department department);

/**
* Fetches the list of all department entities.
* @return a list of departments
*/
List<Department> fetchDepartmentList();

/**
* Updates an existing department entity.
* @param department the department with updated information
* @param departmentId the ID of the department to update
* @return the updated department
*/
Department updateDepartment(Department department, Long departmentId);

/**
* Deletes a department entity by its ID.
* @param departmentId the ID of the department to delete
*/
void deleteDepartmentById(Long departmentId);
}

示例 1-B:

// Java Program to Illustrate DepartmentServiceImpl File

package com.amiya.springbootdemoproject.service;

import com.amiya.springbootdemoproject.entity.Department;
import com.amiya.springbootdemoproject.repository.DepartmentRepository;
import java.util.List;
import java.util.Objects;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
* Implementation of DepartmentService.
* Provides business logic for handling department-related operations.
*/
@Service // Marks this class as a Spring service component.
public class DepartmentServiceImpl implements DepartmentService {

@Autowired
private DepartmentRepository departmentRepository; // Injects the DepartmentRepository dependency.

@Override
public Department saveDepartment(Department department) {
// Saves and returns the department entity.
return departmentRepository.save(department);
}

@Override
public List<Department> fetchDepartmentList() {
// Retrieves and returns a list of all department entities.
return (List<Department>) departmentRepository.findAll();
}

@Override
public Department updateDepartment(Department department, Long departmentId) {
// Finds the existing department by ID.
Department depDB = departmentRepository.findById(departmentId).get();
// Updates fields if they are not null or empty.
if (Objects.nonNull(department.getDepartmentName()) && !"".equalsIgnoreCase(department.getDepartmentName())) {
depDB.setDepartmentName(department.getDepartmentName());
}
if (Objects.nonNull(department.getDepartmentAddress()) && !"".equalsIgnoreCase(department.getDepartmentAddress())) {
depDB.setDepartmentAddress(department.getDepartmentAddress());
}
if (Objects.nonNull(department.getDepartmentCode()) && !"".equalsIgnoreCase(department.getDepartmentCode())) {
depDB.setDepartmentCode(department.getDepartmentCode());
}
// Saves and returns the updated department entity.
return departmentRepository.save(depDB);
}

@Override
public void deleteDepartmentById(Long departmentId) {
// Deletes the department entity by its ID.
departmentRepository.deleteById(departmentId);
}
}

**步骤 7:**控制器包装内部

在包内创建一个名为DepartmentController 的类。

// Java Program to Demonstrate DepartmentController File

package com.amiya.springbootdemoproject.controller;

import com.amiya.springbootdemoproject.entity.Department;
import com.amiya.springbootdemoproject.service.DepartmentService;
import java.util.List;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
* REST controller for managing Department entities.
* Handles HTTP requests and routes them to the appropriate service methods.
*/
@RestController // Marks this class as a RESTful controller.
public class DepartmentController {

@Autowired
private DepartmentService departmentService; // Injects the DepartmentService dependency.

/**
* Handles POST requests to save a new department.
* @param department the department entity to be saved
* @return the saved department entity
*/
@PostMapping("/departments")
public Department saveDepartment(@Valid @RequestBody Department department) {
return departmentService.saveDepartment(department);
}

/**
* Handles GET requests to fetch the list of all departments.
* @return a list of department entities
*/
@GetMapping("/departments")
public List<Department> fetchDepartmentList() {
return departmentService.fetchDepartmentList();
}

/**
* Handles PUT requests to update an existing department.
* @param department the department entity with updated information
* @param departmentId the ID of the department to be updated
* @return the updated department entity
*/
@PutMapping("/departments/{id}")
public Department updateDepartment(@RequestBody Department department, @PathVariable("id") Long departmentId) {
return departmentService.updateDepartment(department, departmentId);
}

/**
* Handles DELETE requests to remove a department by ID.
* @param departmentId the ID of the department to be deleted
* @return a success message
*/
@DeleteMapping("/departments/{id}")
public String deleteDepartmentById(@PathVariable("id") Long departmentId) {
departmentService.deleteDepartmentById(departmentId);
return "Deleted Successfully";
}
}

**步骤 8:**下面是 application.properties 文件的代码

复制代码
server.port=8082

# H2 Database
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:dcbapp
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

现在运行您的应用程序,让我们在 Postman 中测试端点并参考我们的 H2 数据库。

在 Postman 中测试端点

端点 1: POST -- http://localhost:8082/departments/

端点 2: GET -- http://localhost:8082/departments/

端点 3: PUT -- http://localhost:8082/departments/1

**端点 4:**删除 -- http://localhost:8082/departments/1

H2数据库如下**:**

相关推荐
宸津-代码粉碎机10 小时前
Spring AI企业级实战|Agent长期记忆持久化落地,彻底解决多轮对话上下文丢失问题
java·开发语言·人工智能·后端·python·spring
Flittly10 小时前
【AgentScope Java新手村系列】(1)框架简介与环境搭建
java·spring boot·笔记·spring·ai
星辰徐哥19 小时前
Spring Boot 微服务架构设计与实现
spring boot·后端·微服务
星辰徐哥19 小时前
Spring Boot 数据导入导出与报表生成
spring boot·后端·ui
明夜之约19 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee19 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Micro麦可乐19 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
Jinkxs19 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
毕设源码_郑学姐19 小时前
计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
spring boot·后端·课程设计
辣机小司19 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录