Spring boot教程-Spring Boot CRUD 操作
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 方法。
操作 | SQL | HTTP 动词 | RESTful Web 服务 |
---|---|---|---|
创建 | INSERT | PUT/POST | POST |
读取 | SELECT | GET | GET |
更新 | UPDATE | PUT/POST/PATCH | PUT |
删除 | DELETE | DELETE | DELETE |
Spring Boot CrudRepository
Spring Boot 提供了一个名为 CrudRepository 的接口,其中包含用于 CRUD 操作的方法。它定义在包 org.springframework.data.repository 中。它扩展了 Spring Data Repository 接口。它在仓库上提供了通用的 Crud 操作。如果我们想在应用程序中使用 CrudRepository,则必须创建一个接口并扩展 CrudRepository。
语法
- 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
{
}
为什么要使用这些接口?
- 这些接口允许 Spring 查找仓库接口并为其创建代理对象。
- 它提供了一些常见操作的方法。我们还可以定义自定义方法。
CrudRepository vs. JpaRepository
CrudRepository | JpaRepository |
---|---|
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 文件,并将其下载到本地系统。
步骤 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 控制台。
创建完所有的类和包后,项目目录看起来如下所示。
现在,我们将运行应用程序。
步骤 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 按钮,如下所示。
单击 Connect 按钮后,我们可以在数据库中看到 Books 表,如下所示。
步骤 17: 单击 Books 表,然后单击 Run 按钮。表格显示了我们在正文中插入的数据。
步骤 18: 打开 Postman 并发送一个带有 URL http://localhost:8080/books
的 GET 请求。它会返回我们在数据库中插入的数据。
让我们发送一个带有 URL http://localhost:8080/book/{bookid}
的 GET 请求。我们指定了 bookid 6830。它会返回 id 为 6830 的书籍详情。
类似地,我们还可以发送 DELETE 请求来删除记录。假设我们要删除 id 为 5433 的书籍记录。
选择 DELETE 方法,并调用 URL http://localhost:8080/book/5433
。然后再次在 H2 控制台中执行 Select 查询。我们可以看到 id 为 5433 的书籍已从数据库中删除。
类似地,我们还可以通过发送 PUT 请求来更新记录。让我们更新 id 为 6321 的书籍的价格。
- 选择 PUT
在请求正文中粘贴要更新的记录,并进行更改。在我们的情况下,我们要更新 id 为 6321 的书籍记录。在以下记录中,我们已更改了书籍的价格。
{ "bookid": "6321", "bookname": "Data Structures and Algorithms in Java", "author": "Robert Lafore", "price": "500" }
- 单击 Send
现在,切换到 H2 控制台,查看更改是否已反映。我们可以看到书籍的价格已更改,如下所示。
以上就是 Spring Boot CRUD 操作的完整示例。这个示例涵盖了创建、读取、更新和删除(CRUD)操作,并展示了如何使用 Spring Boot 和 Spring Data JPA 来实现这些操作。希望这个示例对你有所帮助!