Spring Boot之使用MongoDB數(shù)據(jù)庫源

前言

來啦老鐵贬蛙!

筆者學習Spring Boot有一段時間了,附上Spring Boot系列學習文章痒给,歡迎取閱贪薪、賜教:

  1. 5分鐘入手Spring Boot;
  2. Spring Boot數(shù)據(jù)庫交互之Spring Data JPA;
  3. Spring Boot數(shù)據(jù)庫交互之Mybatis;
  4. Spring Boot視圖技術;
  5. Spring Boot之整合Swagger;
  6. Spring Boot之junit單元測試踩坑;
  7. 如何在Spring Boot中使用TestNG;
  8. Spring Boot之整合logback日志;
  9. Spring Boot之整合Spring Batch:批處理與任務調(diào)度;
  10. Spring Boot之整合Spring Security: 訪問認證;
  11. Spring Boot之整合Spring Security: 授權管理;
  12. Spring Boot之多數(shù)據(jù)庫源:極簡方案;

在上一篇文章Spring Boot之多數(shù)據(jù)庫源:極簡方案中,我們已經(jīng)能在Spring Boot項目中使用Oracle胖笛、Mysql等數(shù)據(jù)庫源网持,并在文末留了一個懸念:

  • 如何在Spring Boot項目中使用MongoDB數(shù)據(jù)庫源?

今天长踊,他來了功舀!

項目代碼仍用已上傳的Git Hub倉庫,歡迎取閱:

整體步驟

  1. 添加MongoDB項目依賴身弊;
  2. 添加MongoDB數(shù)據(jù)庫信息辟汰;
  3. 實現(xiàn)MongoDB交互過程;
  4. 驗證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:

host,port
username,password,database
ssl

3. 實現(xiàn)MongoDB交互過程吹散;

在實現(xiàn)交互過程之前弧械,我先介紹一下我手上的數(shù)據(jù)庫,由于使用了公司的測試數(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é)構如下:

項目整體結(jié)構

4. 驗證MongoDB交互效果棕硫;

  • 啟動項目:
啟動項目1
啟動項目2
  • 調(diào)用API:

1). 首先在瀏覽器中直接訪問API:http://127.0.0.1:8080/agent/config/5b3e205fd33415007ef7b6f5

訪問API

2). 使用postman更新MongoDB中的數(shù)據(jù):

更新數(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┰颉!

如果本文對您有幫助铐料,麻煩點贊+關注!

謝謝豺旬!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钠惩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子族阅,更是在濱河造成了極大的恐慌篓跛,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坦刀,死亡現(xiàn)場離奇詭異愧沟,居然都是意外死亡,警方通過查閱死者的電腦和手機鲤遥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門沐寺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盖奈,你說我怎么就攤上這事混坞。” “怎么了钢坦?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵究孕,是天一觀的道長。 經(jīng)常有香客問我爹凹,道長厨诸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任禾酱,我火速辦了婚禮微酬,結(jié)果婚禮上绘趋,老公的妹妹穿的比我還像新娘。我一直安慰自己得封,他們只是感情好埋心,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忙上,像睡著了一般拷呆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疫粥,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天茬斧,我揣著相機與錄音,去河邊找鬼梗逮。 笑死项秉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的慷彤。 我是一名探鬼主播娄蔼,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼底哗!你這毒婦竟也來了岁诉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤跋选,失蹤者是張志新(化名)和其女友劉穎涕癣,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體前标,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡坠韩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了炼列。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片只搁。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俭尖,靈堂內(nèi)的尸體忽然破棺而出须蜗,到底是詐尸還是另有隱情,我是刑警寧澤目溉,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布明肮,位于F島的核電站,受9級特大地震影響缭付,放射性物質(zhì)發(fā)生泄漏柿估。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一陷猫、第九天 我趴在偏房一處隱蔽的房頂上張望秫舌。 院中可真熱鬧的妖,春花似錦、人聲如沸足陨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽墨缘。三九已至星虹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镊讼,已是汗流浹背宽涌。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝶棋,地道東北人卸亮。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像玩裙,于是被迫代替她去往敵國和親兼贸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348