Spring Boot之使用MongoDB數據庫源

前言

來啦老鐵!

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

  1. 5分鐘入手Spring Boot;
  2. Spring Boot數據庫交互之Spring Data JPA;
  3. Spring Boot數據庫交互之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:批處理與任務調度;
  10. Spring Boot之整合Spring Security: 訪問認證;
  11. Spring Boot之整合Spring Security: 授權管理;
  12. Spring Boot之多數據庫源:極簡方案;

在上一篇文章Spring Boot之多數據庫源:極簡方案中,我們已經能在Spring Boot項目中使用Oracle、Mysql等數據庫源,并在文末留了一個懸念:

  • 如何在Spring Boot項目中使用MongoDB數據庫源?

今天,他來了!

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

整體步驟

  1. 添加MongoDB項目依賴;
  2. 添加MongoDB數據庫信息;
  3. 實現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數據庫信息;

在application.properties中聲明MongoDB的數據庫信息即可,換句話說,就是要告訴Spring Boot,我們數據庫的用戶名、密碼、數據庫位置、端口等信息,如:

#configuration for mongo
spring.data.mongodb.uri=mongodb://username:password@127.0.0.1:27017/database?ssl=true
稍微說明一下:
  • username:目標數據庫的用戶名,請依實際情況填寫;
  • password:目標數據庫的密碼,請依實際情況填寫;
  • 127.0.0.1:目標數據庫host,請依實際情況填寫;
  • 27017:目標數據庫端口,請依實際情況填寫;
  • database:目標數據庫名稱,請依實際情況填寫;
  • ssl=true:交互時采用ssl協議,請依實際情況使用;

對應到MongoDB客戶端工具,如Robotmongo:

host,port
username,password,database
ssl

3. 實現MongoDB交互過程;

在實現交互過程之前,我先介紹一下我手上的數據庫,由于使用了公司的測試數據庫,不方便公開,因此進行了局部遮擋:

數據庫情況
  • 我使用數據庫表agent_config進行演示;
  • agent_config表共有2個根節點:_id和application,_id為唯一標識,application為具體業務信息;

接下來我們來實現交互過程:

1). 創建AgentConfig實體類;

在domain包下創建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;
}

注意關鍵一行代碼,這行代碼指明了數據庫表名為agent_config表;

@Document(collection = "agent_config")
2). 創建repository包,用于存放MongoDB交互的接口;
3). 在repository包內創建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交互過程,我準備開發2個API,一個為獲取agent_config表中的數據,一個為更新agent_config中的數據;

4). 在service包下創建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內實現了AgentConfigRepository接口,可供controller使用;

5). controller內創建2個演示API;

在controller包內創建AgentConfigController,實現一個使用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);
    }
}

至此,項目整體結構如下:

項目整體結構

4. 驗證MongoDB交互效果;

  • 啟動項目:
啟動項目1
啟動項目2
  • 調用API:

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

訪問API

2). 使用postman更新MongoDB中的數據:

更新數據

我們將ddsTimeIntervalCount這個字段的值從1改為2,并且能夠在response body中得知,ddsTimeIntervalCount的確有被更新成功!

很明顯,我們已經能夠如我們預期,正確地訪問、修改MongoDB中對應的數據了,事實上,對MongoDB的增刪改查已不再有壁壘,我們已經打通MongoDB這條線了!!!

至此,我們的Spring Boot多數據庫源從此多了MongoDB支持,Spring Boot多數據庫源又上一層樓!!!

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

謝謝!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。