Spring Boot CRUD 操作

什么是 CRUD 操作?

CRUD 代表 创建 (Create)、读取/检索 (Read/Retrieve)、更新 (Update)删除 (Delete)。这些是持久性存储的四个基本功能。

CRUD 操作可以定义为用户界面约定,通过基于计算机的表单和报表查看、搜索和修改信息。CRUD 是面向数据的,并且使用标准化的 HTTP 动作动词。HTTP 具有一些重要的动词。

  • POST: 创建新资源
  • GET: 读取资源
  • PUT: 更新现有资源
  • DELETE: 删除资源

在数据库内,每个操作都直接映射到一系列命令。但是,它们与 RESTful API 的关系稍微复杂一些。

标准 CRUD 操作

  • 创建操作: 执行 INSERT 语句以创建新记录。
  • 读取操作: 根据输入参数读取表记录。
  • 更新操作: 在表上执行更新语句。它基于输入参数。
  • 删除操作: 删除表中的指定行。它也基于输入参数。

CRUD 操作的工作原理

CRUD 操作是大多数动态网站的基础。因此,我们应该区分 CRUDHTTP 动作动词

假设我们要创建一条新记录,我们应该使用 HTTP 动作动词 POST。要更新一条记录,我们应该使用 PUT 动词。类似地,如果我们要删除一条记录,我们应该使用 DELETE 动词。通过 CRUD 操作,用户和管理员有权在线检索、创建、编辑和删除记录。

我们有许多执行 CRUD 操作的选项。最有效的选择之一是在 SQL 中创建一组存储过程来执行操作。

CRUD 操作是关系型数据库应用程序中实施的所有主要功能。CRUD 的每个字母都可以映射到 SQL 语句和 HTTP 方法。

操作SQLHTTP 动词RESTful Web 服务
创建INSERTPUT/POSTPOST
读取SELECTGETGET
更新UPDATEPUT/POST/PATCHPUT
删除DELETEDELETEDELETE

Spring Boot CrudRepository

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

语法

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

其中,

  • T 是仓库管理的域类型。
  • ID 是仓库管理的实体的 id 的类型。

例如:

public interface StudentRepository extends CrudRepository<Student, Integer>  
{  
}  

在上面的示例中,我们创建了一个名为 StudentRepository 的接口,它扩展了 CrudRepository。其中 Student 是要管理的仓库,Integer 是在 Student 仓库中定义的 Id 类型。

Spring Boot JpaRepository

JpaRepository 提供与 JPA 相关的方法,如刷新、持久性上下文和批量删除记录。它定义在包 org.springframework.data.jpa.repository 中。JpaRepository 同时扩展了 CrudRepositoryPagingAndSortingRepository

例如:

public interface BookDAO extends JpaRepository   
{  
}  

0ff89b90c176dbb7200de292a500ef2.png

为什么要使用这些接口?

  • 这些接口允许 Spring 查找仓库接口并为其创建代理对象。
  • 它提供了一些常见操作的方法。我们还可以定义自定义方法。

CrudRepository vs. JpaRepository

CrudRepositoryJpaRepository
CrudRepository 不提供分页和排序的任何方法。JpaRepository 扩展了 PagingAndSortingRepository。它提供了实现分页的所有方法。
它作为一个标记接口。JpaRepository 同时扩展了 CrudRepositoryPagingAndSortingRepository
它仅提供 CRUD 功能。例如 findById()、findAll() 等。它提供了一些额外的方法,还包括了 PagingAndSortingRepository 和 CrudRepository 的方法。例如 flush()、deleteInBatch()
当不需要 JpaRepository 和 PagingAndSortingRepository 提供的功能时使用。当我们希望在应用程序中实现分页和排序功能时使用。

Spring Boot CRUD 操作示例

让我们设置一个 Spring Boot 应用程序并执行 CRUD 操作。

步骤 1: 打开 Spring Initializr [http://start.spring.io](http://start.spring.io/)

步骤 2: 选择 Spring Boot 版本 2.3.0.M1

步骤 3: 提供 Group 名称。我们提供了 cn.javatiku

步骤 4: 提供 Artifact Id。我们提供了 spring-boot-crud-operation

步骤 5: 添加依赖项 Spring Web、Spring Data JPAH2 Database

步骤 6: 点击 Generate 按钮。当我们点击 Generate 按钮时,它会将规格包装成一个 Jar 文件,并将其下载到本地系统。

03b51a79c23a5698c047623c4c1b076.png

步骤 7: 提取 Jar 文件并将其粘贴到 STS 工作区。

步骤 8: 将项目文件夹导入到 STS 中。

文件 -> 导入 -> 存在的 Maven 项目 -> 浏览 -> 选择文件夹 spring-boot-crud-operation -> 完成

导入需要一些时间。

步骤 9: 在包 cn.javatiku.model 中创建一个模型类。我们创建了一个名为 Books 的模型类。在 Books 类中,我们做了以下操作:

  • 通过使用注解 @Entity 将类标记为实体。
  • 通过使用注解 @Table 将类标记为表名。
  • 通过使用注解 @Column 将每个变量标记为列。

Books.java

package cn.javatiku.model;  
import javax.persistence.Column;  
import javax.persistence.Entity;  
import javax.persistence.Id;  
import javax.persistence.Table;  
//mark class as an Entity   
@Entity  
//defining class name as Table name  
@Table  
public class Books  
{  
//Defining book id as primary key  
@Id  
@Column  
private int bookid;  
@Column  
private String bookname;  
@Column  
private String author;  
@Column  
private int price;  
public int getBookid()   
{  
return bookid;  
}  
public void setBookid(int bookid)   
{  
this.bookid = bookid;  
}  
public String getBookname()  
{  
return bookname;  
}  
public void setBookname(String bookname)   
{  
this.bookname = bookname;  
}  
public String getAuthor()   
{  
return author;  
}  
public void setAuthor(String author)   
{  
this.author = author;  
}  
public int getPrice()   
{  
return price;  
}  
public void setPrice(int price)   
{  
this.price = price;  
}  
}  

步骤 10: 在包 cn.javatiku.controller 中创建一个控制器类。我们创建了一个名为 BooksController 的控制器类。在 BooksController 类中,我们做了以下操作:

  • 通过使用注解 @RestController 将类标记为控制器。
  • 使用注解 @Autowired 自动装配 BooksService 类。
  • 定义了以下方法:

    • getAllBooks(): 返回所有书籍的列表。
    • getBooks(): 返回指定路径变量中指定的书籍详情。我们使用注解 @PathVariable 传递了 bookid 参数。此注解表示方法参数应绑定到 URI 模板变量。
    • deleteBook(): 删除指定路径变量中指定的书籍。
    • saveBook(): 保存书籍详情。注解 @RequestBody 表示方法参数应绑定到 Web 请求的主体。
    • update(): 更新记录。我们必须在请求主体中指定要更新的记录。为了实现这一点,我们使用了注解 @RequestBody。

BooksController.java

package cn.javatiku.controller;  
import java.util.List;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.DeleteMapping;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.PathVariable;  
import org.springframework.web.bind.annotation.PostMapping;  
import org.springframework.web.bind.annotation.PutMapping;  
import org.springframework.web.bind.annotation.RequestBody;  
import org.springframework.web.bind.annotation.RestController;  
import cn.javatiku.model.Books;  
import cn.javatiku.service.BooksService;  
//mark class as Controller  
@RestController  
public class BooksController   
{  
//autowire the BooksService class  
@Autowired  
BooksService booksService;  
//creating a get mapping that retrieves all the books detail from the database   
@GetMapping("/book")  
private List<Books> getAllBooks()   
{  
return booksService.getAllBooks();  
}  
//creating a get mapping that retrieves the detail of a specific book  
@GetMapping("/book/{bookid}")  
private Books getBooks(@PathVariable("bookid") int bookid)   
{  
return booksService.getBooksById(bookid);  
}  
//creating a delete mapping that deletes a specified book  
@DeleteMapping("/book/{bookid}")  
private void deleteBook(@PathVariable("bookid") int bookid)   
{  
booksService.delete(bookid);  
}  
//creating post mapping that post the book detail in the database  
@PostMapping("/books")  
private int saveBook(@RequestBody Books books)   
{  
booksService.saveOrUpdate(books);  
return books.getBookid();  
}  
//creating put mapping that updates the book detail   
@PutMapping("/books")  
private Books update(@RequestBody Books books)   
{  
booksService.saveOrUpdate(books);  
return books;  
}  
}  

步骤 11: 在包 cn.javatiku.service 中创建一个 Service 类。我们在包 cn.javatiku.service 中创建了一个名为 BooksService 的服务类。

BooksService.java

package cn.javatiku.service;  
import java.util.ArrayList;  
import java.util.List;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Service;  
import cn.javatiku.model.Books;  
import cn.javatiku.repository.BooksRepository;  
//defining the business logic  
@Service  
public class BooksService   
{  
@Autowired  
BooksRepository booksRepository;  
//getting all books record by using the method findaAll() of CrudRepository  
public List<Books> getAllBooks()   
{  
List<Books> books = new ArrayList<Books>();  
booksRepository.findAll().forEach(books1 -> books.add(books1));  
return books;  
}  
//getting a specific record by using the method findById() of CrudRepository  
public Books getBooksById(int id)   
{  
return booksRepository.findById(id).get();  
}  
//saving a specific record by using the method save() of CrudRepository  
public void saveOrUpdate(Books books)   
{  
booksRepository.save(books);  
}  
//deleting a specific record by using the method deleteById() of CrudRepository  
public void delete(int id)   
{  
booksRepository.deleteById(id);  
}  
//updating a record  
public void update(Books books, int bookid)   
{  
booksRepository.save(books);  
}  
}  

步骤 12: 在包 cn.javatiku.repository 中创建一个 Repository 接口。我们在包 cn.javatiku.repository 中创建了一个名为 BooksRepository 的仓库接口。它扩展了 Crud Repository 接口。

BooksRepository.java

package cn.javatiku.repository;  
import org.springframework.data.repository.CrudRepository;  
import cn.javatiku.model.Books;  
//repository that extends CrudRepository  
public interface BooksRepository extends CrudRepository<Books, Integer>  
{  
}  

现在,我们将在 application.properties 文件中配置数据源的 URL、驱动程序类名称、用户名密码

步骤 13: 打开 application.properties 文件并配置以下属性。

application.properties

`spring.datasource.url=jdbc:h2:mem:books_data
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

enabling the H2 console

spring.h2.console.enabled=true`

注意:不要忘记启用 H2 控制台。

创建完所有的类和包后,项目目录看起来如下所示。

d96413f045aa52c6328dcb9e1aa11b9.png

现在,我们将运行应用程序。

步骤 14: 打开 SpringBootCrudOperationApplication.java 文件,并将其作为 Java 应用程序运行。

SpringBootCrudOperationApplication.java

package cn.javatiku;  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
@SpringBootApplication  
public class SpringBootCrudOperationApplication   
{  
public static void main(String[] args)   
{  
SpringApplication.run(SpringBootCrudOperationApplication.class, args);  
}  
}  

注意:在下一步中,我们将使用 REST 客户端 Postman。因此,请确保您的系统中已经安装了 Postman 应用程序。

步骤 15: 打开 Postman 并执行以下操作:

  • 选择 POST
  • 调用 URL http://localhost:8080/books
  • 选择 Body
  • 选择内容类型 JSON (application/json)
  • 在正文中插入数据。我们在正文中插入了以下数据:

    {  
        "bookid": "5433",  
        "bookname": "Core and Advance Java",  
        "author": "R. Nageswara Rao",  
        "price": "800"  
    }
    
{  
    "bookid": "0982",  
    "bookname": "Programming with Java",  
    "author": "E. Balagurusamy",  
    "price": "350"  
} 
{  
    "bookid": "6321",  
    "bookname": "Data Structures and Algorithms in Java",  
    "author": "Robert Lafore",  
    "price": "590"  
}  
{  
    "bookid": "5433",  
    "bookname": "Effective Java",  
    "author": "Joshua Bloch",  
    "price": "670"  
}`  

让我们访问 H2 控制台以查看数据。

步骤 16: 打开浏览器并调用 URL http://localhost:8080/h2-console。单击 Connect 按钮,如下所示。

d3564241257af7bcbc1148627984ae1.png

单击 Connect 按钮后,我们可以在数据库中看到 Books 表,如下所示。

a89101703bbed0b69418064fad4f7fe.png

步骤 17: 单击 Books 表,然后单击 Run 按钮。表格显示了我们在正文中插入的数据。

4a03b1b2e8bd7f5e04b2f3bd5fbc769.png

步骤 18: 打开 Postman 并发送一个带有 URL http://localhost:8080/booksGET 请求。它会返回我们在数据库中插入的数据。

418827fc24523aac71c6f84462005cf.png

让我们发送一个带有 URL http://localhost:8080/book/{bookid}GET 请求。我们指定了 bookid 6830。它会返回 id 为 6830 的书籍详情。

6d572668a7f0cb908a1182ed44d24dc.png

类似地,我们还可以发送 DELETE 请求来删除记录。假设我们要删除 id 为 5433 的书籍记录。

选择 DELETE 方法,并调用 URL http://localhost:8080/book/5433。然后再次在 H2 控制台中执行 Select 查询。我们可以看到 id 为 5433 的书籍已从数据库中删除。

cfd97249bb1062bc89219f23149480e.png

类似地,我们还可以通过发送 PUT 请求来更新记录。让我们更新 id 为 6321 的书籍的价格。

  • 选择 PUT
  • 在请求正文中粘贴要更新的记录,并进行更改。在我们的情况下,我们要更新 id 为 6321 的书籍记录。在以下记录中,我们已更改了书籍的价格。

    {  
        "bookid": "6321",  
        "bookname": "Data Structures and Algorithms in Java",  
        "author": "Robert Lafore",  
        "price": "500"  
    }
    
  • 单击 Send

现在,切换到 H2 控制台,查看更改是否已反映。我们可以看到书籍的价格已更改,如下所示。

437e37e9ccb7e68a00659529706b177.png

以上就是 Spring Boot CRUD 操作的完整示例。这个示例涵盖了创建、读取、更新和删除(CRUD)操作,并展示了如何使用 Spring Boot 和 Spring Data JPA 来实现这些操作。希望这个示例对你有所帮助!

标签: spring, Spring教程, Spring语言学习, Spring框架, Spring框架教程, Spring框架高级教程, spring boot, spring boot入门教程, spring boot学习教程, spring boot下载, spring boot框架入门, spring boot面试题, spring boot笔试题, spring boot学习指南, spring boot技术