更多Spring文章,歡迎點選 一灰灰Blog-Spring專題
SpringBoot結合mongodb進行業務開發,也屬於比較基本的需求了,本文為mongo系列的基本篇,主要就是環境搭建、工程的配置設定相關
I. 環境搭建
正式開始之前,第一步就是需要安裝Mongo的環境了,因為環境的安裝和我們spring的主題沒有太大的關係,因此我們選擇最簡單的使用姿勢:直接用docker來安裝mongo來使用
下面的安裝過程都是mac環境,其他作業系統可以直接安裝mongodb,移步相關教程
1. docker 安裝
可以直接到官網進行下載安裝,但是對系統版本有要求,所以需要使用Docker ToolBox
,實際試過之後,感覺不太好用,實際上是將docker安裝到虛擬機器中了,下面直接使用brew
命令進行安裝
安裝命令
brew cask install docker
複製程式碼
執行完畢之後,會多一個應用名為 docker
, 雙擊執行,輸入密碼等即可
2. mongo 安裝使用
直接使用官方的mongo映象即可,然後繫結埠對映,就可以在宿主機中使用mongo
# 下載映象
docker pull mongo
# 載入並執行映象
docker run --name mongo -p 27017:27017 -d mongo --auth
# 進入容器
docker exec -it d9132f1e8b26 /bin/bash
# 為mongo建立登入使用者和密碼
mongo
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
exit
複製程式碼
上面完畢之後,可以在宿主機進行連線測試,判斷是否安裝成功
II. SpringBoot工程配置
1. pom依賴
整個框架選擇的是spring-boot,所有spring這一套相關的pom配置少不了,我們主要需要注意的包就是spring-boot-starter-data-mongodb
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.45</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</pluginManagement>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
複製程式碼
2. 配置檔案
配置檔案如下,主要就是連線mongo的url
spring.data.mongodb.uri=mongodb://root:root@localhost:27017/basic?authSource=admin&authMechanism=SCRAM-SHA-1
複製程式碼
通過上面的例項,也知道格式如下:
mongodb://使用者名稱:密碼@host:port/dbNmae?引數
- 當沒有使用者名稱和密碼時,可以省略掉中間的
root:root@
; - 當需要認證時,請格外注意
- mongodb新版的驗證方式改成了
SCRAM-SHA-1
,所以引數中一定一定一定得加上?authSource=admin&authMechanism=SCRAM-SHA-1
- 如果將mongodb的驗證方式改成了
MONGODB-CR
, 則上面的可以不需要
- mongodb新版的驗證方式改成了
3. 測試使用
寫一個簡單的測試類,看下mongodb是否連線成功,是否可以正常操作
@Slf4j
@Component
public class MongoTemplateHelper {
@Getter
@Setter
private MongoTemplate mongoTemplate;
public MongoTemplateHelper(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
/**
* 儲存記錄
*
* @param params
* @param collectionName
*/
public void saveRecord(Map<String, Object> params, String collectionName) {
mongoTemplate.save(params, collectionName);
}
/**
* 精確查詢方式
*
* @param query
* @param collectionName
*/
public void queryRecord(Map<String, Object> query, String collectionName) {
Criteria criteria = null;
for (Map.Entry<String, Object> entry : query.entrySet()) {
if (criteria == null) {
criteria = Criteria.where(entry.getKey()).is(entry.getValue());
} else {
criteria.and(entry.getKey()).is(entry.getValue());
}
}
Query q = new Query(criteria);
Map result = mongoTemplate.findOne(q, Map.class, collectionName);
log.info("{}", result);
}
}
複製程式碼
上面提供了兩個方法,新增和查詢,簡單的使用姿勢如
@SpringBootApplication
public class Application {
private static final String COLLECTION_NAME = "personal_info";
public Application(MongoTemplateHelper mongoTemplateHelper) {
Map<String, Object> records = new HashMap<>(4);
records.put("name", "小灰灰Blog");
records.put("github", "https://github.com/liuyueyi");
records.put("time", LocalDateTime.now());
mongoTemplateHelper.saveRecord(records, COLLECTION_NAME);
Map<String, Object> query = new HashMap<>(4);
query.put("name", "小灰灰Blog");
mongoTemplateHelper.queryRecord(query, COLLECTION_NAME);
}
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
複製程式碼
然後開始執行,檢視輸出,結果演示如下
4. 說明
最後針對認證的問題,需要額外提一句,開始測試的時候,使用的配置如下
spring.data.mongodb.username=root
spring.data.mongodb.password=root
spring.data.mongodb.authentication-database=basic
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
複製程式碼
然而因為mongo採用的是SHA-1加密方式,所以始終驗證不通過;然後查了一下,各種讓改mongo的驗證版本,改回去用CR的方式;但明顯這種並不是一種好的解決方式,既然新的版本選擇了新的加密方式,總有他的理由,所以應該改的還是spring的使用姿勢;目前還沒找到匹配上面這種配置方式的解決方案;
本文選擇的是用url的方式指定加密方式來解決這個問題,當然研究下後面這種方式內部實現,應該就能知道前面的可以怎麼解決,這點記下來,後續再開坑填
III. 其他
0. 專案
- 工程:spring-boot-demo
- module: 110-mongo-basic
1. 一灰灰Blog
- 一灰灰Blog個人部落格 blog.hhui.top
- 一灰灰Blog-Spring專題部落格 spring.hhui.top
一灰灰的個人部落格,記錄所有學習和工作中的博文,歡迎大家前去逛逛
2. 宣告
盡信書則不如,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
3. 掃描關注
一灰灰blog
知識星球