原文: http://zetcode.com/springboot/mongodb/

Spring Boot MongoDB 教程展示了如何在 Spring Boot 框架中访问 MongoDB 中的数据。

Spring 是流行的 Java 应用框架,而 Spring Boot 是 Spring 的演进,可以帮助轻松地创建独立的,生产级的基于 Spring 的应用。

MongoDB

MongoDB 是 NoSQL 跨平台的面向文档的数据库。 它是可用的最受欢迎的数据库之一。 MongoDB 由 MongoDB Inc. 开发,并作为免费和开源软件发布。

Spring Data MongoDB 项目提供了与 MongoDB 文档数据库的集成。

安装 MongoDB

以下命令可用于在基于 Debian 的 Linux 上安装 MongoDB。

  1. $ sudo apt-get install mongodb

该命令将安装 MongoDB 随附的必要包。

  1. $ sudo service mongodb status
  2. mongodb start/running, process 975

使用sudo service mongodb status命令,我们检查mongodb服务器的状态。

  1. $ sudo service mongodb start
  2. mongodb start/running, process 6448

mongodb服务器由sudo service mongodb start命令启动。

Spring Boot MongoDB 示例

在以下示例中,我们创建一个使用 MongoDB 数据库的简单 Spring Boot 应用。 请注意,默认情况下,没有任何特定配置,Spring Boot 会尝试使用test数据库名称连接到本地托管的 MongoDB 实例。

  1. pom.xml
  2. src
  3. ├───main
  4. ├───java
  5. └───com
  6. └───zetcode
  7. Application.java
  8. MyRunner.java
  9. ├───model
  10. Country.java
  11. └───repository
  12. CountryRepository.java
  13. └───resources
  14. application.properties
  15. └───test
  16. └───java
  17. └───com
  18. └───zetcode
  19. MongoTest.java

这是 Spring 应用的项目结构。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>springbootmongodb</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>jar</packaging>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <maven.compiler.source>11</maven.compiler.source>
  14. <maven.compiler.target>11</maven.compiler.target>
  15. </properties>
  16. <parent>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-parent</artifactId>
  19. <version>2.1.1.RELEASE</version>
  20. </parent>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-test</artifactId>
  29. <scope>test</scope>
  30. </dependency>
  31. </dependencies>
  32. <build>
  33. <plugins>
  34. <plugin>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-maven-plugin</artifactId>
  37. </plugin>
  38. </plugins>
  39. </build>
  40. </project>

这是 Maven pom.xml文件。

Spring Boot 启动器是一组方便的依赖项描述符,可以极大地简化 Maven 配置。 spring-boot-starter-parent具有 Spring Boot 应用的一些常用配置。 spring-boot-starter-data-mongodb是使用 MongoDB 面向文档的数据库和 Spring Data MongoDB 的入门。 spring-boot-starter-test是使用包含 JUnit,Hamcrest 和 Mockito 的库测试 Spring Boot 应用的入门程序。

spring-boot-maven-plugin提供了 Maven 的 Spring Boot 支持,使我们能够打包可执行的 JAR 或 WAR 档案。 它的spring-boot:run目标运行 Spring Boot 应用。

resources/application.properties

  1. spring.main.banner-mode=off
  2. logging.level.org.springframework=ERROR

application.properties中,我们打开 Spring Boot 横幅并设置日志记录属性。 默认情况下,Spring Boot 会尝试使用测试数据库连接到 MongoDB 的本地托管实例。

  1. # mongodb
  2. spring.data.mongodb.host=localhost
  3. spring.data.mongodb.port=27017
  4. spring.data.mongodb.database=testdb

如果要配置 MongoDB,可以设置相应的属性。

com/zetcode/model/Country.java

  1. package com.zetcode.model;
  2. import org.springframework.data.annotation.Id;
  3. import org.springframework.data.mongodb.core.mapping.Document;
  4. import java.util.Objects;
  5. @Document
  6. public class Country {
  7. @Id
  8. private String id;
  9. private String name;
  10. private int population;
  11. public Country(String name, int population) {
  12. this.name = name;
  13. this.population = population;
  14. }
  15. public String getId() {
  16. return id;
  17. }
  18. public void setId(String id) {
  19. this.id = id;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public int getPopulation() {
  28. return population;
  29. }
  30. public void setPopulation(int population) {
  31. this.population = population;
  32. }
  33. @Override
  34. public boolean equals(Object o) {
  35. if (this == o) return true;
  36. if (o == null || getClass() != o.getClass()) return false;
  37. Country country = (Country) o;
  38. return population == country.population &&
  39. Objects.equals(id, country.id) &&
  40. Objects.equals(name, country.name);
  41. }
  42. @Override
  43. public int hashCode() {
  44. return Objects.hash(id, name, population);
  45. }
  46. @Override
  47. public String toString() {
  48. final StringBuilder sb = new StringBuilder("Country{");
  49. sb.append("id='").append(id).append('\'');
  50. sb.append(", name='").append(name).append('\'');
  51. sb.append(", population=").append(population);
  52. sb.append('}');
  53. return sb.toString();
  54. }
  55. }

这是Country bean,具有三个属性:idnamepopulation

  1. @Document
  2. public class Country {

Bean 用可选的@Document注解修饰。

  1. @Id
  2. private String id;

id@Id注解修饰。 Spring 会自动为一个新生成的国家对象生成一个新的 ID。

com/zetcode/repository/CountryRepository.java

  1. package com.zetcode.repository;
  2. import com.zetcode.model.Country;
  3. import org.springframework.data.mongodb.repository.MongoRepository;
  4. public interface CountryRepository extends MongoRepository<Country, String> {
  5. }

通过从MongoRepository扩展,我们可以直接使用许多操作,包括标准 CRUD 操作。

com/zetcode/MyRunner.java

  1. package com.zetcode;
  2. import com.zetcode.model.Country;
  3. import com.zetcode.repository.CountryRepository;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.CommandLineRunner;
  8. import org.springframework.stereotype.Component;
  9. @Component
  10. public class MyRunner implements CommandLineRunner {
  11. private static final Logger logger = LoggerFactory.getLogger(MyRunner.class);
  12. @Autowired
  13. private CountryRepository repository;
  14. @Override
  15. public void run(String... args) throws Exception {
  16. repository.deleteAll();
  17. repository.save(new Country("China", 1382050000));
  18. repository.save(new Country("India", 1313210000));
  19. repository.findAll().forEach((country) -> {
  20. logger.info("{}", country);
  21. });
  22. }
  23. }

我们有一个命令行运行器。 在其run()方法中,我们访问 MongoDB。

  1. @Autowired
  2. private CountryRepository repository;

CountryRepository注入了@Autowired注解。

  1. repository.deleteAll();

如果有,我们将使用deleteAll()删除所有国家。

  1. repository.save(new Country("China", 1382050000));

我们用save()保存一个国家。

  1. repository.findAll().forEach((country) -> {
  2. logger.info("{}", country);
  3. });

我们使用findAll()方法遍历数据库中的所有国家。

com/zetcode/Application.java

  1. package com.zetcode;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Application.class, args);
  8. }
  9. }

这段代码设置了 Spring Boot 应用。

com/zetcode/MongoTest.java

  1. package com.zetcode;
  2. import com.zetcode.model.Country;
  3. import com.zetcode.repository.CountryRepository;
  4. import org.junit.Before;
  5. import org.junit.Test;
  6. import org.junit.runner.RunWith;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.boot.test.context.SpringBootTest;
  9. import org.springframework.data.domain.Example;
  10. import org.springframework.test.context.junit4.SpringRunner;
  11. import java.util.Optional;
  12. import static junit.framework.TestCase.assertEquals;
  13. import static org.assertj.core.api.Assertions.assertThat;
  14. @RunWith(SpringRunner.class)
  15. @SpringBootTest
  16. public class MongoTest {
  17. @Autowired
  18. private CountryRepository repository;
  19. private static final int NUMBER_OF_COUNTRIES = 6;
  20. @Before
  21. public void init() {
  22. repository.deleteAll();
  23. repository.save(new Country("China", 1382050000));
  24. repository.save(new Country("India", 1313210000));
  25. repository.save(new Country("USA", 324666000));
  26. repository.save(new Country("Indonesia", 260581000));
  27. repository.save(new Country("Brazil", 207221000));
  28. repository.save(new Country("Pakistan", 196626000));
  29. }
  30. @Test
  31. public void countAllCountries() {
  32. var countries = repository.findAll();
  33. assertEquals(NUMBER_OF_COUNTRIES, countries.size());
  34. }
  35. @Test
  36. public void countOneCountry() {
  37. Example<Country> example = Example.of(new Country("China", 1382050000));
  38. assertThat(repository.count(example)).isEqualTo(1L);
  39. }
  40. @Test
  41. public void setsIdOnSave() {
  42. Country nigeria = repository.save(new Country("Nigeria", 186988000));
  43. assertThat(nigeria.getId()).isNotNull();
  44. }
  45. @Test
  46. public void findOneCountry() {
  47. Example<Country> example = Example.of(new Country("India", 1313210000));
  48. Optional<Country> country = repository.findOne(example);
  49. assertThat(country.get().getName()).isEqualTo("India");
  50. }
  51. }

我们有四种测试方法。

  1. @Before
  2. public void init() {
  3. repository.deleteAll();
  4. repository.save(new Country("China", 1382050000));
  5. repository.save(new Country("India", 1313210000));
  6. repository.save(new Country("USA", 324666000));
  7. repository.save(new Country("Indonesia", 260581000));
  8. repository.save(new Country("Brazil", 207221000));
  9. repository.save(new Country("Pakistan", 196626000));
  10. }

init()方法中,我们保存了六个国家。

  1. @Test
  2. public void countAllCountries() {
  3. var countries = repository.findAll();
  4. assertEquals(NUMBER_OF_COUNTRIES, countries.size());
  5. }

我们测试数据库中有六个国家。

  1. @Test
  2. public void countOneCountry() {
  3. Example<Country> example = Example.of(new Country("China", 1382050000));
  4. assertThat(repository.count(example)).isEqualTo(1L);
  5. }

此方法测试数据库中只有一个中国。

  1. @Test
  2. public void setsIdOnSave() {
  3. Country nigeria = repository.save(new Country("Nigeria", 186988000));
  4. assertThat(nigeria.getId()).isNotNull();
  5. }

我们测试了在保存新国家/地区时,自动生成的 ID 不等于null

  1. @Test
  2. public void findOneCountry() {
  3. Example<Country> example = Example.of(new Country("India", 1313210000));
  4. Optional<Country> country = repository.findOne(example);
  5. assertThat(country.get().getName()).isEqualTo("India");
  6. }

我们测试findOne()方法找到一个国家,即印度。

在本教程中,我们学习了如何在 Spring Boot 应用中使用 MongoDB。 您可能也对相关教程感兴趣: Spring Boot REST 数据 JPA 教程Spring Boot REST H2 教程MongoDB Java 教程Java 教程 或列出所有 Spring Boot 教程