一. 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查詢:
其他接口不再一一測試,都可以正常使用。