MongoDB 和 Quarkus 入門
一、簡介
Quarkus 是一種流行的 Java 框架,專為創建具有最小記憶體佔用和快速啟動時間的應用程式而最佳化。
當與流行的 NoSQL 資料庫 MongoDB 配合使用時,Quarkus 提供了一個強大的工具包,用於開發高效能、可擴展的應用程式。
在本教學中,我們將探索使用 Quarkus 設定 MongoDB、實作基本的 CRUD 操作,並使用 Quarkus 的物件文件映射器 (ODM) Panache 簡化這些操作。
2. 配置
2.1. Maven依賴
要將 MongoDB 與 Quarkus 一起使用,我們需要包含[quarkus-mongodb-client](https://mvnrepository.com/artifact/io.quarkus/quarkus-mongodb-client)
依賴項:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-mongodb-client</artifactId>
<version>3.13.0</version>
</dependency>
此依賴項提供了使用 MongoDB Java 用戶端與 MongoDB 資料庫互動所需的工具。
2.2.運行 MongoDB 資料庫
在本文中,我們將在 Docker 容器中執行 MongoDB。這是設定 MongoDB 實例的便捷方法,無需直接在我們的電腦上安裝 MongoDB。
我們先從 Docker Hub 中提取 MongoDB 映像:
docker pull mongo:latest
並啟動一個新容器:
docker run --name mongodb -d -p 27017:27017 mongo:latest
2.3.配置 MongoDB 資料庫
要設定的主要屬性是存取 MongoDB 的 URL。我們可以在連接字串中包含幾乎所有的配置。
我們可以為多個節點的副本集配置 MongoDB 用戶端,但在我們的範例中,我們將在localhost
上使用單一實例:
quarkus.mongodb.connection-string = mongodb://localhost:27017
3. 基本CRUD操作
現在我們已經準備好並連接了資料庫和項目,讓我們使用 Quarkus 提供的預設 Mongo 用戶端來實現基本的 CRUD(建立、讀取、更新、刪除)操作。
3.1.定義實體
在本節中,我們將定義Article
實體,代表 MongoDB 集合中的文件:
public class Article {
@BsonId
public ObjectId id;
public String author;
public String title;
public String description;
// getters and setters
}
我們的類別包含 id、作者、標題和描述欄位。 ObjectId
是 BSON(JSON 的二進位表示)類型,用作 MongoDB 文件的預設識別碼。 @BsonId
註解將欄位指定為 MongoDB 文件的識別碼 ( _id
)。
當套用於某個欄位時,表示該欄位應對應到 MongoDB 集合中的_id
欄位。使用這種組合,我們確保每個Article
文件都有一個唯一的標識符,MongoDB 可以使用該標識符有效地索引和檢索文件。
3.2.定義儲存庫
在本節中,我們將建立ArticleRepository
類,使用MongoClient
對Article
實體執行 CRUD 作業。此類別將管理與MongoDB
資料庫的連接,並提供建立、讀取、更新和刪除Article
文件的方法。
首先,我們將使用依賴注入來取得MongoClient
的實例:
@Inject
MongoClient mongoClient;
這使我們能夠與MongoDB
資料庫進行交互,而無需手動管理連線。
我們定義一個輔助方法getCollection()
來從文章資料庫中取得文章集合:
private MongoCollection<Article> getCollection() {
return mongoClient.getDatabase("articles").getCollection("articles", Article.class);
}
現在,我們可以使用集合提供者來執行基本的 CRUD 操作:
public void create(Article article) {
getCollection().insertOne(article);
}
create()
方法將新的 Article 文件插入 MongoDB 集合中。此方法使用insertOne()
新增提供的文章對象,確保其作為新條目儲存在articles
集合中。
public List<Article> listAll() {
return getCollection().find().into(new ArrayList<>());
}
listAll()
方法從 MongoDB 集合中檢索所有 Article 文件。它利用find()
方法來查詢所有文件並收集它們。我們也可以指定要傳回的集合類型。
public void update(Article article) {
getCollection().replaceOne(new org.bson.Document("_id", article.id), article);
}
update()
方法以提供的物件取代現有的Article
文件。它使用replaceOne()
來尋找具有匹配_id
的文檔並用新資料更新它。
public void delete(String id) {
getCollection().deleteOne(new org.bson.Document("_id", new ObjectId(id)));
}
delete()
方法透過 ID 從集合中刪除Article
文件。它建構一個過濾器來匹配_id
並使用deleteOne
刪除與此過濾器匹配的第一個文件。
3.3.定義資源
作為一個簡單的例子,我們將限制自己定義資源和儲存庫,而不目前實作服務層。
現在,我們需要做的就是建立資源,注入儲存庫,並為每個操作建立一個方法:
@Path("/articles")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ArticleResource {
@Inject
ArticleRepository articleRepository;
@POST
public Response create(Article article) {
articleRepository.create(article);
return Response.status(Response.Status.CREATED).build();
}
@GET
public List<Article> listAll() {
return articleRepository.listAll();
}
@PUT
public Response update(Article updatedArticle) {
articleRepository.update(updatedArticle);
return Response.noContent().build();
}
@DELETE
@Path("/{id}")
public Response delete(@PathParam("id") String id) {
articleRepository.delete(id);
return Response.noContent().build();
}
}
3.4.測試我們的 API
為了確保我們的API正常運作,我們可以使用curl ,這是一種多功能命令列工具,用於使用各種網路協定傳輸資料。
我們將在資料庫中新增一篇新文章。我們使用 HTTP POST 方法將表示文章的 JSON 有效負載傳送到/articles
端點:
curl -X POST http://localhost:8080/articles \
-H "Content-Type: application/json" \
-d '{"author":"John Doe","title":"Introduction to Quarkus","description":"A comprehensive guide to the Quarkus framework."}'
為了驗證我們的文章是否已成功存儲,我們可以使用 HTTP GET 方法從資料庫中取得所有文章:
curl -X GET http://localhost:8080/articles
透過執行此命令,我們將獲得一個 JSON 數組,其中包含目前儲存在資料庫中的所有文章:
[
{
"id": "66a8c65e8bd3a01e0a509f0a",
"author": "John Doe",
"title": "Introduction to Quarkus",
"description": "A comprehensive guide to Quarkus framework."
}
]
4. 將 Panache 與 MongoDB 結合使用
Quarkus 提供了一個名為Panache的附加抽象層,它簡化了資料庫操作並減少了樣板程式碼。有了 Panache,我們可以更專注於業務邏輯,而不是資料存取程式碼。讓我們看看如何使用 Panache 實現相同的 CRUD 操作。
4.1. Maven依賴
要將 Panache 與 MongoDB 一起使用,我們需要新增[quarkus-mongodb-panache](https://mvnrepository.com/artifact/io.quarkus/quarkus-mongodb-panache)
依賴項:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-mongodb-panache</artifactId>
<version>3.13.0</version>
</dependency>
4.2.定義實體
當使用 Panache 時,我們的實體類別將擴展PanacheMongoEntity
,它為常見的資料庫操作提供了內建方法。我們也將使用MongoEntity
註解來定義 MongoDB 集合:
@MongoEntity(collection = "articles", database = "articles")
public class Article extends PanacheMongoEntityBase {
private ObjectId id;
private String author;
private String title;
private String description;
// getters and setters
}
4.3.定義儲存庫
使用 Panache,我們透過擴充PanacheMongoRepository
來建立一個儲存庫。這為我們提供了 CRUD 操作,而無需編寫樣板程式碼:
@ApplicationScoped
public class ArticleRepository implements PanacheMongoRepository<Article> {}
擴充PanacheMongoRepository
類別時,可以使用幾種常用的方法來執行 CRUD 作業和管理 MongoDB 實體。現在,我們可以直接使用persist(), listAll(),
或findById
等方法。
4.4.定義資源
現在,我們需要做的就是建立新資源,該資源將使用新儲存庫,而無需所有樣板程式碼:
@Path("/v2/articles")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ArticleResource
@Inject
ArticleRepository articleRepository;
@POST
public Response create(Article article) {
articleRepository.persist(article);
return Response.status(Response.Status.CREATED).build();
}
@GET
public List<Article> listAll() {
return articleRepository.listAll();
}
@PUT
public Response update(Article updatedArticle) {
articleRepository.update(updatedArticle);
return Response.noContent().build();
}
@DELETE
@Path("/{id}")
public Response delete(@PathParam("id") String id) {
articleRepository.delete(id);
return Response.noContent().build();
}
}
4.5.測試API
我們也可以使用與其他範例相同的curl
指令來測試新的api。我們唯一要更改的是被呼叫的端點,這次呼叫/v2/articles
API。我們將建立新文章:
curl -X POST http://localhost:8080/v2/articles \
-H "Content-Type: application/json" \
-d '{"author":"John Doe","title":"Introduction to MongoDB","description":"A comprehensive guide to MongoDB."}'
我們將檢索現有的文章:
curl -X GET http://localhost:8080/v2/articles
5. 結論
在本文中,我們探討如何將 MongoDB 與 Quarkus 整合。我們配置了 MongoDB 並在 Docker 容器中運行它,為我們的應用程式設定了一個強大且可擴展的環境。我們示範了使用預設 Mongo 客戶端實作 CRUD 操作。
此外,我們還引入了 Panache,Quarkus 的物件文件映射器 (ODM),它透過減少樣板程式碼顯著簡化了資料存取。
與往常一樣,該應用程式的程式碼可在 GitHub 上取得。