介绍
在这篇文章中,我将演示如何使用 Spring Boot 和 MongoDB 构建一个简单的 CRUD REST 应用程序示例。很多人首先会问:MongoDB 是什么?
MongoDB是什么?
MongoDB 是一种 NoSQL 文档型数据库。在这个数据库中,记录以 document 的形式存储,其结构与 JSON 对象非常相似,因此本质上可以理解为以键值对方式组织数据。
使用 MongoDB 作为数据库的主要优点包括:
- MongoDB 是一种无模式的文档数据库,一个集合中可以包含结构不同的文档。
- 单个对象的数据结构清晰,便于理解和维护。
- 无需复杂的表连接操作。
- 具备较强的深度查询能力。
- 扩展性强,便于横向扩容。
以下是在企业级应用中使用 MongoDB 或类似 NoSQL 数据库的几个常见原因:
- JSON 数据读取和检索速度更快。
- 可以很方便地为属性字段添加索引。
- 支持分片——分片是将数据记录分布到多台机器上的过程。在跨多台机器存储数据时,通常会根据特定规则对数据进行拆分和分区。
- 数据更新效率高。
- 查询方式灵活,使用起来更便捷。
先决条件
要创建这个示例应用程序,你需要准备:
- Spring Boot(版本2.4.1)
- MongoDB
- Gradle
- Ja va
Spring Boot CRUD应用程序
作为本文示例的一部分,我将构建一个基于 REST 的 CRUD 应用程序,其中包括:
一个图书馆场景——我们将在 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.betterja vacode.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 注解来指定对应的 books 集合。
添加Repository接口
我们需要一个 Repository 接口来完成 book 对象的查询、保存和删除操作。在 repositories 包中,我们将添加 BookRepository 接口:
package com.betterja vacode.mongodbdemo.mongodbapp.repositories;
import com.betterja vacode.mongodbdemo.mongodbapp.models.Book;import org.springframework.data.mongodb.repository.MongoRepository;
import ja va.util.List;
public interface BookRepository extends MongoRepository{ List findByTitleContaining(String title); List findByAuthor(String name);} 这个 Repository 接口中包含两个方法:一个可根据标题关键字查询图书,另一个可根据作者姓名查询图书。
添加Spring REST API控制器
现在,为了让应用具备 REST CRUD 能力,我们需要添加一个 REST 控制器。这个控制器将包含 POST、PUT、GET 和 DELETE API。
package com.betterja vacode.mongodbdemo.mongodbapp.controller;
import com.betterja vacode.mongodbdemo.mongodbapp.models.Book;import com.betterja vacode.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 ja va.util.ArrayList;import ja va.util.List;import ja va.util.Optional;
@CrossOrigin("https://localhost:8080")@RestController@RequestMapping("/v1/mongodbapp")public class BookController{ @Autowired BookRepository bookRepository;
@GetMapping("/books") public ResponseEntity 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.sa ve(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.sa ve(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 访问控制头。这些头信息非常重要,因为它不仅允许服务器指定哪些来源可以访问资源,还可以定义访问资源的方式。
- 我们添加了不同的方法——addABookToLibrary 用于将书籍保存到数据库,getAllBooks 用于从数据库中查询书籍。
完整的演示
现在我们已经添加了 REST 控制器和 Repository 接口方法,接下来就可以构建并运行这个 Spring Boot + MongoDB 应用程序。作为演示的一部分,我将使用 POSTMAN 来访问这些 API 接口。
你可以通过命令行或正在使用的代码编辑器来构建应用程序。我个人更喜欢使用命令行,因此已经完成了应用构建。编译完成后,你可以像下面这样运行程序:
ja va -jar mongodbapp-0.0.1-SNAPSHOT.jar接下来,让我们使用 POSTMAN 向图书馆中添加一本书。

如上图所示,我们成功添加了一本书,接口响应中会返回数据库里刚刚新增的图书信息。
下面的 API 是一个 GET API,用于从数据库中获取所有书籍。

现在,为了演示如何从图书馆中删除图书,我们将使用 DELETE API。

结论
这篇文章展示了如何在使用 MongoDB 数据库的前提下,借助 Spring Boot 快速构建一个 REST API 和 CRUD 应用。整体实现方式与常规 SQL 数据库场景比较接近,但在接入 NoSQL 数据库时,仍然需要根据文档型数据库的特点做出相应调整。
