使用 MongoDB 訪問資料

本指南將引導您完成使用 Spring Data MongoDB 構建應用程式的過程,該應用程式將資料儲存在基於文件的資料庫 MongoDB 中並從中檢索資料。

您將構建什麼

您將使用 Spring Data MongoDB 將 Customer POJO(普通舊 Java 物件)儲存在 MongoDB 資料庫中。

你需要什麼

如何完成本指南

與大多數 Spring 入門指南一樣,您可以從頭開始並完成每個步驟,也可以跳過您已熟悉的基本設定步驟。無論哪種方式,您最終都會得到可工作的程式碼。

從頭開始,請轉到從 Spring Initializr 開始

跳過基礎知識,請執行以下操作

完成後,您可以對照 gs-accessing-data-mongodb/complete 中的程式碼檢查您的結果。

從 Spring Initializr 開始

您可以使用這個預初始化專案,然後點選“生成”下載一個 ZIP 檔案。該專案已配置為符合本教程中的示例。

手動初始化專案

  1. 導航到 https://start.spring.io。此服務會為您拉取應用程式所需的所有依賴項,併為您完成大部分設定。

  2. 選擇 Gradle 或 Maven 以及您想要使用的語言。本指南假設您選擇了 Java。

  3. 點選 Dependencies 並選擇 Spring Data MongoDB

  4. 單擊生成

  5. 下載生成的 ZIP 檔案,這是一個已根據您的選擇配置好的 Web 應用程式存檔。

如果您的 IDE 集成了 Spring Initializr,您可以從 IDE 中完成此過程。
您還可以從 Github fork 該專案並在您的 IDE 或其他編輯器中開啟它。

安裝和啟動 MongoDB

設定好專案後,您可以安裝並啟動 MongoDB 資料庫。

如果您使用的是帶 Homebrew 的 Mac,您可以執行以下命令

$ brew install mongodb

使用 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 類,它有三個屬性:idfirstNamelastNameid 主要供 MongoDB 內部使用。您還有一個單獨的建構函式,用於在建立新例項時填充實體。

在本指南中,為了簡潔起見,省略了典型的 getter 和 setter 方法。

id 符合 MongoDB ID 的標準名稱,因此它不需要任何特殊註解來標記 Spring Data MongoDB。

另外兩個屬性 firstNamelastName 未加註解。假定它們被對映到與屬性本身同名的欄位。

便捷的 toString() 方法會打印出客戶的詳細資訊。

MongoDB 將資料儲存在集合中。Spring Data MongoDB 將 Customer 類對映到名為 customer 的集合中。如果您想更改集合的名稱,可以使用 Spring Data MongoDB 的 @Document 註解在類上。

建立簡單查詢

Spring Data MongoDB 專注於將資料儲存在 MongoDB 中。它還繼承了 Spring Data Commons 專案的功能,例如派生查詢的能力。本質上,您無需學習 MongoDB 的查詢語言。您可以編寫少數方法,然後查詢就會為您編寫。

要了解其工作原理,請建立一個查詢 Customer 文件的儲存庫介面,如下列清單(位於 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:分別為 CustomerString。此介面附帶許多操作,包括標準的 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 檔案

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

如果您使用 Maven,您可以透過使用 ./mvnw spring-boot:run 執行應用程式。或者,您可以使用 ./mvnw clean package 構建 JAR 檔案,然後按如下方式執行 JAR 檔案

java -jar target/gs-accessing-data-mongodb-0.1.0.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 許可,文字內容採用署名-禁止演繹知識共享許可

獲取程式碼