Spring Boot 整合 MongoDB
書接上回,開始 Spring Boot 和 MongoDB 的整合。有了 Maven 這一項目管理構建工具,可以很容易的在 pom 文件中引入依賴來統一管理 jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
引入MongoDB相關依賴後,需要在 application.properties 中配置數據源連接信息
spring.data.mongodb.uri=mongodb://test:123%[email protected]:27017/baike
- 27017
是 MongoDB 默認端口
- %25
是用戶密碼字符 % 的 URI Encode 結果
- test
是 auth 校驗通過的 數據庫用戶名
CURD 操作舉例
-
數據庫文檔記錄對象映射[ORM]
public class Baike { // 對應文檔記錄主鍵 MongoDB 中的 _id private String id; private String desc; private List<String> tag = new ArrayList<String>(); private Comment comment = null; private Date crateDate = null; private Date updateDate = null; // 邏輯刪除狀態控制 默認爲 0 private int status = 0; // getter 和 setter 方法省略 }
在開始CURD操作前,根據 entity類 來梳理下 BSON 數據格式是長什麼樣子的!
{
"id": "MongoDB",
"desc": "NoSQL 數據庫",
"tag": [
"IT",
"DB"
],
"comment": {
"good": 68599,
"bad": 416
},
"crateDate": "2019-03-31T03:11:02.872+0000",
"updateDate": null
}
說明:
-
tag
字段是 List 列表數組類型,請求攜帶參數格式應爲:tag[0] = "IT"
等 -
comment
字段是 entity Obj 類型,請求攜帶參數格式應爲:comment.good = 48596
-
在BSON數據中,數組類型數據採用
[ ]
標識,對象類型數據採用{ }
標識 -
測試接口請求URL如下所示:
/api?id=MongoDB&desc=NoSQL 數據庫&tag[0]=IT&tag[1]=DB&comment.good=68599&comment.bad=416
-
MongoTemplate [核心]
在 Spring Boot 中 使用 MongoTemplate 作爲核心來進行 CURD 基本操作。MongoTemplate 是
線程安全的
。類比 JDBCTemplate,同樣都是數據庫操作的模板接口實現類,提供了便捷的數據庫訪問接口方法。如:insert、find、update等方法。
此外,MongoTemplate 可以直接自動注入到 Spring 管理的 Bean 中。這裏還需要簡單介紹兩個東東:Criteria 類 和 Query 類
- Criteria 類:封裝所有的操作數據庫文檔記錄操作語句,以方法的形式進行文檔記錄查詢 [where階段]
- Query 類:將文檔記錄查詢語句進一步封裝 [複雜查詢條件查詢階段]
- 簡單來講就是,通過 where 構建 Criteria 對象,然後調用不同的方法增加操作符 [lt、gt、and、or]。之後使用 Query 對象進行封裝後 添加最後的查詢條件 [排序、自增、分組等]。最後傳入 MongoTemplate的對應方法中,執行文檔記錄相關操作。
- 聽起來是不是一臉懵逼,這裏也可以類比 Mybatis 這一ORM 框架的複雜查詢構造規則,很類似,換湯不換藥的操作。下面將通過實際的代碼來體會上述文字表述的具體實現過程!
-
Create
MongoTemplate 中的
insert
方法,IDEA 中Ctrl
+F12
進入類信息概覽
這裏我們採用了最常用的 insert <Object obj> 這一接口方法,測試截圖如下:
上述圖中說明了,控制層請求處理方法、postMan模擬請求[含有格式]、測試結果返回以及相關日誌信息打印等信息。
-
Update
mongoTemplate 可以通過 update方法 進行文檔修改操作 [save 方法也可,詳情可以查看官網API]
這裏列出常用的文檔修改 API:
// 更新符合條件的第一條文檔記錄 public UpdateResult updateFirst(Query query, Update update, Class<?> entityClass) // 更新符合條件的所有記錄 public UpdateResult updateMulti(Query query, Update update, Class<?> entityClass)
這裏結合 Update 對象,進行文檔記錄的批量更新舉例,測試結果見下圖:
上述例子中需要說明:通過 where 構建 Criteria 對象 [含有 in 操作],採用 Update對象 中的 inc 方法添加自增的查詢條件,最後調用了mongoTemplate的批量更新方法,進行文檔記錄的更新。
-
Read [查詢]
調用 find 相關方法進行文檔記錄的查找操作,當然這裏也可以利用上述到 Criteria對象 構造查詢條件。
這裏就 findById這一簡單方法進行距離,測試截圖如下:
圖中的查詢條件爲:entity Obj の id (對應數據庫中文檔記錄主鍵
_id
),這個問題之前也已經提到了,文檔記錄的主鍵設置最好根據實際應用來進行設置。 -
Delete
關於刪除,需要多說兩句,這裏牽扯兩個概念:
邏輯刪除
和物理刪除
。顧名思義,前者不是真的將文檔記錄從數據庫中刪除,只是改變了其
狀態
[關於狀態,我們可以用電商應用舉例,某商品售罄,此時數據庫記錄應該將其刪除嗎? 不,因爲後續還可能引入,所以這裏僅僅將某商品做下架狀態設置,而當前在售商品中只展示未售罄的產品即可]。所以邏輯刪除
僅僅是對數據打上一個刪除標記
而已。而後者,物理刪除
就是實打實的講數據從存儲介質中徹底刪除掉!那麼,物理刪除的操作方法有什麼呢? mongoTemplate 中提供了 remove 方法進行文檔記錄的
物理刪除
,API舉例如下:public DeleteResult remove (Object object) public DeleteResult remove (Query query, Class<?> entityClass)
這裏的測試代碼也做了
邏輯刪除
,根據 entity 的 status 字段進行更新,表示實現邏輯刪除
由此可見,文檔記錄狀態字段已經被更改,後續的數據查詢展示工作都可以通過限制該狀態字段來實現了,這樣做也很方便。