SpringBoot整合MongoDB

参考链接

  • https://www.mongodb.org.cn/

文章目录

  • 一、前言
    • 1.1 NoSQL介绍
      • 1.1.1 NoSQL 数据库分类
      • 1.1.2 NoSQL的优点/缺点
      • 1.1.3 BASE
    • 1.2 MongoDB介绍
      • 1.2.1 MongoDB和SQL对比
      • 1.2.2 数据库
      • 1.2.3 元数据
      • 1.2.4 MongoDB 数据类型
  • 二、SpringBoot整合MongDB
    • 2.1 环境配置
    • 2.2 MongoTemplate

一、前言

1.1 NoSQL介绍

NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。

NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

1.1.1 NoSQL 数据库分类

SpringBoot整合MongoDB_第1张图片

1.1.2 NoSQL的优点/缺点

优点:

  • 高可扩展性
  • 分布式计算
  • 低成本
  • 架构的灵活性,半结构化数据
  • 没有复杂的关系

缺点:

  • 没有标准化
  • 有限的查询功能(到目前为止)
  • 最终一致是不直观的程序

1.1.3 BASE

BASE:Basically Available, Soft-state, Eventually Consistent。 由 Eric Brewer 定义。

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

BASE是NoSQL数据库通常对可用性及一致性的弱要求原则:

  • Basically Availble --基本可用
  • Soft-state --软状态/柔性事务。 “Soft state” 可以理解为"无连接"的, 而 “Hard state” 是"面向连接"的
  • Eventual Consistency --最终一致性 最终一致性, 也是是 ACID 的最终目的。

SpringBoot整合MongoDB_第2张图片

1.2 MongoDB介绍

1.2.1 MongoDB和SQL对比

SpringBoot整合MongoDB_第3张图片
需要注意的是:

  • 文档中的键/值对是有序的。
  • 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
  • MongoDB区分类型和大小写。
  • MongoDB的文档不能有重复的键。
  • 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:

  • 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
  • .和$有特别的意义,只有在特定环境下才能使用。
  • 以下划线"_"开头的键是保留的(不是严格要求的)。

1.2.2 数据库

  • admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
  • local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
  • config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

1.2.3 元数据

数据库的信息是存储在集合中。它们使用了系统的命名空间:

dbname.system.*

在MongoDB数据库中名字空间 .system.* 是包含多种系统信息的特殊集合(Collection),如下:
SpringBoot整合MongoDB_第4张图片

1.2.4 MongoDB 数据类型

SpringBoot整合MongoDB_第5张图片

二、SpringBoot整合MongDB

2.1 环境配置

引入MongoDB库

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

配置端口和连接MongoDB数据库信息

server:
  port: 8090

spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/test

2.2 MongoTemplate

添加实体类User

package com.ym.learn.db.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.mongodb.core.mapping.Document;

import java.io.Serializable;

/**
 * @Author: Yangmiao
 * @Date: 2023/3/19 22:19
 * @Desc: User实体类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Document(value = "t_user")
public class User implements Serializable {

    private String name;

    private String password;

    private int age;

    private String tel;
}

测试

package com.ym.learn.db.controller;

import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import com.ym.learn.core.entity.R;
import com.ym.learn.db.entity.User;
import com.ym.learn.db.repository.mapper.mongo.UserMapper;
import lombok.extern.slf4j.Slf4j;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Optional;

/**
 * @Author: Yangmiao
 * @Date: 2023/3/20 17:40
 * @Desc:
 */
@RestController("/mongo")
@Slf4j
public class MongoController {
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    private UserMapper userMapper;

    @GetMapping("/addUser")
    public R addUser(){
        User user = User.builder()
                .name("xiaoming")
                .age(10)
                .password("123")
                .build();
        User insert = mongoTemplate.insert(user);
        return R.ok(insert);
    }

    @GetMapping("/deleteUser")
    public R deleteUser(){
        Query query = Query.query(Criteria.where("name").is("lisi").and("age").is(10));
        DeleteResult remove = mongoTemplate.remove(query);
        return R.ok(remove);
    }

    @GetMapping("/updateUser")
    public R updateUser(){
        Query query = Query.query(Criteria.where("name").is("xiaoming"));
        Update update = Update.update("name", "lisi");
        UpdateResult result = mongoTemplate.updateFirst(query, update, User.class);
        return R.ok(result);
    }

    @GetMapping("queryUser/{name}")
    public R queryUser(@PathVariable("name")String name){
        Query query = Query.query(Criteria.where("name").is(name));
        User user = mongoTemplate.findOne(query, User.class);
        if (user == null){
            return R.fail("未查询到该用户:"+name);
        }
        return R.ok(user);
    }

    @GetMapping("/queryUser/repos/{name}")
    public R queryUserByRepos(@PathVariable("name")String name){
        Optional<User> userOptional = userMapper.findById(name);
        userOptional.ifPresent(it->{
            log.debug("print user: "+it.toString());
        });
        User user = userOptional.orElse(new User());
        return R.ok(user);
    }
}

你可能感兴趣的:(MongoDB,mongodb,spring,boot,数据库)