使用Spring Data访问MongoDB数据库

本文将引导我们如何使用Spring Data MongoDB构建应用程序,并使用应用程序在MongoDB(基于文档的数据库)中存储数据与检索数据。

需要新建什么

我们要使用Spring Data MongoDB将CustomerPOJO存储在MongoDB数据库中。

我们需要准备什么

 大约15分钟

 自己喜欢的文本编辑器或者IDE

 JDK 1.8 或者更高版本

 Gradle 4+或者Maven 3.2+

 我们也可以将代码直接导入到IDE:

Spring Tool Suite (STS)

IntelliJ IDEA

如何完成本指南

与大多数Spring 入门指南一样,我们可以从头开始并完成每个步骤,或者可以绕过熟知的基本设置步骤。不论采用哪种方式,最终还是要使用运行代码。

要从头开始,请继续使用Gradle构建。

跳过基础知识,执行以下操作:

 下载并解压源文件,使用Git克隆:git clone https://github.com/spring-guides/gs-accessing-data-mongodb.git

 CD跳转进入 gs-accessing-data-mongodb/initial

 安装并启动MongoDB。

安装完成后,可以使用代码检查安装成功:gs-accessing-data-mongodb/complete。

使用Gradle构建

首先,设置一个基本的构建脚本。使用Spring构建应用程序时,可以使用任何喜欢的构建系统,此处包含了使用Gradle和Maven所需的代码。如果不熟悉Gradle和Maven,请参阅使用Gradle 构建Java项目或使用Maven构建Java项目。

创建目录结构

在选择的项目目录中,创建以下子目录结构; 例如,使用mkdir -p src/main/java/helloon * nix系统:

└── src
 └── main
 └── java
 └── hello

建立Gradle构建文件

下面是最初的Gradle构建文件。

build.gradle
buildscript {
 repositories {
 mavenCentral()
 }
 dependencies {
 classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.5.RELEASE")
 }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
bootJar {
 baseName = 'gs-accessing-data-mongodb'
 version = '0.1.0'
}
repositories {
 mavenCentral()
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
 compile("org.springframework.boot:spring-boot-starter-data-mongodb")
 testCompile("org.springframework.boot:spring-boot-starter-test")
}

Spring Boot gradle plugin提供了许多便捷的功能,插件会提供以下:

 收集类路径上的所有jar并构建一个可运行的“über-jar”,这使得执行和传输服务更加方便。

 搜索public static void main()标记为可运行类的方法。

 提供了一个内置的依赖项解析器,设置版本号以匹配Spring Boot依赖项。可以选择任何您喜欢的版本去翻盖默认版本,但它默认为Boot的所选版本。

使用Maven构建

首先,设置一个基本的构建脚本。使用Spring构建应用程序时,可以使用任何喜欢的构建系统,此处使用Maven所需的代码。如果不熟悉Maven,请参阅使用Maven构建Java项目。

创建目录结构

在选择的项目目录中,创建以下子目录结构; 例如:mkdir -p src/main/java/hello on *nix systems:

└── src
 └── main
 └── java
 └── hello

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
 <modelversion>
 4.0.0
 </modelversion>
 
 <groupid>
 org.springframework
 </groupid>
 
 <artifactid>
 gs-accessing-data-mongodb
 </artifactid>
 
 <version>
 0.1.0
 </version>
 
 <parent>
 
 <groupid>
 org.springframework.boot
 </groupid>
 
 <artifactid>
 spring-boot-starter-parent
 </artifactid>
 
 <version>
 2.0.5.RELEASE
 </version>
 
 </parent>
 
 <properties>
 
 <java version="">
 1.8
 </java>
 
 </properties>
 
 <dependencies>
 
 <dependency>
 
 <groupid>
 org.springframework.boot
 </groupid>
 
 <artifactid>
 spring-boot-starter-data-mongodb
 </artifactid>
 
 </dependency>
 
 <dependency>
 
 <groupid>
 org.springframework.boot
 </groupid>
 
 <artifactid>
 spring-boot-starter-test
 </artifactid>
 
 <scope>
 test
 </scope>
 
 </dependency>
 
 </dependencies>
 
 <build>
 
 <plugins>
 
 <plugin>
 
 <groupid>
 org.springframework.boot
 </groupid>
 
 <artifactid>
 spring-boot-maven-plugin
 </artifactid>
 
 </plugin>
 
 </plugins>
 
 </build>
</project>

Spring Boot Maven plugin提供了许多便捷的功能,插件会提供以下:

 收集类路径上的所有jar并构建一个可运行的“über-jar”,这使得执行和传输服务更加方便。

 搜索public static void main()标记为可运行类的方法。

 提供了一个内置的依赖项解析器,它设置版本号以匹配Spring Boot依赖项。可以选择任何您喜欢的版本去翻盖默认版本,但它默认为Boot的所选版本。

使用IDE构建

 阅读指南直接导入Spring Tool Suite。

 阅读指南,如何使用IntelliJ IDEA。

安装并启动MongoDB

设置项目后,即可安装并启动MongoDB数据库。

如果您使用的是Mac自带的homebrew,这很简单:

$ brew install mongodb

使用MacPorts:

$ port install mongodb

如Redhat,Ubuntu,Debian,CentOS和Windows等系统,请参阅http://docs.mongodb.org/manual/installation/说明。

安装MongoDB后,在控制台窗口中启动它。此命令还会启动服务器进程。

$ mongod

可能不会比这个看到的更多:

all output going to: /usr/local/var/log/mongodb/mongo.log

定义一个简单的实体

MongoDB是一个NoSQL文档存储。在这个例子中,将存储Customer对象。

src/main/java/hello/Customer.java
package hello;
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内部使用。 在创建新实例时,还有一个构造函数来填充实体。

在本章中,为简洁起见,省略了典型的getters and setters。

id适合MongoDB id的标准名称,因此它不需要任何特殊的注释来为Spring Data MongoDB标记它。

其他两个属性firstName和lastName未注释。 假设它们将映射到与属性本身共享同一名称的字段。

toString()方法方便打印出有关customer的详细信息。

Customer类映射到一个名为customer的集合。 如果要更改集合的名称,可以在类上使用Spring Data MongoDB的@Document注解。

创建简单的查询

Spring Data MongoDB专注于在MongoDB中存储数据。 它还继承了Spring Data Commons项目的功能,例如派生查询的功能。 基本上,我们不必学习MongoDB的查询语言;可以简单地编写一些方法,并为我们编写查询。

要查看其工作原理,请创建一个查询Customer文档的存储库接口。

src/main/java/hello/CustomerRepository.java
package hello;
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);
}
 </customer>
</customer>

CustomerRepository扩展了MongoRepository接口,并插入了值类型和id的工作方式:Customer和String。 开箱即用,这个接口带有许多操作,包括标准CRUD操作(create-read-update-delete)。

我们还可以根据需要定义其他查询,只需声明其方法签名即可。 这种情况下,添加findByFirstName,它基本上搜索Customer类型的文档,并找到与firstName匹配的文档。

还可以使用findByLastName按姓氏查找人员列表。

在典型的Java应用程序中,编写了一个实现CustomerRepository的类并自己编写查询。 Spring Data MongoDB如此好用的原因在于我们无需创建此实现。 Spring Data MongoDB在运行应用程序时即时创建它。

让我们把它连接组合起来看看它是什么样子!

创建一个Application类

在这里,我们创建一个包含所有组件的Application类。

src/main/java/hello/Application.java

package hello;
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 Application implements CommandLineRunner {
 @Autowired
 private CustomerRepository repository;
 public static void main(String[] args) {
 SpringApplication.run(Application.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);
 }
 }
}

@SpringBootApplication是一个便捷注释,添加了以下所有内容:

 @Configuration将类标记为应用程序上下文的bean定义源。

 @EnableAutoConfiguration告诉Spring Boot根据类路径设置,其他bean和各种属性设置开始添加bean。

 通常你会为Spring MVC应用程序添加@EnableWebMvc,但Spring Boot会在类路径上看到spring-webmvc时自动添加它。 这会将应用程序标记为Web应用程序并激活关键行为,例如设置DispatcherServlet。

 @ComponentScan告诉Spring在hello包中寻找其他组件,配置和服务,允许它找到控制器。

The main()方法使用Spring Boot的SpringApplication.run()方法来启动应用程序。 你是否注意到没有一行XML? 也没有web.xml文件。 此Web应用程序是100%纯Java,无需处理配置任何通道或基础结构。

Spring Boot将自动处理这些存储库,只要它们包含在@SpringBootApplication类的同一个包(或子包)中。 要更好地控制注册过程,可以使用@EnableMongoRepositories注释。

默认情况下,@ EnableMongoRepositories将扫描当前包以查找扩展Spring Data存储库接口之一的任何接口。使用它的basePackageClasses = MyRepository.class可以安全地告诉Spring Data MongoDB按类型扫描不同的根包,如果你的项目布局有多个项目而且找不到你的存储库。

Spring Data MongoDB使用MongoTemplate来执行find *方法后面的查询。可以自己使用该模板进行更复杂的查询,但本章不包含这些内容。

应用程序包括一个main()方法,它自动装配CustomerRepository的一个实例:Spring Data MongoDB动态创建一个代理并在那里注入它。 我们通过一些测试使用CustomerRepository。 首先,它保存了一些Customer对象,演示了save()方法并设置了一些数据。 接下来,它调用findAll()从数据库中获取所有Customer对象。 然后它调用findByFirstName()以她的名字获取单个Customer。 最后,它调用findByLastName()来查找姓氏为“Smith”的所有客户。

Spring Boot默认尝试连接到本地托管的MongoDB实例。 阅读参考文档,了解有关将应用程序指向其他地方托管的MongoDB实例的详细信息。

构建可执行的JAR

我们可以使用Gradle或Maven从命令行运行该应用程序。 或者,可以构建一个包含所有必需依赖项,类和资源的可执行JAR文件,然后运行该文件。 这使得在整个开发生命周期中,跨不同环境等将服务作为应用程序发布,版本和部署变得容易。

如果使用的是Gradle,则可以使用./gradlew bootRun运行该应用程序。 或者可以使用./gradlew build构建JAR文件。 然后可以运行JAR文件:

java -jar build/libs/gs-accessing-data-mongodb-0.1.0.jar

如果使用的是Maven,则可以使用./mvnw spring-boot:run运行该应用程序。 或者使用./mvnw clean包构建JAR文件。 然后运行JAR文件:

java -jar target/gs-accessing-data-mongodb-0.1.0.jar

上面的过程将创建一个可运行的JAR。 也可以选择构建经典WAR文件。

当我们的Application实现CommandLineRunner时,在启动时会自动调用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将对象保存到数据库并从数据库中获取它们 – 所有这些都没有编写具体的存储库实现。

欢迎工作一到五年的Java工程师朋友们加入Java程序员开发: 721575865

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

相关推荐