MongoDB | 零基础学习与Springboot整合ODM实现增删改查

目录

学习思路

学习上问题

官网下载与手册

开启服务

查看服务

原生软件

新建连接

观察界面

[admin 数据库](#admin 数据库)

[config 数据库](#config 数据库)

[local 数据库](#local 数据库)

总结

数据库相关

与关系性数据库对比

数据库基础操作

创建集合(表)

整合Springboot技术

[初始化 jkglxt 数据库](#初始化 jkglxt 数据库)

[添加 mongodb 依赖](#添加 mongodb 依赖)

[编写 yaml配置文件](#编写 yaml配置文件)

编写实体类

编写ODM映射

编写服务层接口

实现服务层接口

编写控制层

接口测试


学习思路

  • 0基础感受非关系性数据库的玩法与用处
  • 高层技术用不上,但基本使用与操作还是要有的

学习上问题

  • 网传 非关系性数据库需要搭配持久化使用
  • mongodb + srv,中的srv是什么?srv是资源记录的类型,那它有什么用处?
  • BSON 与 JSON 的区别什么? BSON基于JSON且有JSON没有的数据类型
  • Google 的 Protocol Buffer 是什么?
  • MongoDB的命名规范是什么?驼峰命名
  • MongoDB 有必要用ORM吗还是用ODM
  • mongoose ODM框架Mongoose.js中文网
  • 图片怎么存储?是不是使用ODM框架技术就不用直接创建数据,而是创建集合就行了?
  • 文件存储不得是用专业的吗?Amazon S3、Google Cloud Storage
  • mysql + mongodb 如何共同一起使用?
  • 第一种是将图片数据转化为bson二进制作为字典的键值对进行保存
  • 第二种是利用mongodb提供的GridFS进行保存

官网下载与手册

下载:Install MongoDB Community Kubernetes Operator | MongoDB

手册:What is MongoDB? - Database Manual v8.0 - MongoDB Docs

数据库工具:Download MongoDB Command Line Database Tools | MongoDB

开启服务

cmd - 输入 mongod 启动服务

bash 复制代码
mongod

查看服务

Ctrl+Shift + Esc - 服务

原生软件

打开MongoDB Compass

新建连接

点击 Add new connection - 配置连接的名称(只是名字) - 连接即可

观察界面

点击连接的 >_ 可以打开控制台,同时每个连接都有三个数据库localh中存在 startup_log 集合,他们有什么用处呢?

admin 数据库

admin 数据库是 MongoDB 的管理数据库,主要用于存储与数据库管理相关的数据和配置。以下是它的主要用途:

  • 用户和角色管理 :存储用户和角色信息,包括权限设置。所有数据库的用户和角色信息都存储在 admin 数据库中。

  • 系统配置:存储一些全局的系统配置信息。

  • 运行时状态:存储数据库的运行时状态信息,例如服务器状态、性能指标等。

  • 访问控制 :在启用身份验证的情况下,admin 数据库是用户身份验证的中心点。

config 数据库

config 数据库主要用于存储 MongoDB 集群的配置信息。以下是它的主要用途:

  • 分片集群配置 :在分片集群中,config 数据库存储了分片的配置信息,例如分片的元数据、分片键的配置等。

  • 副本集配置 :在副本集中,config 数据库存储了副本集的配置信息,例如成员信息、优先级等。

  • 集群状态:存储集群的运行状态信息,例如分片的当前状态、副本集的同步状态等。

local 数据库

local 数据库主要用于存储与单个 MongoDB 实例相关的本地数据。以下是它的主要用途:

  • 副本集操作日志 :在副本集中,local 数据库存储了操作日志(Oplog),用于记录主节点的操作,以便从节点可以同步这些操作。

  • 本地配置:存储与本地实例相关的配置信息,例如本地的会话信息、临时数据等。

  • 本地状态:存储本地实例的运行状态信息,例如会话状态、临时数据等。

总结

  • admin 数据库:主要用于用户和角色管理、系统配置、运行时状态等。

  • config 数据库:主要用于分片集群和副本集的配置信息、集群状态等。

  • local 数据库:主要用于副本集的操作日志、本地配置、本地状态等。

数据库相关

与关系性数据库对比

特性 MongoDB 集合 关系型数据库表
数据存储 文档(Document) 行(Row)
数据结构 动态模式(Dynamic Schema) 固定模式(Static Schema)
数据类型 BSON 格式,支持嵌套文档和数组 固定的数据类型,如 INT、VARCHAR 等
索引 可以在任意字段上创建索引 可以在任意列上创建索引
事务支持 支持多文档事务(从 MongoDB 4.0 开始) 支持 ACID 事务
数据完整性 依赖应用层逻辑 依赖数据库约束(如外键)

数据库基础操作

安全性补充操作

复制代码
# 暂停写入(允许叠多个锁)
db.fsyncLock()


# 暂停写入
db.fsyncUnlock()

可以直接 使用数据库新的 myUser 数据库

bash 复制代码
# 使用/创建数据库
use myUser

# 查询数据库
show dbs

# 删除数据库
db.dropDatebase()

创建集合(表)

bash 复制代码
# 插入文档(记录)
db.myUser.insertOne({name:"chen"})
db.myUser.insertOne({name:"chen",password:"123456"}) # 上面那条同样也拥有password,不过是空值


# 查询指定文档(支持模糊查询)
db.myUser.find([name:"chen"})


# 查询所有文档
db.myUser.find()

# 精准删除文档
db.myUser.delete({name:"chen"})

# 删除集合内容
db.myUser.drop() 

整合Springboot技术

初始化 jkglxt 数据库

java 复制代码
# 创建/使用数据库
use jkglxt

# 添加集合(表)
db.createCollection("user_data")


# 添加文档(记录)
db.user_data.insertOne({userId:34,userHeadImage:""})
db.user_data.insertOne({userId:35,userHeadImage:""})
db.user_data.insertOne({userId:36,userHeadImage:""})

添加 mongodb 依赖

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

编写 yaml配置文件

bash 复制代码
spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/jkglxt
      database: jkglxt

编写实体类

java 复制代码
package com.jkglxt.www.entity;

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


@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Document(collection = "user_data")
public class UserData {
    private String id;
    private int userId;
    private String userHeadImage;
}

编写ODM映射

这里有点像 ORM 的mybatis-plus一样,实体类与表类型固定死

java 复制代码
package com.jkglxt.www.mapper;

import com.jkglxt.www.entity.UserData;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface UserDateRepository extends MongoRepository<UserData, String> {
}

编写服务层接口

java 复制代码
package com.jkglxt.www.service.servielmp;

import com.jkglxt.www.entity.UserData;

import java.util.List;

public interface UserDataServiceImpl {
    // 所有获取用户信息
    public List<UserData> getUserData();
}

实现服务层接口

java 复制代码
package com.jkglxt.www.service;

import com.jkglxt.www.entity.UserData;
import com.jkglxt.www.mapper.UserDateRepository;
import com.jkglxt.www.service.servielmp.UserDataServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserDataService implements UserDataServiceImpl {

    private UserDateRepository userDateRepository;

    // 构造注入
    @Autowired
    public UserDataService(UserDateRepository userDateRepository) {
        this.userDateRepository = userDateRepository;
    }

    @Override
    public List<UserData> getUserData() {
        List<UserData>  userData = userDateRepository.findAll();
        return userData;
    }
}

编写控制层

java 复制代码
package com.jkglxt.www.controller;

import com.jkglxt.www.entity.UserData;
import com.jkglxt.www.service.servielmp.UserDataServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserDataController {
    private UserDataServiceImpl userDataService;

    @Autowired
    private UserDataController(UserDataServiceImpl userDataService) {
        this.userDataService = userDataService;
    }

    // 查询用户
    @GetMapping("/getUserDataUrl")
    public List<UserData> getUserData() {
        List<UserData> userDataList = userDataService.getUserData();
        return userDataList;
    }
}

接口测试

我这里使用的是Apifox

感谢观看

相关推荐
weixin_45690427几秒前
SQLite 数据库操作完整指南
数据库·sqlite
chxii16 分钟前
1.23Node.js 中操作 mongodb
mongodb·node.js
漫步者TZ22 分钟前
【StarRocks系列】StarRocks vs Mysql
数据库·starrocks·mysql·分布式数据库
Java初学者小白33 分钟前
秋招Day14 - MySQL - SQL优化
java·数据库·sql·mysql
神洛华1 小时前
SQL Server基础语句2:表连接与集合操作、子查询与CET、高级查询
数据库·sql
发仔1232 小时前
超硬核实战!用Java玩转Neo4j图数据库,轻松搞定复杂关系网!
java·数据库
陈卓4102 小时前
索引——高效查询的关键
数据库·sql·mysql·索引
凉、介2 小时前
CPU Cache 的映射与寻址
linux·arm开发·数据库·redis·缓存·嵌入式
Cosmoshhhyyy3 小时前
优雅的参数校验(@Validated)
数据库·mysql