CRUD 代表 创建,读取/检索,更新和 删除。这些是持久性存储的四个基本功能。
可以将CRUD操作定义为用户界面约定,该约定允许通过基于计算机的表单和报告查看,搜索和修改信息。 CRUD是面向数据的,是 HTTP动作动词的标准化用法。 HTTP有一些重要的动词。
POST: 创建新资源 GET: 读取资源 PUT: 更新现有资源 DELETE: 删除资源
在数据库中,这些操作中的每一个都直接映射到一系列命令。但是,它们与RESTful API的关系稍微复杂一些。
创建操作: 它执行INSERT语句以创建新记录。 读取操作: 它根据输入参数读取表记录。 更新操作: 它在表上执行一条update语句。它基于输入参数。 删除操作: 它将删除表中的指定行。它也基于输入参数。
CRUD操作是最动态的网站的基础。因此,我们应该将 CRUD 与 HTTP 动作动词区分开来。
假设我们要 创建一条新记录,我们应该使用HTTP操作动词 POST 。要 更新一条记录,我们应该使用 PUT 动词。同样,如果要 删除记录,则应使用 DELETE 动词。通过CRUD操作,用户和管理员有权在线检索,创建,编辑和删除记录。
我们有许多执行CRUD操作的选项。最有效的选择之一是在SQL中创建一组存储过程来执行操作。
CRUD操作引用关系数据库应用程序中实现的所有主要功能。 CRUD的每个字母都可以映射到SQL语句和HTTP方法。
操作 | SQL | HTTP动词 | RESTful Web服务 |
Create | INSERT | PUT/POST | POST |
Read | SELECT | GET | GET |
Update | UPDATE | PUT/POST/PATCH | PUT |
Delete | Delete | Delete | Delete |
Spring Boot提供了一个名为 CrudRepository 的接口,其中包含用于CRUD操作的方法。它在包 org.springframework.data.repository 中定义。它扩展了Spring Data 存储库界面。它在存储库上提供通用的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类型。
JpaRepository提供了与JPA相关的方法,例如刷新,持久性上下文,并批量删除了一条记录。它在包 org.springframework.data.jpa.repository中定义。 JpaRepository扩展了 CrudRepository 和 PagingAndSortingRepository。
例如:
public interface BookDAO extends JpaRepository { }
这些接口允许Spring查找存储库接口并为此创建代理对象。 它提供了允许我们执行一些常见操作的方法。我们还可以定义自定义方法。
CrudRepository | JpaRepository |
CrudRepository没有提供任何用于分页和排序的方法。 | JpaRepository扩展了PagingAndSortingRepository。它提供了实现分页的所有方法。 |
它用作标记界面。 | JpaRepository扩展了 CrudRepository 和 PagingAndSortingRepository 。 |
它仅提供CRUD功能。例如 findById(),findAll()等。 | 它提供了一些额外的方法以及PagingAndSortingRepository和CrudRepository的方法。例如, flush(),deleteInBatch()。 |
在不需要JpaRepository和PagingAndSortingRepository提供的功能时使用。 | 当我们要在应用程序中实现分页和排序功能时使用。 |
让我们设置一个Spring Boot应用程序并执行CRUD操作。
步骤1: 打开Spring Initializr http://start.spring.io 。
步骤2: 选择Spring Boot版本 2.3.0.M1。
步骤2: Group名称。我们提供了 com.nhooo。
步骤3: 提供 Artifact ID。我们提供了 spring-boot-crud-operation。
步骤5: 添加依赖项 Spring Web,Spring Data JPA,和 H2数据库。
步骤6: 单击 Generate (生成)按钮。当我们单击"生成"按钮时,它将规格包装在 Jar 文件中,并将其下载到本地系统。
步骤7: 提取 Jar文件并将其粘贴到STS工作区中。
步骤8: 将项目文件夹导入STS。
文件->导入->现有Maven项目->浏览->选择文件夹spring-boot-crud-operation->完成
导入需要一些时间。
步骤9: 在目录中创建名称为 com.nhooo.model 的程序包。文件夹 src/main/java。
步骤10: 在包 com.nhooo.model中创建类。 我们创建了一个名为 Books的类。 在"图书"类中,我们执行了以下操作:
定义四个变量 bookid, bookname, author,和 生成Getter和Setters。
右键单击文件-> Source-> Generate Getters和Setters。 使用注解 @Entity将类标记为Entity。 使用注解 @Table,将该类标记为 Table 名称。 通过使用注解 @Column 将每个变量定义为 Column 。
Books.java
package com.nhooo.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; } }
步骤11: 在 src/main/java文件夹中创建一个名称为 com.nhooo.controller 的包。
步骤12: 在包 com.nhooo.controller中创建一个Controller类。 我们创建了一个名为 BooksController的控制器类。 在BooksController类中,我们完成了以下操作:
使用注解 @RestController将类标记为 RestController 。 使用注解 @Autowired 自动注解 BooksService 类。 定义以下方法: getAllBooks(): 。它返回所有书籍的列表。 getBooks(): 它返回我们在path变量中指定的书籍详细信息。通过使用注解@PathVariable,我们已将bookid作为参数传递。注解指示方法参数应绑定到URI模板变量。 deleteeBook(): 它将删除我们在path变量中指定的特定书籍。 saveBook(): 保存图书详细信息。注解@RequestBody表示应将方法参数绑定到Web请求的正文。 update(): 该方法更新一条记录。我们必须在正文中指定要更新的记录吃了为了达到相同的目的,我们使用了@RequestBody注解。
BooksController.java
package com.nhooo.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 com.nhooo.model.Books; import com.nhooo.service.BooksService; //将类标记为 Controller @RestController public class BooksController { //自动装配BooksService类 @Autowired BooksService booksService; //创建从数据库检索所有图书详细信息的get映射 @GetMapping("/book") private List<Books> getAllBooks() { return booksService.getAllBooks(); } //创建检索特定书籍详细信息的get映射 @GetMapping("/book/{bookid}") private Books getBooks(@PathVariable("bookid") int bookid) { return booksService.getBooksById(bookid); } //创建删除映射,删除指定的书 @DeleteMapping("/book/{bookid}") private void deleteBook(@PathVariable("bookid") int bookid) { booksService.delete(bookid); } //创建在数据库中发布书籍详细信息的post映射 @PostMapping("/books") private int saveBook(@RequestBody Books books) { booksService.saveOrUpdate(books); return books.getBookid(); } //创建更新图书详细信息的put映射 @PutMapping("/books") private Books update(@RequestBody Books books) { booksService.saveOrUpdate(books); return books; } }
步骤13: 在文件夹 src/main/java中创建一个名称为 com.nhooo.service 的包。
步骤14: 创建一个 Service 类。我们在包 com.nhooo.service中创建了一个名为 BooksService 的服务类。
BooksService.java
package com.nhooo.service; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.nhooo.model.Books; import com.nhooo.repository.BooksRepository; //定义业务逻辑 @Service public class BooksService { @Autowired BooksRepository booksRepository; //使用 cruddrepository 的 findaAll ()方法获取所有书籍记录 public List<Books> getAllBooks() { List<Books> books = new ArrayList<Books>(); booksRepository.findAll().forEach(books1 -> books.add(books1)); return books; } //通过使用 cruddrepository 的 findById ()方法获取特定的记录 public Books getBooksById(int id) { return booksRepository.findById(id).get(); } //使用CrudRepository的save()方法保存特定记录 public void saveOrUpdate(Books books) { booksRepository.save(books); } //使用CrudRepository的deleteById()方法删除特定记录 public void delete(int id) { booksRepository.deleteById(id); } //更新记录 public void update(Books books, int bookid) { booksRepository.save(books); } }
步骤15: 在文件夹 src/main/java中创建一个名称为 com.nhooo.repository 的包。
第16步: 创建一个 存储库界面。我们在包 com.nhooo.repository中创建了一个名为 BooksRepository 的存储库接口。 它扩展了 Crud存储库界面。
BooksRepository.java
package com.nhooo.repository; import org.springframework.data.repository.CrudRepository; import com.nhooo.model.Books; //repository that extends CrudRepository public interface BooksRepository extends CrudRepository<Books, Integer> { }
现在,我们将在 application.properties 文件中配置数据源 URL,驱动程序类名称,用户名和 密码。
步骤17: 打开 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 consolespring.h2.console.enabled=true
创建所有类和包之后,项目目录如下所示。
现在我们将运行该应用程序。
步骤18: 打开 SpringBootCrudOperationApplication.java 文件并作为Java应用程序运行。
SpringBootCrudOperationApplication.java
package com.nhooo; 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); } }
步骤19: 打开 Postman并执行以下操作:
选择 POST 调用URL http://localhost:8080/books。 选择Body 选择内容类型 JSON(application/json)。 插入数据。我们已在主体中插入以下数据:
{ "bookid": "5433", "bookname": "Core and Advance Java", "author": "R. Nageswara Rao", "price": "800" }
点击发送
请求成功执行后,它会显示 状态: 200 OK 。这意味着记录已成功插入数据库中。
类似地,我们插入了以下数据。
{"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控制台以查看数据。
步骤20: 打开浏览器并调用URL http://localhost:8080/h2-console。单击 Connect 按钮,如下所示。
单击 连接按钮后,我们将在数据库中看到 Books 表,如下所示。
步骤21: 单击 Books 表,然后然后点击 运行按钮。该表显示了我们插入到正文中的数据。
步骤22: 打开 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/书/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" }
点击发送
现在,移至H2控制台,查看更改是否已反映。我们看到这本书的价格已更改,如下所示。