前言
來啦老鐵贬蛙!
筆者學習Spring Boot有一段時間了,附上Spring Boot系列學習文章痒给,歡迎取閱贪薪、賜教:
- 5分鐘入手Spring Boot;
- Spring Boot數(shù)據(jù)庫交互之Spring Data JPA;
- Spring Boot數(shù)據(jù)庫交互之Mybatis;
- Spring Boot視圖技術;
- Spring Boot之整合Swagger;
- Spring Boot之junit單元測試踩坑;
- 如何在Spring Boot中使用TestNG;
- Spring Boot之整合logback日志;
- Spring Boot之整合Spring Batch:批處理與任務調(diào)度;
- Spring Boot之整合Spring Security: 訪問認證;
- Spring Boot之整合Spring Security: 授權管理;
- Spring Boot之多數(shù)據(jù)庫源:極簡方案;
在上一篇文章Spring Boot之多數(shù)據(jù)庫源:極簡方案中,我們已經(jīng)能在Spring Boot項目中使用Oracle胖笛、Mysql等數(shù)據(jù)庫源网持,并在文末留了一個懸念:
-
如何在Spring Boot項目中使用MongoDB數(shù)據(jù)庫源?
今天长踊,他來了功舀!
項目代碼仍用已上傳的Git Hub倉庫,歡迎取閱:
整體步驟
- 添加MongoDB項目依賴身弊;
- 添加MongoDB數(shù)據(jù)庫信息辟汰;
- 實現(xiàn)MongoDB交互過程;
- 驗證MongoDB交互效果阱佛;
1. 添加MongoDB項目依賴位喂;
在項目pom.xml文件中添加MongoDB依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
注意窟扑,spring-boot-starter-data-mongodb是Spring Boot默認支持的,不需要帶上版本號,默認與spring-boot-starter-parent是同一版本掘鄙;
記得安裝一下依賴:
mvn install -Dmaven.test.skip=true -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true
2. 添加MongoDB數(shù)據(jù)庫信息;
在application.properties中聲明MongoDB的數(shù)據(jù)庫信息即可袱耽,換句話說蚁趁,就是要告訴Spring Boot,我們數(shù)據(jù)庫的用戶名壮莹、密碼翅帜、數(shù)據(jù)庫位置、端口等信息命满,如:
#configuration for mongo
spring.data.mongodb.uri=mongodb://username:password@127.0.0.1:27017/database?ssl=true
稍微說明一下:
- username:目標數(shù)據(jù)庫的用戶名涝滴,請依實際情況填寫;
- password:目標數(shù)據(jù)庫的密碼,請依實際情況填寫歼疮;
- 127.0.0.1:目標數(shù)據(jù)庫host杂抽,請依實際情況填寫;
- 27017:目標數(shù)據(jù)庫端口,請依實際情況填寫韩脏;
- database:目標數(shù)據(jù)庫名稱缩麸,請依實際情況填寫;
- ssl=true:交互時采用ssl協(xié)議赡矢,請依實際情況使用杭朱;
對應到MongoDB客戶端工具,如Robotmongo:
3. 實現(xiàn)MongoDB交互過程吹散;
在實現(xiàn)交互過程之前弧械,我先介紹一下我手上的數(shù)據(jù)庫,由于使用了公司的測試數(shù)據(jù)庫空民,不方便公開刃唐,因此進行了局部遮擋:
- 我使用數(shù)據(jù)庫表agent_config進行演示;
- agent_config表共有2個根節(jié)點:_id和application界轩,_id為唯一標識画饥,application為具體業(yè)務信息;
接下來我們來實現(xiàn)交互過程:
1). 創(chuàng)建AgentConfig實體類浊猾;
在domain包下創(chuàng)建AgentConfig實體類:
package com.github.dylanz666.domain;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
/**
* @author : dylanz
* @since : 09/19/2020
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@Document(collection = "agent_config")
public class AgentConfig implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String _id;
private JSONObject application;
}
注意關鍵一行代碼抖甘,這行代碼指明了數(shù)據(jù)庫表名為agent_config表;
@Document(collection = "agent_config")
2). 創(chuàng)建repository包葫慎,用于存放MongoDB交互的接口单山;
3). 在repository包內(nèi)創(chuàng)建AgentConfigRepository類;
package com.github.dylanz666.repository;
import com.github.dylanz666.domain.AgentConfig;
import org.springframework.stereotype.Repository;
import java.util.Optional;
/**
* @author : dylanz
* @since : 09/19/2020
*/
@Repository
public interface AgentConfigRepository {
Optional<AgentConfig> findById(String id);
Optional<AgentConfig> saveAgentConfig(AgentConfig agentConfig);
}
為了演示MongoDB交互過程幅疼,我準備開發(fā)2個API米奸,一個為獲取agent_config表中的數(shù)據(jù),一個為更新agent_config中的數(shù)據(jù)爽篷;
4). 在service包下創(chuàng)建AgentConfigService類悴晰,編寫service;
package com.github.dylanz666.service;
import com.github.dylanz666.domain.AgentConfig;
import com.github.dylanz666.repository.AgentConfigRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* @author : dylanz
* @since : 09/19/2020
*/
@Service
public class AgentConfigService implements AgentConfigRepository {
@Autowired
private MongoTemplate mongoTemplate;
public Optional<AgentConfig> findById(String id) {
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(id));
return Optional.ofNullable(mongoTemplate.findOne(query, AgentConfig.class));
}
public Optional<AgentConfig> saveAgentConfig(AgentConfig agentConfig) {
String id = agentConfig.get_id();
Query query = new Query(Criteria.where("_id").is(id));
Update update = new Update();
update.set("application", agentConfig.getApplication());
mongoTemplate.updateFirst(query, update, AgentConfig.class);
return findById(id);
}
}
我們在service內(nèi)實現(xiàn)了AgentConfigRepository接口逐工,可供controller使用;
5). controller內(nèi)創(chuàng)建2個演示API铡溪;
在controller包內(nèi)創(chuàng)建AgentConfigController,實現(xiàn)一個使用MongoDB的API:
package com.github.dylanz666.controller;
import com.github.dylanz666.domain.AgentConfig;
import com.github.dylanz666.service.AgentConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
/**
* @author : dylanz
* @since : 09/19/2020
*/
@RestController
public class AgentConfigController {
@Autowired
private AgentConfigService agentConfigService;
@GetMapping("/agent/config/{id}")
@ResponseBody
public Optional<AgentConfig> getAgentConfigById(@PathVariable(name = "id") String id) {
return agentConfigService.findById(id);
}
@PostMapping("/agent/config")
@ResponseBody
public Optional<AgentConfig> save(@RequestBody AgentConfig agentConfig) {
return agentConfigService.saveAgentConfig(agentConfig);
}
}
至此泪喊,項目整體結(jié)構如下:
4. 驗證MongoDB交互效果棕硫;
-
啟動項目:
-
調(diào)用API:
1). 首先在瀏覽器中直接訪問API:http://127.0.0.1:8080/agent/config/5b3e205fd33415007ef7b6f5
2). 使用postman更新MongoDB中的數(shù)據(jù):
我們將ddsTimeIntervalCount這個字段的值從1改為2,并且能夠在response body中得知袒啼,ddsTimeIntervalCount的確有被更新成功哈扮!
很明顯纬纪,我們已經(jīng)能夠如我們預期,正確地訪問滑肉、修改MongoDB中對應的數(shù)據(jù)了包各,事實上,對MongoDB的增刪改查已不再有壁壘靶庙,我們已經(jīng)打通MongoDB這條線了N食!六荒!
至此护姆,我們的Spring Boot多數(shù)據(jù)庫源從此多了MongoDB支持,Spring Boot多數(shù)據(jù)庫源又上一層樓L突鳌G┰颉!
如果本文對您有幫助铐料,麻煩點贊+關注!
謝謝豺旬!