CRUD 代表 創(chuàng)建,讀取/檢索,更新和 刪除。這些是持久性存儲(chǔ)的四個(gè)基本功能。
可以將CRUD操作定義為用戶界面約定,該約定允許通過基于計(jì)算機(jī)的表單和報(bào)告查看,搜索和修改信息。 CRUD是面向數(shù)據(jù)的,是 HTTP動(dòng)作動(dòng)詞的標(biāo)準(zhǔn)化用法。 HTTP有一些重要的動(dòng)詞。
POST: 創(chuàng)建新資源 GET: 讀取資源 PUT: 更新現(xiàn)有資源 DELETE: 刪除資源
在數(shù)據(jù)庫中,這些操作中的每一個(gè)都直接映射到一系列命令。但是,它們與RESTful API的關(guān)系稍微復(fù)雜一些。
創(chuàng)建操作: 它執(zhí)行INSERT語句以創(chuàng)建新記錄。 讀取操作: 它根據(jù)輸入?yún)?shù)讀取表記錄。 更新操作: 它在表上執(zhí)行一條update語句。它基于輸入?yún)?shù)。 刪除操作: 它將刪除表中的指定行。它也基于輸入?yún)?shù)。
CRUD操作是最動(dòng)態(tài)的網(wǎng)站的基礎(chǔ)。因此,我們應(yīng)該將 CRUD 與 HTTP 動(dòng)作動(dòng)詞區(qū)分開來。
假設(shè)我們要 創(chuàng)建一條新記錄,我們應(yīng)該使用HTTP操作動(dòng)詞 POST 。要 更新一條記錄,我們應(yīng)該使用 PUT 動(dòng)詞。同樣,如果要 刪除記錄,則應(yīng)使用 DELETE 動(dòng)詞。通過CRUD操作,用戶和管理員有權(quán)在線檢索,創(chuàng)建,編輯和刪除記錄。
我們有許多執(zhí)行CRUD操作的選項(xiàng)。最有效的選擇之一是在SQL中創(chuàng)建一組存儲(chǔ)過程來執(zhí)行操作。
CRUD操作引用關(guān)系數(shù)據(jù)庫應(yīng)用程序中實(shí)現(xiàn)的所有主要功能。 CRUD的每個(gè)字母都可以映射到SQL語句和HTTP方法。
操作 | SQL | HTTP動(dòng)詞 | RESTful Web服務(wù) |
Create | INSERT | PUT/POST | POST |
Read | SELECT | GET | GET |
Update | UPDATE | PUT/POST/PATCH | PUT |
Delete | Delete | Delete | Delete |
Spring Boot提供了一個(gè)名為 CrudRepository 的接口,其中包含用于CRUD操作的方法。它在包 org.springframework.data.repository 中定義。它擴(kuò)展了Spring Data 存儲(chǔ)庫界面。它在存儲(chǔ)庫上提供通用的Crud操作。如果要在應(yīng)用程序中使用CrudRepository,則必須創(chuàng)建一個(gè)接口并擴(kuò)展 CrudRepository 。
語法
public interface CrudRepository<T,ID> extends Repository<T,ID>
其中
T 是存儲(chǔ)庫管理的域類型。 ID 是存儲(chǔ)庫管理的實(shí)體的ID類型。
例如:
public interface StudentRepository extends CrudRepository<Student, Integer> { }
在上面的示例中,我們創(chuàng)建了一個(gè)名為 StudentRepository 的接口,該接口擴(kuò)展了CrudRepository。其中 Student 是要管理的存儲(chǔ)庫,而 Integer 是Student存儲(chǔ)庫中定義的ID類型。
JpaRepository提供了與JPA相關(guān)的方法,例如刷新,持久性上下文,并批量刪除了一條記錄。它在包 org.springframework.data.jpa.repository中定義。 JpaRepository擴(kuò)展了 CrudRepository 和 PagingAndSortingRepository。
例如:
public interface BookDAO extends JpaRepository { }
這些接口允許Spring查找存儲(chǔ)庫接口并為此創(chuàng)建代理對象。 它提供了允許我們執(zhí)行一些常見操作的方法。我們還可以定義自定義方法。
CrudRepository | JpaRepository |
CrudRepository沒有提供任何用于分頁和排序的方法。 | JpaRepository擴(kuò)展了PagingAndSortingRepository。它提供了實(shí)現(xiàn)分頁的所有方法。 |
它用作標(biāo)記界面。 | JpaRepository擴(kuò)展了 CrudRepository 和 PagingAndSortingRepository 。 |
它僅提供CRUD功能。例如 findById(),findAll()等。 | 它提供了一些額外的方法以及PagingAndSortingRepository和CrudRepository的方法。例如, flush(),deleteInBatch()。 |
在不需要JpaRepository和PagingAndSortingRepository提供的功能時(shí)使用。 | 當(dāng)我們要在應(yīng)用程序中實(shí)現(xiàn)分頁和排序功能時(shí)使用。 |
讓我們設(shè)置一個(gè)Spring Boot應(yīng)用程序并執(zhí)行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: 添加依賴項(xiàng) Spring Web,Spring Data JPA,和 H2數(shù)據(jù)庫。
步驟6: 單擊 Generate (生成)按鈕。當(dāng)我們單擊"生成"按鈕時(shí),它將規(guī)格包裝在 Jar 文件中,并將其下載到本地系統(tǒng)。
步驟7: 提取 Jar文件并將其粘貼到STS工作區(qū)中。
步驟8: 將項(xiàng)目文件夾導(dǎo)入STS。
文件->導(dǎo)入->現(xiàn)有Maven項(xiàng)目->瀏覽->選擇文件夾spring-boot-crud-operation->完成
導(dǎo)入需要一些時(shí)間。
步驟9: 在目錄中創(chuàng)建名稱為 com.nhooo.model 的程序包。文件夾 src/main/java。
步驟10: 在包 com.nhooo.model中創(chuàng)建類。 我們創(chuàng)建了一個(gè)名為 Books的類。 在"圖書"類中,我們執(zhí)行了以下操作:
定義四個(gè)變量 bookid, bookname, author,和 生成Getter和Setters。
右鍵單擊文件-> Source-> Generate Getters和Setters。 使用注解 @Entity將類標(biāo)記為Entity。 使用注解 @Table,將該類標(biāo)記為 Table 名稱。 通過使用注解 @Column 將每個(gè)變量定義為 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文件夾中創(chuàng)建一個(gè)名稱為 com.nhooo.controller 的包。
步驟12: 在包 com.nhooo.controller中創(chuàng)建一個(gè)Controller類。 我們創(chuàng)建了一個(gè)名為 BooksController的控制器類。 在BooksController類中,我們完成了以下操作:
使用注解 @RestController將類標(biāo)記為 RestController 。 使用注解 @Autowired 自動(dòng)注解 BooksService 類。 定義以下方法: getAllBooks(): 。它返回所有書籍的列表。 getBooks(): 它返回我們在path變量中指定的書籍詳細(xì)信息。通過使用注解@PathVariable,我們已將bookid作為參數(shù)傳遞。注解指示方法參數(shù)應(yīng)綁定到URI模板變量。 deleteeBook(): 它將刪除我們在path變量中指定的特定書籍。 saveBook(): 保存圖書詳細(xì)信息。注解@RequestBody表示應(yīng)將方法參數(shù)綁定到Web請求的正文。 update(): 該方法更新一條記錄。我們必須在正文中指定要更新的記錄吃了為了達(dá)到相同的目的,我們使用了@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; //將類標(biāo)記為 Controller @RestController public class BooksController { //自動(dòng)裝配BooksService類 @Autowired BooksService booksService; //創(chuàng)建從數(shù)據(jù)庫檢索所有圖書詳細(xì)信息的get映射 @GetMapping("/book") private List<Books> getAllBooks() { return booksService.getAllBooks(); } //創(chuàng)建檢索特定書籍詳細(xì)信息的get映射 @GetMapping("/book/{bookid}") private Books getBooks(@PathVariable("bookid") int bookid) { return booksService.getBooksById(bookid); } //創(chuàng)建刪除映射,刪除指定的書 @DeleteMapping("/book/{bookid}") private void deleteBook(@PathVariable("bookid") int bookid) { booksService.delete(bookid); } //創(chuàng)建在數(shù)據(jù)庫中發(fā)布書籍詳細(xì)信息的post映射 @PostMapping("/books") private int saveBook(@RequestBody Books books) { booksService.saveOrUpdate(books); return books.getBookid(); } //創(chuàng)建更新圖書詳細(xì)信息的put映射 @PutMapping("/books") private Books update(@RequestBody Books books) { booksService.saveOrUpdate(books); return books; } }
步驟13: 在文件夾 src/main/java中創(chuàng)建一個(gè)名稱為 com.nhooo.service 的包。
步驟14: 創(chuàng)建一個(gè) Service 類。我們在包 com.nhooo.service中創(chuàng)建了一個(gè)名為 BooksService 的服務(wù)類。
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; //定義業(yè)務(wù)邏輯 @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中創(chuàng)建一個(gè)名稱為 com.nhooo.repository 的包。
第16步: 創(chuàng)建一個(gè) 存儲(chǔ)庫界面。我們在包 com.nhooo.repository中創(chuàng)建了一個(gè)名為 BooksRepository 的存儲(chǔ)庫接口。 它擴(kuò)展了 Crud存儲(chǔ)庫界面。
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> { }
現(xiàn)在,我們將在 application.properties 文件中配置數(shù)據(jù)源 URL,驅(qū)動(dòng)程序類名稱,用戶名和 密碼。
步驟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
創(chuàng)建所有類和包之后,項(xiàng)目目錄如下所示。
現(xiàn)在我們將運(yùn)行該應(yīng)用程序。
步驟18: 打開 SpringBootCrudOperationApplication.java 文件并作為Java應(yīng)用程序運(yùn)行。
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并執(zhí)行以下操作:
選擇 POST 調(diào)用URL http://localhost:8080/books。 選擇Body 選擇內(nèi)容類型 JSON(application/json)。 插入數(shù)據(jù)。我們已在主體中插入以下數(shù)據(jù):
{ "bookid": "5433", "bookname": "Core and Advance Java", "author": "R. Nageswara Rao", "price": "800" }
點(diǎn)擊發(fā)送
請求成功執(zhí)行后,它會(huì)顯示 狀態(tài): 200 OK 。這意味著記錄已成功插入數(shù)據(jù)庫中。
類似地,我們插入了以下數(shù)據(jù)。
{"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控制臺(tái)以查看數(shù)據(jù)。
步驟20: 打開瀏覽器并調(diào)用URL http://localhost:8080/h2-console。單擊 Connect 按鈕,如下所示。
單擊 連接按鈕后,我們將在數(shù)據(jù)庫中看到 Books 表,如下所示。
步驟21: 單擊 Books 表,然后然后點(diǎn)擊 運(yùn)行按鈕。該表顯示了我們插入到正文中的數(shù)據(jù)。
步驟22: 打開 Postman,并發(fā)送URL為http://localhost:8080/books的 GET 請求。它返回我們插入數(shù)據(jù)庫中的數(shù)據(jù)。
我們以URL http://localhost:8080/book/{bookid}發(fā)送 GET 請求。我們指定了 bookid 6830 。它返回ID為6830的書的詳細(xì)信息。
同樣,我們也可以發(fā)送 DELETE 請求刪除記錄。假設(shè)我們要?jiǎng)h除ID為 5433 的圖書記錄。
選擇 DELETE 方法并調(diào)用URL http://localhost:8080/書/5433。再次在H2控制臺(tái)中執(zhí)行 Select 查詢。我們發(fā)現(xiàn)ID為 5433 的圖書已從數(shù)據(jù)庫中刪除。
類似地,我們也可以通過發(fā)送 PUT 請求來更新記錄。讓我們更新ID為 6321 的圖書的價(jià)格。
選擇 PUT 在請求正文中,粘貼要更新的記錄并進(jìn)行更改。在本示例中,我們要更新ID為6321的書籍的記錄。在以下記錄中,我們更改了書籍的價(jià)格。
{ "bookid": "6321", "bookname": "Data Structures and Algorithms in Java", "author": "Robert Lafore", "price": "500" }
點(diǎn)擊發(fā)送
現(xiàn)在,移至H2控制臺(tái),查看更改是否已反映。我們看到這本書的價(jià)格已更改,如下所示。