$ brew install mongodb
使用 MongoDB 訪問資料
本指南將引導您完成使用 Spring Data MongoDB 構建應用程式的過程,該應用程式將資料儲存在基於文件的資料庫 MongoDB 中並從中檢索資料。
您將構建什麼
您將使用 Spring Data MongoDB 將 Customer POJO(普通舊 Java 物件)儲存在 MongoDB 資料庫中。
你需要什麼
-
大約 15 分鐘
-
一個喜歡的文字編輯器或 IDE
-
Java 17 或更高版本
-
您還可以將程式碼直接匯入到您的 IDE 中
如何完成本指南
與大多數 Spring 入門指南一樣,您可以從頭開始並完成每個步驟,也可以跳過您已熟悉的基本設定步驟。無論哪種方式,您最終都會得到可工作的程式碼。
要從頭開始,請轉到從 Spring Initializr 開始。
要跳過基礎知識,請執行以下操作
-
下載並解壓本指南的源儲存庫,或使用 Git 克隆它:
git clone https://github.com/spring-guides/gs-accessing-data-mongodb.git -
進入
gs-accessing-data-mongodb/initial目錄 -
跳轉到安裝和啟動 MongoDB。
完成後,您可以對照 gs-accessing-data-mongodb/complete 中的程式碼檢查您的結果。
從 Spring Initializr 開始
您可以使用這個預初始化專案,然後點選“生成”下載一個 ZIP 檔案。該專案已配置為符合本教程中的示例。
手動初始化專案
-
導航到 https://start.spring.io。此服務會為您拉取應用程式所需的所有依賴項,併為您完成大部分設定。
-
選擇 Gradle 或 Maven 以及您想要使用的語言。本指南假設您選擇了 Java。
-
點選 Dependencies 並選擇 Spring Data MongoDB。
-
單擊生成。
-
下載生成的 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 文件的儲存庫介面,如下列清單(位於 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 資料。 |