$ brew install mongodb
使用 MongoDB 访问数据
本指南将引导您使用 Spring Data MongoDB 构建一个应用程序,该应用程序可以将数据存储到基于文档的数据库 MongoDB 中,并从中检索数据。
您将构建什么
您将使用 Spring Data MongoDB 在 MongoDB 数据库中存储 Customer POJO(普通旧 Java 对象)。
您需要什么
-
约 15 分钟
-
一个喜欢的文本编辑器或 IDE
-
Java 17 或更高版本
-
您也可以直接将代码导入到您的 IDE 中
如何完成本指南
与大多数 Spring 入门指南一样,您可以从头开始完成每个步骤,或者跳过您已经熟悉的基本设置步骤。无论哪种方式,您都能获得可运行的代码。
要从头开始,请跳至使用 Spring Initializr 开始。
要跳过基础步骤,请执行以下操作
-
下载并解压本指南的源代码仓库,或者使用 Git 克隆:
git clone https://github.com/spring-guides/gs-accessing-data-mongodb.git -
cd 进入
gs-accessing-data-mongodb/initial
完成后,您可以将结果与 gs-accessing-data-mongodb/complete 中的代码进行对照检查。
使用 Spring Initializr 开始
您可以使用这个预配置项目,然后点击 Generate 下载一个 ZIP 文件。这个项目已经配置好,适合本教程中的示例。
手动初始化项目
-
访问 https://start.spring.io。此服务将引入应用程序所需的所有依赖项,并为您完成大部分设置。
-
选择 Gradle 或 Maven 以及您想要使用的语言。本指南假设您选择了 Java。
-
点击 Dependencies 并选择 Spring Data MongoDB。
-
点击 Generate。
-
下载生成的 ZIP 文件,这是一个根据您的选择配置好的 Web 应用程序存档。
| 如果您的 IDE 集成了 Spring Initializr,您可以直接从 IDE 完成此过程。 |
| 您也可以从 Github fork 项目,并在您的 IDE 或其他编辑器中打开它。 |
安装并启动 MongoDB
设置好项目后,您可以安装并启动 MongoDB 数据库。
如果您使用带有 Homebrew 的 Mac,可以运行以下命令
如果使用 MacPorts,可以运行以下命令
$ port install mongodb
对于其他带有包管理器的系统,如 Redhat、Ubuntu、Debian、CentOS 和 Windows,请参阅 https://docs.mongodb.org/manual/installation/ 上的说明。
安装 MongoDB 后,您可以在控制台窗口中运行以下命令来启动它(该命令也会启动服务器进程)
$ mongod
您应该看到类似以下的输出
all output going to: /usr/local/var/log/mongodb/mongo.log
定义一个简单实体
MongoDB 是一个 NoSQL 文档存储。在本示例中,您将存储 Customer 对象。以下列表显示了 Customer 类(位于 src/main/java/com/example/accessingdatamongodb/Customer.java)
package com.example.accessingdatamongodb;
import org.springframework.data.annotation.Id;
public class Customer {
@Id
public String id;
public String firstName;
public String lastName;
public Customer() {}
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);
}
}
这里有一个 Customer 类,包含三个属性:id、firstName 和 lastName。id 主要供 MongoDB 内部使用。还有一个构造函数,用于在新实例创建时填充实体。
| 在本指南中,为了简洁起见,省略了典型的 getter 和 setter 方法。 |
id 符合 MongoDB ID 的标准命名,因此不需要任何特殊注解来标记 Spring Data MongoDB。
另外两个属性 firstName 和 lastName 未加注解。假定它们映射到与属性同名的字段。
方便的 toString() 方法打印出客户的详细信息。
MongoDB 将数据存储在集合中。Spring Data MongoDB 将 Customer 类映射到一个名为 customer 的集合。如果要更改集合的名称,可以在类上使用 Spring Data MongoDB 的 @Document 注解。 |
创建简单查询
Spring Data MongoDB 专注于将数据存储到 MongoDB。它还继承了 Spring Data Commons 项目的功能,例如派生查询的能力。本质上,您无需学习 MongoDB 的查询语言。您可以编写少量方法,查询就会为您编写好。
要了解其工作原理,请创建一个用于查询 Customer 文档的 repository 接口,如下所示(位于 src/main/java/com/example/accessingdatamongodb/CustomerRepository.java)
package com.example.accessingdatamongodb;
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface CustomerRepository extends MongoRepository<Customer, String> {
public Customer findByFirstName(String firstName);
public List<Customer> findByLastName(String lastName);
}
CustomerRepository 扩展了 MongoRepository 接口,并指定了它处理的值类型和 ID 类型:分别是 Customer 和 String。此接口提供了许多操作,包括标准的 CRUD 操作(创建、读取、更新和删除)。
您可以通过声明方法签名来定义其他查询。在本例中,添加了 findByFirstName,它本质上查找类型为 Customer 的文档,并根据 firstName 匹配文档。
您还有 findByLastName,它根据姓氏查找人员列表。
在典型的 Java 应用程序中,您会编写一个实现 CustomerRepository 的类,并自己编写查询。Spring Data MongoDB 的强大之处在于您无需创建此实现。Spring Data MongoDB 在应用程序运行时动态创建它。
现在您可以连接此应用程序,看看它是怎样的!
创建一个应用程序类
Spring Initializr 为应用程序创建了一个简单的类。以下列表显示了 Initializr 为本示例创建的类(位于 src/main/java/com/example/accessingdatamongodb/AccessingDataMongodbApplication.java)
package com.example.accessingdatamongodb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AccessingDataMongodbApplication {
public static void main(String[] args) {
SpringApplication.run(AccessingDataMongodbApplication.class, args);
}
}
@SpringBootApplication 是一个便捷注解,它添加了以下所有功能
-
@Configuration:将此类标记为应用程序上下文的 bean 定义源。 -
@EnableAutoConfiguration:告诉 Spring Boot 根据类路径设置、其他 bean 和各种属性设置开始添加 bean。例如,如果类路径中有spring-webmvc,则此注解会将应用程序标记为 web 应用程序,并激活关键行为,例如设置DispatcherServlet。 -
@ComponentScan:告诉 Spring 在com/example包中查找其他组件、配置和服务,从而找到控制器。
main() 方法使用 Spring Boot 的 SpringApplication.run() 方法来启动应用程序。您是否注意到没有一行 XML?也没有 web.xml 文件。这个 Web 应用程序是 100% 纯 Java 的,您无需处理任何底层配置或基础设施。
只要这些仓库包含在您的 @SpringBootApplication 类的同一包(或子包)中,Spring Boot 就会自动处理它们。为了更好地控制注册过程,您可以使用 @EnableMongoRepositories 注解。
默认情况下,@EnableMongoRepositories 会扫描当前包中所有继承自 Spring Data 仓库接口的接口。如果您的项目包含多个项目并且无法找到您的仓库,您可以使用其 basePackageClasses=MyRepository.class 安全地指示 Spring Data MongoDB 按类型扫描不同的根包。 |
Spring Data MongoDB 使用 MongoTemplate 执行您的 find* 方法背后的查询。您可以自己使用该模板来执行更复杂的查询,但本指南不对此进行介绍。(请参阅Spring Data MongoDB 参考指南)
现在您需要修改 Initializr 为您创建的简单类。您需要设置一些数据并使用它生成输出。以下列表显示了最终的 AccessingDataMongodbApplication 类(位于 src/main/java/com/example/accessingdatamongodb/AccessingDataMongodbApplication.java)
package com.example.accessingdatamongodb;
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 AccessingDataMongodbApplication implements CommandLineRunner {
@Autowired
private CustomerRepository repository;
public static void main(String[] args) {
SpringApplication.run(AccessingDataMongodbApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
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);
}
}
}
AccessingDataMongodbApplication 包含一个 main() 方法,该方法自动注入 CustomerRepository 的实例。Spring Data MongoDB 在此处动态创建一个代理并将其注入。我们通过一些测试来使用 CustomerRepository。首先,它保存了一些 Customer 对象,演示了 save() 方法并设置了一些要使用的数据。接下来,它调用 findAll() 从数据库中获取所有 Customer 对象。然后,它调用 findByFirstName() 根据名字获取单个 Customer。最后,它调用 findByLastName() 查找所有姓氏为 Smith 的客户。
| 默认情况下,Spring Boot 会尝试连接到本地托管的 MongoDB 实例。有关将您的应用程序指向其他地方托管的 MongoDB 实例的详细信息,请参阅参考文档。 |
构建可执行 JAR
您可以从命令行使用 Gradle 或 Maven 运行应用程序。您还可以构建一个包含所有必要依赖项、类和资源的单一可执行 JAR 文件并运行它。构建可执行 JAR 可以方便地在整个开发生命周期中,跨不同环境等,将服务作为应用程序进行交付、版本控制和部署。
如果您使用 Gradle,可以使用 ./gradlew bootRun 运行应用程序。或者,您可以使用 ./gradlew build 构建 JAR 文件,然后按如下方式运行 JAR 文件
如果您使用 Maven,可以使用 ./mvnw spring-boot:run 运行应用程序。或者,您可以使用 ./mvnw clean package 构建 JAR 文件,然后按如下方式运行 JAR 文件
| 这里描述的步骤创建了一个可运行的 JAR。您也可以构建一个经典的 WAR 文件。 |
由于 AccessingDataMongodbApplication 实现了 CommandLineRunner,因此在 Spring Boot 启动时会自动调用 run 方法。您应该看到类似以下内容的输出(以及其他输出,如查询)
== Customers found with findAll():
Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith']
Customer[id=51df1b0a3004cb49c50210f9, firstName='Bob', lastName='Smith']
== Customer found with findByFirstName('Alice'):
Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith']
== Customers found with findByLastName('Smith'):
Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith']
Customer[id=51df1b0a3004cb49c50210f9, firstName='Bob', lastName='Smith']
总结
恭喜您!您已经设置了一个 MongoDB 服务器,并编写了一个简单的应用程序,该应用程序使用 Spring Data MongoDB 将对象保存到数据库并从中获取,而无需编写具体的仓库实现。
| 如果您想通过基于超媒体的 RESTful 前端轻松暴露 MongoDB 仓库,请阅读使用 REST 访问 MongoDB 数据。 |
另请参阅
以下指南也可能对您有所帮助
想编写新指南或为现有指南贡献内容?请查看我们的贡献指南。
| 所有指南的代码均采用 ASLv2 许可发布,文字内容采用 署名-禁止演绎(Attribution, NoDerivatives)创意共享许可 发布。 |