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

更多Spring文章,歡迎點擊 一灰灰Blog-Spring專題java

SpringBoot結合mongodb進行業務開發,也屬於比較基本的需求了,本文爲mongo系列的基本篇,主要就是環境搭建、工程的配置設置相關git

I. 環境搭建

正式開始以前,第一步就是須要安裝Mongo的環境了,由於環境的安裝和咱們spring的主題沒有太大的關係,所以咱們選擇最簡單的使用姿式:直接用docker來安裝mongo來使用github

下面的安裝過程都是mac環境,其餘操做系統能夠直接安裝mongodb,移步相關教程spring

1. docker 安裝

能夠直接到官網進行下載安裝,可是對系統版本有要求,因此須要使用Docker ToolBox,實際試過以後,感受不太好用,其實是將docker安裝到虛擬機中了,下面直接使用brew命令進行安裝mongodb

安裝命令docker

brew cask install docker
複製代碼

執行完畢以後,會多一個應用名爲 docker, 雙擊運行,輸入密碼等便可json

2. mongo 安裝使用

直接使用官方的mongo鏡像便可,而後綁定端口映射,就能夠在宿主機中使用mongobash

# 下載鏡像
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-mongodbmaven

<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
相關文章
相關標籤/搜索