MongoDB | 零基础学习与Springboot整合ODM实现增删改查
目录
学习思路
学习上问题
官网下载与手册
开启服务
查看服务
原生软件
新建连接
观察界面
admin 数据库
config 数据库
local 数据库
总结
数据库相关
与关系性数据库对比
数据库基础操作
创建集合(表)
整合Springboot技术
初始化 jkglxt 数据库
添加 mongodb 依赖
编写 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 启动服务
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 数据库
# 使用/创建数据库
use myUser# 查询数据库
show dbs# 删除数据库
db.dropDatebase()
创建集合(表)
# 插入文档(记录)
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 数据库
# 创建/使用数据库
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配置文件
spring:data:mongodb:uri: mongodb://localhost:27017/jkglxtdatabase: jkglxt
编写实体类
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一样,实体类与表类型固定死
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> {
}
编写服务层接口
package com.jkglxt.www.service.servielmp;import com.jkglxt.www.entity.UserData;import java.util.List;public interface UserDataServiceImpl {// 所有获取用户信息public List<UserData> getUserData();
}
实现服务层接口
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;// 构造注入@Autowiredpublic UserDataService(UserDateRepository userDateRepository) {this.userDateRepository = userDateRepository;}@Overridepublic List<UserData> getUserData() {List<UserData> userData = userDateRepository.findAll();return userData;}
}
编写控制层
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;@Autowiredprivate UserDataController(UserDataServiceImpl userDataService) {this.userDataService = userDataService;}// 查询用户@GetMapping("/getUserDataUrl")public List<UserData> getUserData() {List<UserData> userDataList = userDataService.getUserData();return userDataList;}
}
接口测试
我这里使用的是Apifox
感谢观看