SpringBoot高階篇MongoDB之基本環境搭建與使用

一灰灰發表於2018-12-14

更多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, 則上面的可以不需要

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);
    }

}
複製程式碼

然後開始執行,檢視輸出,結果演示如下

gif.gif

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. 專案

1. 一灰灰Blog

一灰灰的個人部落格,記錄所有學習和工作中的博文,歡迎大家前去逛逛

2. 宣告

盡信書則不如,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激

3. 掃描關注

一灰灰blog

QrCode

知識星球

goals

相關文章