Spring Boot CRUD 操作

什么是 CRUD 操作?

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

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

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

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

标准 CRUD 操作

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

CRUD 操作的工作原理

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

假设我们要创建一条新记录,我们应该使用 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 同时扩展了 CrudRepository 和 PagingAndSortingRepository。

例如:

public interface BookDAO extends JpaRepository   
{  
}  

0ff89b90c176dbb7200de292a500ef2.png

为什么要使用这些接口?

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

CrudRepository vs. JpaRepository

CrudRepositoryJpaRepository
CrudRepository 不提供分页和排序的任何方法。JpaRepository 扩展了 PagingAndSortingRepository。它提供了实现分页的所有方法。
它作为一个标记接口。JpaRepository 同时扩展了 CrudRepository 和 PagingAndSortingRepository。
它仅提供 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 JPA 和 H2 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/books 的 GET 请求。它会返回我们在数据库中插入的数据。

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技术