使用 MongoDB 存取資料

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

您將建構什麼

您將使用 Spring Data MongoDB 將 Customer POJO (Plain Old Java Objects) 儲存在 MongoDB 資料庫中。

您需要什麼

如何完成本指南

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

若要從頭開始,請繼續前往 從 Spring Initializr 開始

若要跳過基本步驟,請執行以下操作

當您完成時,您可以將您的結果與 gs-accessing-data-mongodb/complete 中的程式碼進行比較。

從 Spring Initializr 開始

您可以使用這個 預先初始化的專案,然後點擊 Generate 以下載 ZIP 檔案。此專案已配置為符合本教學中的範例。

若要手動初始化專案

  1. 導覽至 https://start.spring.io。此服務會拉取應用程式所需的所有相依性,並為您完成大部分設定。

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

  3. 點擊 Dependencies 並選擇 Spring Data MongoDB

  4. 點擊 Generate

  5. 下載產生的 ZIP 檔案,這是一個已使用您的選擇配置的 Web 應用程式的封存檔。

如果您的 IDE 具有 Spring Initializr 整合,您可以從您的 IDE 完成此過程。
您也可以從 Github 分叉專案,並在您的 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 授權發布程式碼,並以 姓名標示-禁止改作創用 CC 授權條款 發布寫作內容。

取得程式碼