Like Share Discussion Bookmark Smile

J.J. Huang   2019-05-09   Spring Boot   瀏覽次數:

SpringBoot - 第四十四章 | MongoDB的集成和使用

之前有介紹到Redis的集合和使用,可以參考下面文章。
SpringBoot - 第二十二章 | Redis的集成和使用(一)
SpringBoot - 第二十三章 | Redis的集成和使用(二)
當然除了Redis之後,我們在互聯網產品中還經常會用到另外一款著名的NoSQL資料庫MongoDB。

下面就來簡單介紹一下MongoDB,並且通過一個例子來介紹Spring Boot中對MongoDB訪問的配置和使用。

MongoDB 介紹

MongoDB官方

MongoDB(來自於英文單詞“Humongous”,中文含義為“龐大”)是可以應用於各種規模的企業、各個行業以及各類應用程序的開源資料庫。作為一個適用於敏捷開發的資料庫,MongoDB的資料模式可以隨著應用程序的發展而靈活地更新。與此同時,它也為開發人員 提供了傳統資料庫的功能:二級索引,完整的查詢系統以及嚴格一致性等等。 MongoDB能夠使企業更加具有敏捷性和可擴展性,各種規模的企業都可以通過使用MongoDB來建立新的應用,提高與客戶之間的工作效率,加快產品上市時間,以及降低企業成本。

MongoDB是專為可擴展性,高性能和高可用性而設計的資料庫。它可以從單伺服器部署擴展到大型、複雜的多資料中心架構。利用內存計算的優勢,MongoDB能夠提供高性能的資料讀寫操作。 MongoDB的本地複制和自動故障轉移功能使你的應用程序具有企業級的可靠性和操作靈活性。

簡單來說,MongoDB是一個基於分佈式文件存儲的資料庫,它是一個介於關係資料庫和非關係資料庫之間的產品,其主要目標是在鍵/值存儲方式(提供了高性能和高度伸縮性)和傳統的RDBMS系統(具有豐富的功能)之間架起一座橋樑,它集兩者的優勢於一身。

MongoDB支持的資料結構非常鬆散,是類似json的bson格式,因此可以存儲比較複雜的資料類型,也因為他的存儲格式也使得它所存儲的資料在Nodejs程序應用中使用非常流暢。

傳統的關係資料庫一般由資料庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB是由資料庫(database)、集合(collection)、文件對象(document)三個層次組成。 MongoDB對於關係型資料庫裡的表,但是集合中沒有列、行和關係概念,這體現了模式自由的特點。

MongoDB中的一條記錄就是一個文件,是一個資料結構,由字段和值對組成。 MongoDB文件與JSON對像類似。字段的值有可能包括其它文件、數組以及文件數組。 MongoDB支持OS X、Linux及Windows等操作系統,並提供了Python,PHP,Ruby,Java及C++語言的驅動程序,社區中也提供了對Erlang及.NET等平台的驅動程序。

MongoDB的適合對大量或者無固定格式的資料進行存儲,比如:日誌、緩存等。對事物支持較弱,不適用複雜的多文件(多表)的級聯查詢。

準備工作

Docker MongoDB準備

參考Docker - 第十一章 | 安裝MongoDB

可視化工具

這邊推薦幾款不錯的可視化工具,非常簡單安裝和使用。

我這邊使用的是Navicat for MongoDB

相關配置

Spring Boot中可以通過在pom.xml中加入spring-boot-starter-data-mongodb引入對mongodb的訪問支持依賴。它的實現依賴spring-data-mongodb。是的,你沒有看錯,又是spring-data的子項目,之前介紹過spring-data-jpa、spring-data-redis,對於mongodb的訪問,spring-data也提供了強大的支持。

加入pom的依賴

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

參數配置

在src/main/resources/application.properties中配置MongoDB服務端訊息

1
2
3
4
# MongoDB
# 單機 mongodb://name:pass@ip:port/database
# 集群 mongodb://user:pwd@ip1:port1,ip2:port2/database
spring.data.mongodb.uri=mongodb://localhost:27017/jjtest

建立實體 (Entity)

建立資料訪問對象 (Dao)

單元測試

測試結果

可以看到測試案例,測試通過。

看資料庫內容可以看到最後剩下J.J.這筆資料還存在。

  • 眼尖的你一定看到有看到一個_class,這是什麼東西了?
    其實該字段就是用來映射Entity的,更具體的說,是為了方便處理Entity中存在繼承的情況,增加系統的擴展性。
    可以參考此篇文章MongoDB中_class字段的作用

  • 至於可不可以將這個_class移除呢?
    答案是可以的,而且非常簡單,只需要配置一下MongoConfig就可以了,具體這邊就不示範,直接參考文章。
    SpringBoot v2.x MongodB 中 去除 _class 字段

註:以上參考了
SpringBoot v2.x MongodB 中 去除 _class 字段
MongoDB中_class字段的作用
oKongSpringBoot | 第三十一章:MongoDB的集成和使用 文章。
程序猿DDSpring Boot中使用MongoDB数据库 文章。