--- title: Spring 访问 MongoDB date: 2018-12-15 17:29:36 order: 22 categories: - Java - 框架 - Spring - Spring数据 tags: - Java - 框架 - Spring - SpringBoot - mongodb permalink: /pages/762be9db/ --- # Spring 访问 MongoDB ## 简介 [MongoDB](https://www.mongodb.org/) 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。 在 Spring 中,[spring-data-mongodb](https://github.com/spring-projects/spring-data-mongodb) 项目对访问 [MongoDB](https://www.mongodb.org/) 进行了 API 封装,提供了便捷的访问方式。 Spring Data MongoDB 的核心是一个以 POJO 为中心的模型,用于与 MongoDB `DBCollection` 交互并轻松编写 `Repository` 样式的数据访问层。 [spring-boot](https://github.com/spring-projects/spring-boot) 项目中的子模块 [spring-boot-starter-data-mongodb](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb) 基于 [spring-data-mongodb](https://github.com/spring-projects/spring-data-mongodb) 项目,做了二次封装,大大简化了 MongoDB 的相关配置。 ## Spring Boot 快速入门 ### 引入依赖 在 pom.xml 中引入依赖: ```xml org.springframework.boot spring-boot-starter-data-mongodb ``` ### 数据源配置 ```properties spring.data.mongodb.host = localhost spring.data.mongodb.port = 27017 spring.data.mongodb.database = test spring.data.mongodb.username = root spring.data.mongodb.password = root ``` ### 定义实体 定义一个具有三个属性的 `Customer` 类:`id`、`firstName` 和 `lastName` ```java import org.springframework.data.annotation.Id; public class Customer { @Id public String id; public String firstName; public String lastName; public Customer(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } @Override public String toString() { return String.format( "Customer[id=%s, firstName='%s', lastName='%s']", id, firstName, lastName); } } ``` [spring-data-mongodb](https://github.com/spring-projects/spring-data-mongodb) 会将 `Customer` 类映射到一个名为 `customer` 的集合中。如果要更改集合的名称,可以在类上使用 `@Document` 注解。 ### 创建 Repository [spring-data-mongodb](https://github.com/spring-projects/spring-data-mongodb) 继承了 [Spring Data Commons](https://github.com/spring-projects/spring-data-commons) 项目的能力,所以可以使用其通用 API——`Repository`。 先定义一个 `CustomerRepository` 类,继承 `MongoRepository` 接口,并指定其泛型参数:`Customer` 和 `String`。MongoRepository 接口支持多种操作,包括 CRUD 和分页查询。在下面的例子中,定义了两个查询方法: ```java import java.util.List; import org.springframework.data.mongodb.repository.MongoRepository; public interface CustomerRepository extends MongoRepository { Customer findByFirstName(String firstName); List findByLastName(String lastName); } ``` ### 创建 Application 创建一个 Spring Boot 的启动类 Application,并在启动的 main 方法中使用 `CustomerRepository` 实例访问 MongoDB。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DataMongodbApplication implements CommandLineRunner { @Autowired private CustomerRepository repository; public static void main(String[] args) { SpringApplication.run(DataMongodbApplication.class, args); } @Override public void run(String... args) { repository.deleteAll(); // save a couple of customers repository.save(new Customer("Alice", "Smith")); repository.save(new Customer("Bob", "Smith")); // fetch all customers System.out.println("Customers found with findAll():"); System.out.println("-------------------------------"); for (Customer customer : repository.findAll()) { System.out.println(customer); } System.out.println(); // fetch an individual customer System.out.println("Customer found with findByFirstName('Alice'):"); System.out.println("--------------------------------"); System.out.println(repository.findByFirstName("Alice")); System.out.println("Customers found with findByLastName('Smith'):"); System.out.println("--------------------------------"); for (Customer customer : repository.findByLastName("Smith")) { System.out.println(customer); } } } ``` 运行 `DataMongodbApplication` 的 main 方法后,输出类似如下类容: ``` Customers found with findAll(): ------------------------------- Customer(id=63d6157b265e7c5e48077f63, firstName=Alice, lastName=Smith) Customer(id=63d6157b265e7c5e48077f64, firstName=Bob, lastName=Smith) Customer found with findByFirstName('Alice'): -------------------------------- Customer(id=63d6157b265e7c5e48077f63, firstName=Alice, lastName=Smith) Customers found with findByLastName('Smith'): -------------------------------- Customer(id=63d6157b265e7c5e48077f63, firstName=Alice, lastName=Smith) Customer(id=63d6157b265e7c5e48077f64, firstName=Bob, lastName=Smith) ``` ## 示例源码 更多 Spring 访问 MongoDB 示例请参考:[MongoDB 示例源码](https://github.com/dunwu/spring-tutorial/tree/master/codes/data/nosql/mongodb) ## 参考资料 - [MongoDB 官网](https://www.mongodb.com/) - [MongoDB Github](https://github.com/mongodb/mongo) - [MongoDB 官方免费教程](https://learn.mongodb.com/) - [spring-data-mongodb Github](https://github.com/spring-projects/spring-data-mongodb) - [Spring Data MongoDB 官方文档](https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/) - [Spring Data 官方示例](https://github.com/spring-projects/spring-data-examples/) - [Accessing Data with MongoDB](https://spring.io/guides/gs/accessing-data-mongodb/) - [Accessing MongoDB Data with REST](https://spring.io/guides/gs/accessing-mongodb-data-rest/)