$ 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)創意共享許可 釋出。 |