📜  Spring Boot CRUD操作

📅  最后修改于: 2021-01-11 05:35:46             🧑  作者: Mango

Spring Boot CRUD操作

什么是CRUD操作?

CRUD代表创建,读取/检索,更新删除。这些是持久性存储的四个基本功能。

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

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

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

标准CRUD操作

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

CRUD运作方式

CRUD操作是最具活力的网站的基础。因此,我们应该将CRUDHTTP操作动词区分开。

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

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

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

Operation SQL HTTP verbs RESTful Web Service
Create INSERT PUT/POST POST
Read SELECT GET GET
Update UPDATE PUT/POST/PATCH PUT
Delete DELETE DELETE DELETE

Spring Boot Crud存储库

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

句法

public interface CrudRepository extends Repository

哪里,

  • T是存储库管理的域类型。
  • ID是存储库管理的实体的ID的类型。

例如:

public interface StudentRepository extends CrudRepository
{
}

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

Spring Boot Jpa储存库

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

例如:

public interface BookDAO extends JpaRepository 
{
}

为什么要使用这些接口?

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

CrudRepository与JpaRepository

CrudRepository JpaRepository
CrudRepository does not provide any method for pagination and sorting. JpaRepository extends PagingAndSortingRepository. It provides all the methods for implementing the pagination.
It works as a marker interface. JpaRepository extends both CrudRepository and PagingAndSortingRepository.
It provides CRUD function only. For example findById(), findAll(), etc. It provides some extra methods along with the method of PagingAndSortingRepository and CrudRepository. For example, flush(), deleteInBatch().
It is used when we do not need the functions provided by JpaRepository and PagingAndSortingRepository. It is used when we want to implement pagination and sorting functionality in an application.

Spring Boot CRUD操作示例

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

步骤1:打开Spring Initializr http://start.spring.io

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

步骤2:提供群组名称。我们提供了com.javatpoint。

第3步:提供工件ID。我们提供了spring-boot-crud-operation。

步骤5:添加依赖项Spring Web,Spring Data JPAH2数据库。

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

步骤7:解压缩Jar文件并将其粘贴到STS工作区中。

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

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

导入需要一些时间。

步骤9:在src / main / java文件夹中创建一个名称为com.javatpoint.model的包。

步骤10:在包com.javatpoint.model中创建一个模型类。我们创建了一个名为Books的模型类。在Books类中,我们完成了以下操作:

  • 定义四个变量bookid,bookname,author
  • 生成Getter和Setter。右键单击文件->源->生成Getter和Setter。
  • 使用注释@Entity将类标记为Entity。
  • 使用注解@Table将类标记为表名称。
  • 使用注释@Column将每个变量定义为Column。

Books.java

package com.javatpoint.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.javatpoint.controller的包。

步骤12:在包com.javatpoint.controller中创建一个Controller类。我们创建了一个名为BooksController的控制器类。在BooksController类中,我们执行了以下操作:

  • 通过使用注释@RestController类标记为RestController。
  • 通过使用注释@Autowired自动连接BooksService类。
  • 定义以下方法:
    • getAllBooks():返回所有书籍的列表。
    • getBooks():它返回我们在path变量中指定的书籍详细信息。通过使用注释@PathVariable,我们已将bookid作为参数传递。注释指示方法参数应绑定到URI模板变量。
    • deleteBook():它将删除我们在path变量中指定的特定书籍。
    • saveBook():保存书籍详细信息。注释@RequestBody指示应将方法参数绑定到Web请求的正文。
    • update():该方法更新一条记录。我们必须在主体中指定要更新的记录。为了达到相同目的,我们使用了@RequestBody注释。

BooksController.java

package com.javatpoint.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.javatpoint.model.Books;
import com.javatpoint.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 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;
}
}

步骤13:在src / main / java文件夹中创建一个名称为com.javatpoint.service的软件包。

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

BooksService.java

package com.javatpoint.service;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.javatpoint.model.Books;
import com.javatpoint.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 getAllBooks() 
{
List books = new ArrayList();
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);
}
}

步骤15:在src / main / java文件夹中创建一个名称为com.javatpoint.repository的包。

步骤16:创建一个Repository接口。我们在com.javatpoint.repository包中创建了一个名为BooksRepository的存储库接口。它扩展了Crud Repository接口。

BooksRepository.java

package com.javatpoint.repository;
import org.springframework.data.repository.CrudRepository;
import com.javatpoint.model.Books;
//repository that extends CrudRepository
public interface BooksRepository extends CrudRepository
{
}

现在,我们将在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 console
spring.h2.console.enabled=true

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

创建所有类和包之后,项目目录如下所示。

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

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

SpringBootCrudOperationApplication.java

package com.javatpoint;
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 Client Postman。因此,请确保您的系统中已经安装了Postman应用程序。

步骤19:打开邮递员,然后执行以下操作:

  • 选择POST
  • 调用URL http:// localhost:8080 / books。
  • 选择身体
  • 选择Content-Type JSON(应用程序/ json)。
  • 插入数据。我们在车身中插入了以下数据:
{
    "bookid": "5433",
    "bookname": "Core and Advance Java",
    "author": "R. Nageswara Rao",
    "price": "800"
} 
  • 点击发送

成功执行请求后,它会显示Status: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。单击“连接”按钮,如下所示。

单击“连接”按钮后,我们将在数据库中看到“图书”表,如下所示。

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

步骤22:打开邮递员,并发送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"
}
  • 点击发送

现在,移至H2控制台,查看更改是否已反映。我们看到这本书的价格已更改,如下所示。