Spring Boot 2.0 讀書筆記_17:MongoDB 下 [整合 Spring Boot]

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 字段進行更新,表示實現 邏輯刪除在這裏插入圖片描述

    由此可見,文檔記錄狀態字段已經被更改,後續的數據查詢展示工作都可以通過限制該狀態字段來實現了,這樣做也很方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章