$ brew install mongodb
使用 MongoDB 存取資料
本指南將引導您使用 Spring Data MongoDB 建構一個應用程式,該應用程式將資料儲存在基於文件的資料庫 MongoDB 中並從中檢索資料。
您將建構什麼
您將使用 Spring Data MongoDB 將 Customer
POJO (Plain Old Java Objects) 儲存在 MongoDB 資料庫中。
您需要什麼
-
約 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
-
跳到 安裝並啟動 MongoDB。
當您完成時,您可以將您的結果與 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 分叉專案,並在您的 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 資料。 |