暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

爆破专栏丨SpringBoot2.x系列教程之整合MongoDB缓存商品信息

Java架构栈 2021-12-17
541
点击上方蓝字关注我们

前言

在上一章节中,壹哥 给大家介绍了如何在SpringBoot中整合Redis,进而实现了把MySQL中查询出来的内容缓存到Redis中。其实如果我们要实现缓存效果,还可以使用另一种NoSQL类型的数据库,那就是MongoDB。本文 壹哥 会带大家在SpringBoot中整合MongoDB,学习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安装过程略

这里我就不再跟大家展示MongoDB数据库的安装过程了,基本就是傻瓜式安装。
2. 创建web项目

我们按照之前的经验,创建一个SpringBoot的Web程序,具体过程略。

3. 添加依赖

在pom.xml文件中添加MongoDB的依赖包。

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

复制

4. 创建application.yml配置文件
创建application.yml文件,在这里对MongoDB数据库进行配置。

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

复制

5. 创建一个实体类

5.1 MongoDB中相关注解

  • @Id - 文档的唯一标识,在mongodb中为ObjectId,它是唯一的,通过时间戳+机器标识+进程ID+自增计数器(确保同一秒内产生的Id不会冲突)构成。

  • @Document - 声明此类为mongodb的文档实体类,通过collection参数指定这个类对应的文档名称。@Document(collection=”mongodb”) mongodb对应表

  • @Indexed - 声明该字段需要索引,建索引可以大大的提高查询效率。

  • @CompoundIndex - 复合索引的声明,建复合索引可以有效地提高多字段的查询效率。

  • @Transient - 映射忽略的字段,该字段不会保存到mongodb。

  • @PersistenceConstructor - 声明构造函数,作用是把从数据库取出的数据实例化为对象。该构造函数传入的值为从DBObject中取出的数据。

5.2 创建Product实体类

这里我创建一个Product实体类,封装数据库里的商品信息。

server:
  port: 8080
spring:
  application:
    name: spirng-boot-mongodb
  data:
    mongodb:
      host: localhost   #同127.0.0.1
      port: 27017
      database: db01    #指定操作的数据库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;

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

}

复制

6. 创建Service实现类

6.1 定义ProductService

在service的包里创建一个接口,用于对数据库进行CRUD操作。

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

}

复制

6.2 定义ProductServiceImpl实现类

在service层编写一个具体的实现类,实现商品信息操作。

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

}

复制

7. 创建Controller接口

我们创建一个Controller,定义几个URL接口进行测试。

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

}

复制

8. 创建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.classargs);
    }

}

}

复制

9. 项目代码结构
如下是项目的代码结构,各位可以参考创建

10. 启动项目进行测试
10.1 创建空白数据库

我们把项目启动起来后,可以先在MongoDB中自己手动创建一个空白的数据库db01。

10.2 测试添加接口功能

在Postman中执行添加接口,测试数据是否被添加到了商品库中。

10.3 查询MongoDB数据库

我们再次打开MongoDB,可以看到如下信息:
10.4 执行查询测试

这时候我们在浏览器中查询商品信息,可以看到存储在MongoDB中的商品信息。


10.5 根据id进行查询

以下是根据id进行查询得到的商品信息。


10.6 根据name查询

以下是根据name进行查询得到的商品信息。


至于其他接口我就不再一一测试了,都是可以正常使用的。


结语

至此,我们就在SpringBoot中整合了MongoDB数据库,其实MOngoDB的使用与Redis有类似之处,用起来也并不是很难。


今日小作业:

利用MongoDB对学生信息管理系统进行缓存。


完成任务在留言区回复:666
第一个回复666并被精选的同学可以领取一本台历哦

点击【阅读全文】,锋迷商城项目免费学
文章转载自Java架构栈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论