介紹java
在這篇文章中,我將展現如何使用Spring Boot和MongoDB構建一個簡單的CRUD REST應用程序示例。我知道你的第一個問題是MongoDB是什麼?web
MongoDB是什麼?spring
MongoDB是一個NoSQL文檔數據庫。在這個數據庫中,記錄是document,其行爲很像JSON對象。因此它主要是鍵值對。mongodb
使用MongoDB做爲數據庫的主要優勢是:數據庫
- MongoDB是一種無模式文檔數據庫。一個集合包含不一樣的文檔。
- 單個對象的結構是清晰的。
- 沒有複雜的鏈接。
- 深查詢能力。
- 易於擴展。
如下是在企業應用中使用MongoDB或相似的NoSQL數據庫的幾個緣由:服務器
- 更快的JSON數據檢索。
- 很容易在屬性上添加索引。
- 用於分片——分片是跨多臺機器存儲數據記錄的過程。在跨多臺機器存儲數據時,一般會根據某些標準對數據進行分區。
- 更新快。
- 容易查詢。
先決條件app
要建立這個示例應用程序,你須要:編輯器
- Spring Boot(版本2.4.1)
- MongoDB
- Gradle
- Java
Spring Boot CRUD應用程序spring-boot
做爲本文的一部分,我將構建一個REST CRUD應用程序。這包括gradle
-
一個圖書館-咱們將在MongoDB數據庫中建立一個圖書館集合。
-
咱們將按做者來存放這些書。
-
用戶能夠調用REST API按做者檢索圖書。
-
用戶能夠調用REST API來檢索圖書館中的全部圖書。
-
POST - /v1/mongodbapp/books -添加一本書。
-
GET - /v1/mongodbapp/books——從庫中檢索全部的圖書。
-
GET - /v1/mongodbapp/books/id -檢索特定的圖書。
-
DELETE—/v1/mongodbapp/books/id—從庫中刪除一本書。
如何使用MongoDB和Spring Boot CRUD
爲了開始建立這個應用程序,咱們將使用gradle來處理咱們的依賴並構建應用程序。在Spring Boot應用程序中添加如下依賴項:
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' implementation 'org.springframework.boot:spring-boot-starter-web'
一旦咱們有了這些依賴,咱們將可以鏈接到mongodb數據庫。可是咱們仍然須要添加數據庫的位置。咱們將在application.properties中添加所需的屬性。以下:
spring.data.mongodb.host = localhostspring.data.mongodb.port=27017 spring.data.mongodb.database=library
這將容許咱們鏈接到運行在主機localhost上的端口27017上的MongoDB數據庫,而且數據庫是library。
定義數據模型
做爲圖書館的一部分,咱們將須要書籍。咱們的主要數據對象是Book。這個數據模型將包括書名、做者和ISBN。具體內容以下:
package com.betterjavacode.mongodbdemo.mongodbapp.models;import org.springframework.data.annotation.Id;import org.springframework.data.mongodb.core.mapping.Document;@Document(collection = "books")public class Book{ @Id private String id; private String title; private String author; private String isbn; public Book() { } public Book(String title, String author, String isbn) { this.title = title; this.author = author; this.isbn = isbn; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; }}
由於咱們使用的是MongoDB,因此@Document註釋覆蓋了集合書籍。
添加Repository接口
咱們須要一個Repository庫接口來獲取、保存或刪除book對象。在repositories包中,咱們將添加BookRepository接口:
package com.betterjavacode.mongodbdemo.mongodbapp.repositories;import com.betterjavacode.mongodbdemo.mongodbapp.models.Book;import org.springframework.data.mongodb.repository.MongoRepository;import java.util.List;public interface BookRepository extends MongoRepository<Book, String>{ List findByTitleContaining(String title); List findByAuthor(String name);}
這個Repository庫有兩個方法:能夠經過標題或做者姓名獲取圖書。
添加Spring REST API控制器
如今,爲了使咱們的應用程序REST CRUD,咱們將添加一個REST控制器。這個控制器將包含POST、PUT、GET和DELETE API。
package com.betterjavacode.mongodbdemo.mongodbapp.controller;import com.betterjavacode.mongodbdemo.mongodbapp.models.Book;import com.betterjavacode.mongodbdemo.mongodbapp.repositories.BookRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.*;import java.util.ArrayList;import java.util.List;import java.util.Optional;@CrossOrigin("http://localhost:8080")@RestController@RequestMapping("/v1/mongodbapp")public class BookController{ @Autowired BookRepository bookRepository; @GetMapping("/books") public ResponseEntity<List> getAllBooks(@RequestParam(required = false) String bookTitle) { try { List listOfBooks = new ArrayList<>(); if(bookTitle == null || bookTitle.isEmpty()) { bookRepository.findAll().forEach(listOfBooks::add);} else { bookRepository.findByTitleContaining(bookTitle).forEach(listOfBooks::add); } if (listOfBooks.isEmpty()) { return new ResponseEntity<>(HttpStatus.NO_CONTENT); } return new ResponseEntity<>(listOfBooks, HttpStatus.OK); } catch (Exception e) { return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); } } @GetMapping("/books/{id}") public ResponseEntity getBookById(@PathVariable("id") String id) { try { Optional bookOptional = bookRepository.findById(id); return new ResponseEntity<>(bookOptional.get(), HttpStatus.OK); } catch (Exception e) { return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); } } @PostMapping("/books") public ResponseEntity addABookToLibrary(@RequestBody Book book) { try { Book createdBook = bookRepository.save(new Book(book.getTitle(), book.getAuthor(), book.getIsbn())); return new ResponseEntity<>(createdBook, HttpStatus.CREATED); } catch (Exception e) { return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); } } @PutMapping("/books/{id}") public ResponseEntity updateABook(@PathVariable("id") String id, @RequestBody Book book) { Optional bookOptional = bookRepository.findById(id); if (bookOptional.isPresent()) { Book updatedBook = bookOptional.get(); updatedBook.setTitle(book.getTitle()); updatedBook.setAuthor(book.getAuthor()); updatedBook.setIsbn(book.getIsbn()); return new ResponseEntity<>(bookRepository.save(updatedBook), HttpStatus.OK); } else { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } } @DeleteMapping("/books/{id}") public ResponseEntity deleteABook(@PathVariable("id") String id) { try { bookRepository.deleteById(id); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } catch (Exception e) { return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } }}
BookController 是咱們的REST控制器類。它包括
- @RestController -將其標記爲REST控制器。
- @CrossOrigin -這個註釋容許跨源資源共享(CORS)。這將在REST響應中添加CORS訪問控制頭。這些頭是必需的,由於它容許服務器不只指定誰能夠訪問資源,並且指定如何訪問資源。
- 咱們添加了不一樣的方法——addabooktolilibrary將書籍添加到數據庫,getAllBooks從數據庫中檢索書籍。
完整的演示
如今咱們已經添加了REST控制器、Repository庫方法,咱們將構建並運行這個應用程序。做爲演示的一部分,我將使用POSTMAN來訪問API。
能夠從命令行或正在使用的代碼編輯器構建應用程序。我更喜歡命令行,因此我已經構建了應用程序。一旦編譯完成,你就能夠像下面這樣運行程序:
java -jar mongodbapp-0.0.1-SNAPSHOT.jar
讓咱們用POSTMAN給咱們的圖書館添加書籍。
如上所示,咱們添加了一本書,響應將在數據庫中顯示已添加的書。
下面的API是一個GET API,用於從數據庫中獲取全部書籍。
如今,爲了顯示從庫中刪除圖書,咱們將使用delete API。
結論
在這篇文章中,我展現瞭如何在使用MongoDB數據庫時使用Spring Boot建立REST API。咱們使用的方法與使用常規SQL數據庫時的方法很是類似。在使用NoSQL數據庫時,咱們必須添加一些更改。