1. 程式人生 > 其它 >SpringBoot2.x系列教程51--NoSQL之SpringBoot整合MongoDB

SpringBoot2.x系列教程51--NoSQL之SpringBoot整合MongoDB

SpringBoot2.x系列教程51--NoSQL之SpringBoot整合MongoDB

作者:一一哥

一. MongoDB

1. MongoDB簡介

MongoDB一詞來自於英文單詞“Humongous”,中文含義為“龐大”,是由C++語言編寫的一個基於分散式檔案儲存的高效能,開源,無模式的文件型資料庫,屬於當前NoSql資料庫中比較熱門的一種,可以應用於各種規模的企業、各個行業以及各類應用程式中。

2. MongoDB資料結構

傳統的關係資料庫一般由資料庫(database)、表(table)、記錄(record)三個層次概念組成,而MongoDB是由資料庫(database)、集合(collection)、文件物件(document)三個層次組成。MongoDB中的collection對應了關係型資料庫裡的表,但是集合中沒有列、行和關係概念,這體現了模式自由的特點。

MongoDB支援的資料結構非常鬆散,是類似於json的bjson格式,因此可以儲存比較複雜的資料型別。以下是MongoDB的資料機構型別圖:

MongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列。

3. MongoDB特點

  • Mongo最大的特點是他支援的查詢語言非常強大,其語法有點類似於面向物件的查詢語言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。
  • MongoDB 是一個面向文件儲存的資料庫,操作起來比較簡單和容易。
  • 你可以在MongoDB記錄中設定任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
  • 你可以通過本地或者網路建立資料映象,這使得MongoDB有更強的擴充套件性。
  • 如果負載的增加(需要更多的儲存空間和更強的處理能力) ,它可以分佈在計算機網路中的其他節點上這就是所謂的分片。
  • Mongo支援豐富的查詢表示式。查詢指令使用JSON形式的標記,可輕易查詢文件中內嵌的物件及陣列。
  • MongoDb 使用update()命令可以實現替換完成的文件(資料)或者一些指定的資料欄位 。
  • Mongodb中的Map/reduce主要是用來對資料進行批量處理和聚合操作。
  • Map和Reduce。Map函式呼叫emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函式進行處理。
  • Map函式和Reduce函式是使用Javascript編寫的,並可以通過db.runCommand或mapreduce命令來執行MapReduce操作。
  • GridFS是MongoDB中的一個內建功能,可以用於存放大量小檔案。
  • MongoDB允許在服務端執行指令碼,可以用Javascript編寫某個函式,直接在服務端執行,也可以把函式的定義儲存在服務端,下次直接呼叫即可。
  • MongoDB支援各種程式語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
  • MongoDB安裝簡單。

二. Spring Boot中整合MongoDB

1. MongoDB安裝過程略。

2. 建立web專案

我們按照之前的經驗,建立一個web程式,並將之改造成Spring Boot專案,具體過程略。

3. 新增依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

4. 建立application.yml配置檔案

server:
  port: 8080
spring:
  application:
    name: spirng-boot-mongodb
  data:
    mongodb:
      host: localhost   #同127.0.0.1
      port: 27017
      database: db01    #指定操作的資料庫

4. 建立一個實體類

4.1 MongoDB中相關注解

  • @Id - 文件的唯一標識,在mongodb中為ObjectId,它是唯一的,通過時間戳+機器標識+程序ID+自增計數器(確保同一秒內產生的Id不會衝突)構成。
  • @Document - 宣告此類為mongodb的文件實體類,通過collection引數指定這個類對應的文件名稱。@Document(collection=”mongodb”) mongodb對應表
  • @Indexed - 宣告該欄位需要索引,建索引可以大大的提高查詢效率。
  • @CompoundIndex - 複合索引的宣告,建複合索引可以有效地提高多欄位的查詢效率。
  • @Transient - 對映忽略的欄位,該欄位不會儲存到mongodb。
  • @PersistenceConstructor - 宣告建構函式,作用是把從資料庫取出的資料例項化為物件。該建構函式傳入的值為從DBObject中取出的資料

4.2 建立Product實體類

package com.yyg.boot.entity;

import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.util.Date;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/9
 * @Description Description
 */
@Data
@ToString
@Document(collection = "product")
public class Product {

    @Id
    private String id;

    /**
     * 價格
     */
    @Field("price")
    private Integer price;

    /**
     * 商品名稱
     */
    @Field("name")
    private String name;

    /**
     * 商品簡介
     */
    @Field("info")
    private String info;

    /**
     * 商品釋出者
     */
    @Field("publisher")
    private String publisher;

    /**
     * 建立時間
     */
    @Field("createTime")
    private Date createTime;

    /**
     * 修改時間
     */
    @Field("updateTime")
    private Date updateTime;

}

5. 建立Service實現類

5.1 定義ProductService

package com.yyg.boot.service;

import com.yyg.boot.entity.Product;

import java.awt.print.Book;
import java.util.List;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/9
 * @Description Description
 */
public interface ProductService {

    String saveProduct(Product product);

    /**
     * 查詢所有
     */
    List<Product> findAll();


    /***
     * 根據id查詢
     */
    Product getProductById(String id);

    /**
     * 根據名稱查詢
     */
    Product getProductByName(String name);

    /**
     * 更新物件
     */
    String updateProduct(Product product);

    /***
     * 刪除物件
     */
    String deleteProduct(Product product);

    /**
     * 根據id刪除
     */
    String deleteProductById(String id);

}

5.2 定義ProductServiceImpl實現類

package com.yyg.boot.service.impl;

import com.yyg.boot.entity.Product;
import com.yyg.boot.service.ProductService;
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.Date;
import java.util.List;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/9
 * @Description Description
 */
@Service
public class ProductServiceImpl implements ProductService {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public String saveProduct(Product product) {
        product.setCreateTime(new Date());
        product.setUpdateTime(new Date());
        mongoTemplate.save(product);
        return "新增成功";
    }

    @Override
    public List<Product> findAll() {
        return mongoTemplate.findAll(Product.class);
    }

    @Override
    public Product getProductById(String id) {
        Query query = new Query(Criteria.where("_id").is(id));
        return mongoTemplate.findOne(query, Product.class);
    }

    @Override
    public Product getProductByName(String name) {
        Query query = new Query(Criteria.where("name").is(name));
        return mongoTemplate.findOne(query, Product.class);
    }

    @Override
    public String updateProduct(Product product) {
        Query query = new Query(Criteria.where("_id").is(product.getId()));
        Update update = new Update().set("publisher", product.getPublisher())
                .set("info", product.getInfo())
                .set("updateTime", new Date());
        return "success";
    }

    @Override
    public String deleteProduct(Product product) {
        mongoTemplate.remove(product);
        return "success";
    }

    @Override
    public String deleteProductById(String id) {
        //findOne
        Product product = getProductById(id);
        //delete
        deleteProduct(product);
        return "success";
    }

}

6. 建立Controller介面

package com.yyg.boot.web;

import com.yyg.boot.entity.Product;
import com.yyg.boot.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/9
 * @Description Description
 */
@RestController
@RequestMapping("/product")
public class ProductController {

    @Autowired
    private ProductService productService;

    @PostMapping("")
    public String saveProduct(@RequestBody Product product) {
        return productService.saveProduct(product);
    }

    @GetMapping("")
    public List<Product> findAll() {
        return productService.findAll();
    }

    @GetMapping("/id/{id}")
    public Product findOne(@PathVariable("id") String id) {
        return productService.getProductById(id);
    }

    @GetMapping("/name/{name}")
    public Product findOneByName(@PathVariable("name") String name) {
        return productService.getProductByName(name);
    }

    @PostMapping("/update")
    public String update(@RequestBody Product product) {
        return productService.updateProduct(product);
    }

    @DeleteMapping("/delOne")
    public String delOne(@RequestBody Product product) {
        return productService.deleteProduct(product);
    }

    @DeleteMapping("/{id}")
    public String delById(@PathVariable("id") String id) {
        return productService.deleteProductById(id);
    }

}

7. 建立Application入口類

package com.yyg.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @Author 一一哥Sun
 * @Date Created in 2020/4/9
 * @Description Description
 */
@SpringBootApplication
public class MongoApplication {

    public static void main(String[] args) {
        SpringApplication.run(MongoApplication.class, args);
    }

}

完整專案結構:

8. 啟動測試

我們可以在MongoDB中自己手動建立一個賣二手遊戲賬號平臺地圖的資料庫db01。

進行新增介面的測試:

再次開啟MongoDB,可以看到如下資訊:

進行查詢測試:

根據id查詢:

根據name查詢:

其他介面不再一一測試,都可以正常使用。