首页 > 数据库 >SpringBoot2.x系列教程51--NoSQL之SpringBoot整合MongoDB

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

时间:2022-12-23 15:31:09浏览次数:33  
标签:Product SpringBoot NoSQL -- MongoDB product import id String


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的数据机构类型图:

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


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项目,具体过程略。

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


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

}

完整项目结构:

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

8. 启动测试

我们可以在MongoDB中自己手动创建一个空白的数据库db01。

SpringBoot2.x系列教程51--NoSQL之SpringBoot整合MongoDB_数据库_04

进行添加接口的测试:

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

再次打开MongoDB,可以看到如下信息:

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

进行查询测试:

SpringBoot2.x系列教程51--NoSQL之SpringBoot整合MongoDB_数据库_07

根据id查询:

SpringBoot2.x系列教程51--NoSQL之SpringBoot整合MongoDB_数据库_08

根据name查询:

SpringBoot2.x系列教程51--NoSQL之SpringBoot整合MongoDB_数据库_09


其他接口不再一一测试,都可以正常使用。


 

标签:Product,SpringBoot,NoSQL,--,MongoDB,product,import,id,String
From: https://blog.51cto.com/u_7044146/5965821

相关文章

  • eventBus的手写实现on、emit、once、off
    事件总线事件总线使用方法constevents=newEventBus();functionfoo1(){console.log('foo1');}functionfoo2(){console.log('foo2');}functionfoo3(......
  • top
          排序:P:以占据的CPU百分比,%CPUM:占据内存百分比,%MEMT:累积占据CPU时长,TIME+首部信息显示:uptime信息:l命令tasks及cpu信息:t命令cpu分别显......
  • Python 字典与集合
    字典(Dictionary)字典介绍字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含:“键对象”和“值对象”。可以通过“键对象”实现快速获取、删除、更新......
  • ConfigMap&Secret解决挂载覆盖SubPath
    k8s使用默认的挂载方式,会覆盖掉整个目录 可以看到/etc/nginx/目录下只有nginx.conf文件了,其他都被覆盖掉了如果只想要单独挂载某个配置文件,可以用subpath功能来解决......
  • 懂了!VMware/KVM/Docker原来是这么回事儿
    原文链接云计算时代,计算资源如同小马哥当年所言,已经成为了互联网上的水和电。 虚拟主机、web服务器、数据库、对象存储等等各种服务我们都可以通过各种各样的云平台来......
  • Promise常用的方法
    在开发过程中,Promise常用的方法有:all,race,allSettled。1.Promise.allall,它接受的参数是个数组,它只有等所有请求都结束才会有结果,都成功才会执行.then,then返回的也是一......
  • Shell编程 第 1~5章
    Shell编程第1~5章第1章Shell概述、第2章Shell脚本入门、第3章变量、第4章运算符、第5章条件判断第1章Shell概述什么是Shell在计算机科学中,Sh......
  • Windows Mac 等不同平台2022年最佳PDF工具
     不同平台PDF转换器列表3款最佳WindowsPDF转化器3款Mac平台转化器3款在线PDF转换器AdobeAcrobatPDF转换器MAC预览PDF88福昕PDFFoxitPhantomPDFConve......
  • k8s平台不停机更新发布服务
    一、单机服务架构实现不停机更新,利用readinesprob实现pod就绪探测。deployment参考配置如下:apiVersion:apps/v1kind:Deploymentmetadata:name:dengbao-record-......
  • 数据结构面试常见问题
    数据结构作为计算机的一门基础学科,它在面试中占有很大的比重,本科阶段,我们也学过数据结构与算法,内容比较多,也比较难,尤其是图的应用以及各类查找和排序算法,这些也都是核心内......