Spring Boot CrudRepository 示例

本文详细介绍了SpringBoot的特性,如避免XML配置、简化REST端点创建及内置Tomcat服务器。重点讲解了如何利用CrudRepository进行CRUD操作,包括save、findById、findAll、count和deleteById等方法,并通过一个示例展示了如何在SpringBoot项目中集成H2数据库、创建实体、定义存储库接口、服务和控制器。

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

  • 它允许避免在 spring 中存在的 XML 的繁重配置
  • 它提供易于维护和创建 REST 端点
  • 它包括嵌入式 Tomcat 服务器
  • 部署非常简单,war和jar文件可以轻松部署在tomcat服务器中

更多信息请参考这篇文章:Spring Boot 简介。在本文中,我们将讨论如何使用 CrudRepository 来管理 Spring Boot 应用程序中的数据。

Crud存储库 

Spring Boot 中有一个名为 CrudRepository 的接口,其中包含用于 CRUD 操作的方法。它在存储库上提供通用的 Crud 操作。它在包org.springframework.data.repository中定义,它扩展了 Spring Data Repository接口。如果有人想在 Spring Boot 应用程序中使用 CrudRepository,他/她必须创建一个接口并扩展 CrudRepository 接口。 

句法: 

public interface CrudRepository<T, ID> extends Repository<T, ID>

在哪里:

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

插图:

public interface DepartmentRepository extends CrudRepository<Department, Long> {}

现在让我们讨论一下 CrudRepository 中可用的一些最重要的方法,如下所示:

方法一:save():保存给定的实体。使用返回的实例进行进一步的操作,因为保存操作可能已经完全改变了实体实例。

句法:

 <S extends T> S save(S entity)
  • 参数:实体——不能为空。
  • 返回:保存的实体;永远不会为空。
  • 抛出: IllegalArgumentException - 如果给定实体为空。

方法 2: findById():通过 id 检索实体。

句法:

Optional<T> findById(ID id)
  • 参数: id - 不能为空。
  • 返回:具有给定 id 的实体,如果没有找到,则返回 Optional#empty()。
  • 抛出异常:如果“id”为空,则抛出 IllegalArgumentException。

方法三:findAll():返回该类型的所有实例。

句法: 

Iterable<T> findAll()

返回类型:所有实体

方法四: count():返回可用实体的数量。

句法:

long count()

返回类型:实体的数量。

方法 5: deleteById(): 删除具有给定 id 的实体。

句法:

void deleteById(ID id)

参数:Id(不能为空)

抛出异常:如果给定的 id 为空,则发生IllegalArgumentException

例子

以下 Spring Boot 应用程序使用 CrudRepository 管理 Department 实体。数据保存在 H2 数据库中。我们使用 RESTful 控制器。

第一步:参考这篇文章如何使用 IntelliJ IDEA创建 Spring Boot 项目并创建一个 Spring Boot 项目。 

第二步:添加以下依赖

  • 春季网络
  • H2 数据库
  • 龙目岛
  • 春季数据 JPA

下面是pom.xml文件的完整代码。请检查您是否遗漏了什么。

  • XML

<?xml version="1.0" encoding="UTF-8"?>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <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>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
  
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
  
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
  
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
  
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
  
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
  
    </dependencies>
  
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
  
</project>

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

  • 实体
  • 存储库
  • 服务
  • 控制器

注意

  • 绿色圆形图标“I”按钮是界面
  • 蓝色圆形图标“C”按钮是类

第 4 步:在实体包内

在 Department.java 文件中创建一个简单的POJO 类。下面是Department.java文件的代码

  • 爪哇

package com.amiya.springbootdemoproject.entity;
  
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
  
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
  
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Department {
  
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long departmentId;
    private String departmentName;
    private String departmentAddress;
    private String departmentCode;
}

第 5 步:在存储库包中

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

  • 爪哇

// Java Program to Illustrate DepartmentRepository.java File
  
// Importing package module to this code
package com.amiya.springbootdemoproject.repository;
// Importing required classes
import com.amiya.springbootdemoproject.entity.Department;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
  
// Annotation
@Repository
  
// Class
public interface DepartmentRepository
    extends CrudRepository<Department, Long> {
}

第 6 步:在服务包内

在包中创建一个名为 DepartmentService 的接口一个名为DepartmentServiceImpl的类。下面是DepartmentService.java文件的代码。

示例 1-A

  • 爪哇

package com.amiya.springbootdemoproject.service;
  
import com.amiya.springbootdemoproject.entity.Department;
  
import java.util.List;
  
public interface DepartmentService {
    // save operation
    Department saveDepartment(Department department);
  
    // read operation
    List<Department> fetchDepartmentList();
  
    // update operation
    Department updateDepartment(Department department, Long departmentId);
  
    // delete operation
    void deleteDepartmentById(Long departmentId);
}

示例 1-B 

  • 爪哇

// Below is the code for the DepartmentServiceImpl.java file.
package com.amiya.springbootdemoproject.service;
  
import com.amiya.springbootdemoproject.entity.Department;
import com.amiya.springbootdemoproject.repository.DepartmentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
  
import java.util.List;
import java.util.Objects;
  
@Service
public class DepartmentServiceImpl implements DepartmentService{
  
    @Autowired
    private DepartmentRepository departmentRepository;
  
    // save operation
    @Override
    public Department saveDepartment(Department department) {
        return departmentRepository.save(department);
    }
  
    // read operation
    @Override
    public List<Department> fetchDepartmentList() {
        return (List<Department>) departmentRepository.findAll();
    }
  
    // update operation
    @Override
    public Department updateDepartment(Department department, Long departmentId) {
        Department depDB = departmentRepository.findById(departmentId).get();
  
        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());
        }
  
        return departmentRepository.save(depDB);
    }
  
    // delete operation
    @Override
    public void deleteDepartmentById(Long departmentId) {
        departmentRepository.deleteById(departmentId);
    }
  
}

第 7 步:在控制器包内

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

  • 爪哇

// Java Program to Illustrate DepartmentController File
  
// Importing package module
package com.amiya.springbootdemoproject.controller;
// Importing required classes
import com.amiya.springbootdemoproject.entity.Department;
import com.amiya.springbootdemoproject.service.DepartmentService;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
  
// Annotation
@RestController
  
// Class
public class DepartmentController {
  
    // Annotation
    @Autowired private DepartmentService departmentService;
  
    // Save operation
    @PostMapping("/departments")
    public Department saveDepartment(
        @Valid @RequestBody Department department)
    {
  
        return departmentService.saveDepartment(department);
    }
  
    // Read operation
    @GetMapping("/departments")
    public List<Department> fetchDepartmentList()
    {
  
        return departmentService.fetchDepartmentList();
    }
  
    // Update operation
    @PutMapping("/departments/{id}")
    public Department
    updateDepartment(@RequestBody Department department,
                     @PathVariable("id") Long departmentId)
    {
  
        return departmentService.updateDepartment(
            department, departmentId);
    }
  
    // Delete operation
    @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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值