【Mongodb-02】springboot整合mongodb(详解)

springBoot整和mongodb

    • 一,springboot整合mongodb
      • 1,依赖加入
      • 2,yml文件配置
      • 3,_class 字段过滤(可选)
      • 4,实体类定义
      • 5,索引创建
      • 6,数据插入
        • 6.1,insert方式
        • 6.2,使用save的方式实现
      • 7,数据更新
        • 7.1,update普通方式更新
        • 7.2,BulkOperations 方式更新
      • 8,数据查询
      • 9,数据删除

一,springboot整合mongodb

如需转载,请标明出处:https://zhenghuisheng.blog.csdn.net/article/details/139704356

此篇主要讲解在java中,如何通过springboot项目去操作mongodb,如何创建springboot项目此处省略

1,依赖加入

在pom文件中,加入对应的依赖,版本需要于springboot的版本对应

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

2,yml文件配置

首先进入配置阶段,在yml配置文件中加入以下配置,如果在安装之后的auth设置为false,那么不需要账号密码也能直接访问

spring:  data:mongodb:host: xxx.xxx.xxx.xxxport: 27017username: zhspassword: 'zhs123456'database: archiveauthentication-database: admin

也可以用下面这种方式,uri方式和上面的参数不要重复,只能只使用一种,推荐使用上面这种,可读性强

spring:data:mongodb:uri: "mongodb://zhs:zhs123456@xxx.xxx.xxx.xxx:27017/archive"

3,_class 字段过滤(可选)

在实体类数据存入到mongodb时,会将这个 _class 实体类对应的类全路径也存到mongodb中,我这边不需要这个数据,几亿条数据都加一个这个实体类对象,除了占磁盘之外毫无意义,因此我这边选择将这个字段去掉,定义一个MongoConfig实体类,再注入到容器中即可

@Configuration
public class MongoConfig implements ApplicationListener<ContextRefreshedEvent> {@ResourceMongoTemplate oneMongoTemplate;private static final String TYPEKEY = "_class";@Overridepublic void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {MongoConverter converter = oneMongoTemplate.getConverter();if (converter.getTypeMapper().isTypeKey(TYPEKEY)) {((MappingMongoConverter) converter).setTypeMapper(new DefaultMongoTypeMapper(null));}}
}

4,实体类定义

接下来定义一个User实体类作为测试用,通过这个Field注解实现实体类字段和mongodb的字段相关联,mongodb不需要像mysql一样需要提前建表,建好实体类就可以对mongodb中的集合进行操作了,User实体类就会对应Mongodb中的一个集合,相当于mysql的一张表,每条数据就是一个文档,每个文档大小限制16m

@Data
public class User {@Field("_id")private String id;@Field("username")private String username;@Field("password")private String password;//更新时间@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")@Field("updatedTime")private Date updatedTime;//创建时间@Field("createdTime")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date createdTime;
}

5,索引创建

都使用mongodb了,后期数据量肯定是非常大的,不然也不可能考虑使用这个玩意儿。因此在文档建好之后,最好提前把索引建上。这里直接选择使用username 和 password作为唯一的联合索引。索引的建立根据实际业务考虑,不能确定是唯一就建普通索引

//user表示哪个集合
db.user.createIndex({username: 1,password:1}, {unique: true})

6,数据插入

mongodb有两种方法实现数据插入,一种是直接使用insert或者insertAll的方式插入,另一种是通过save的方式插入数据

6.1,insert方式

如果直接选择insert的方式插入数据,那么他会判断数据库中是否有这条数据,如通过id判断,如果已经有id为1的用户,再次插入id为1的用户数据时,那么就会直接抛一个异常出来,并且会让整个操作失败。代码如下,如果没有设置id,那么mongodb会自动设置一个唯一的uuid作为id,我这边直接使用一个雪花算法生成的id

User user = new User();
user.setId(SnowflakeUtils.nextId());  //该工具类需要自行生成,可百度
user.setUsername("zhs");
user.setPassword("123456");
user.setCreatedTime(new Date());
user.setUpdatedTime(new Date());
mongoTemplate.insert(user);

也可以直接使用一个批量插入的方式将数据插入,这样将多次io直接转换成1次io,效率更高

List<User> list = new ArrayList<>();
User user = new User();
...
list.add(user);
mongoTemplate.insertAll(list);
6.2,使用save的方式实现

整体操作和insert的一样,在数据插入时使用save方法。使用save方法可以让整体变得更加灵活,insert在集合中已经存在的文档id再插入时会直接抛出异常,但是save不会,会直接进行更新的操作,如果数据不存在则会插入操作。但是在此期间,每次save时需要遍历全部数据,判断数据是否存在,在效率上是远远不及这个insert的

User user = new User();
user.setId(SnowflakeUtils.nextId());  //该工具类需要自行生成,可百度
user.setUsername("zhs");
user.setPassword("123456");
user.setCreatedTime(new Date());
user.setUpdatedTime(new Date());
mongoTemplate.save(user);

综上所述,最好就是每次自定义的生成一个唯一id,然后使用insert去操作数据

7,数据更新

7.1,update普通方式更新

数据更新的方式如下,如果只需要更新一条数据,如下面代码。上面我根据username和password建立了唯一索引,因此只需要updateFirst更新一条数据即可

Query query = new Query();
query.addCriteria(Criteria.where("username").is("zhs"));
query.addCriteria(Criteria.where("password").is("zhs123456"));
Update update = new Update().set("password","zhs12345678");
mongoTemplate.updateFirst(query,update, User.class);

也可以通过这个updateMulti实现多条数据的更新,如下面将所有用户名为zhs的更新时间修改

Query query = new Query();
query.addCriteria(Criteria.where("username").is("zhs"));
Update update = new Update().set("updatedTime",new Date());
mongoTemplate.updateMulti(query,update,User.class);
7.2,BulkOperations 方式更新

上面这些事针对同一个where条件的,也可以针对不同更新文档实现批量更新,这里可以使用 BulkOperations 操作。如更新名为 zhs的密码为 zhs12345678,更新名为 zhsqaq 的密码为 zhsqaq12345678 ,总而言之就是将多条毫无关联的的更新语句一次更新完成

//创建一个BulkOperations实例
BulkOperations updateBulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "User");

创建完这个 BulkOperations 实例之后,接下来就是可以去创建多条更新语句,随后在构建完的查询与句话中,调用这个updateBulkOps.updateOne方法,再最后调用这个excute方法,将这些全部聚合的更新操作全部执行

//构建查询条件1
Query query1 = new Query();
query1.addCriteria(Criteria.where("username").is("zhs"));
query1.addCriteria(Criteria.where("password").is("zhs123456"));
Update update1 = new Update().set("password","zhs12345678");
updateBulkOps.updateOne(query1,update1);
//构建查询条件2
Query query2 = new Query();
query2.addCriteria(Criteria.where("username").is("zhsqaq"));
query2.addCriteria(Criteria.where("password").is("zhsqaq123456"));
Update update2 = new Update().set("password","zhsqaq12345678");
updateBulkOps.updateOne(query2,update2);
...
//执行这个操作
updateBulkOps.execute();

8,数据查询

查询这块方式比较多也比较简单,接下来讲解集中简单的查询方式,如下直接查询全部文档

List<User> userList = mongoTemplate.findAll(User.class);

也可以通过Query构造条件查询,并通过这 Criteria 条件构造条件去筛选数据

Query query2 = new Query();
query2.addCriteria(Criteria.where("username").is("zhsqaq"));
query2.addCriteria(Criteria.where("password").is("zhsqaq123456"));
mongoTemplate.find(query, User.class)

除了上面的is,还有可多api都是可用的,如一些基本操作ne,lt ,lte ,gt , gte 等等,基本操作运算符和比较运算符里面都有的

在这里插入图片描述

还支持在查询条件中增加排序功能,支持升序和降序,如下面这条根据创建时间升序排序

query.with(Sort.by(Sort.Order.asc("createdTime")));

同时支持分页功能,如继续给查询条件中返回前100条数据

query.skip(0).limit(100);

获取某个集合总文档的个数如下

mongoTemplate.count(query,User.class);

9,数据删除

数据删除就比较简单,只需要构造查询的条件,调用remove方法就可以直接将数据删除,如删除用户名为zhs的用户的数据

Query query = new Query();
query.addCriteria(Criteria.where("username").is("zhs"));
mongoTemplate.remove(query,User.class); //删除符合的数据

到此为止spring Boot整合mongodb算是入门成功

除就比较简单,只需要构造查询的条件,调用remove方法就可以直接将数据删除,如删除用户名为zhs的用户的数据

Query query = new Query();
query.addCriteria(Criteria.where("username").is("zhs"));
mongoTemplate.remove(query,User.class); //删除符合的数据

到此为止spring Boot整合mongodb算是入门成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/27697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

awtk如何实现键盘和输入框

1.创建默认键盘 新建窗体-keyboard 2.新建编辑框 3.设置编辑框属性 4.点击编辑框即可打开默认键盘&#xff0c;若想修改键盘样式可以在默认键盘修改或自定义键盘 5.获取输入字符 widget_t* wifi_edit widget_lookup(win, "edit", TRUE);//获取单行编辑控件 widge…

解决Windows中端口占用导致服务启动失败

解决Windows中端口占用导致服务启动失败 在cmd窗口中使用netstat -ano | findstr "3306"来查看哪个线程占用了3306端口。 下面的图片里面表示一个pid为5196的进程占用了端口 接着可以在cmd窗口中使用tasklist | findstr "5196" 根据pid查询进程名称 通过…

0-1 构建用户画像数仓

目录 前言 一、用户画像概述 1.1 用户画像 1.2 用户标签 1.3 用户群组 二、建设标签和标签体系 2.1 标签体系 2.1.1 统计类标签 2.1.2 规则类标签 2.1.3 机器学习挖掘类标签 2.2 标签建设流程 2.2.1 需求收集与分析 2.2.2 产出标签需求文档 2.2.3 标签的开发 H…

ffmpeg封装和解封装介绍-(8)解封装和封装重构

头文件&#xff1a; xformat.h #pragma once/// 封装和解封装基类#include <mutex> struct AVFormatContext; struct AVCodecParameters; struct AVPacket; struct XRational {int num; ///< Numeratorint den; ///< Denominator }; class XFormat { public:/// &…

【数据结构(邓俊辉)学习笔记】图03——拓扑排序

文章目录 0. 概述1. 零入度算法1. 1 拓扑排序1. 2 算法 2. 零出度算法2.1 算法2.2 实现2.3. 复杂度 0. 概述 学习下拓扑排序 1. 零入度算法 1. 1 拓扑排序 首先理解下拓扑排序 其实老师经常干这事&#xff0c;如编讲义&#xff0c;将已经知道的知识点串起来变成讲课序列。那…

比特币全节点搭建

比特币全节点搭建 参考: https://www.cnblogs.com/elvi/p/10203927.html

SM3国密算法:优秀的密码散列函数

随着信息技术的飞速发展&#xff0c;信息安全已成为全球关注的焦点。密码学作为保障信息安全的核心技术&#xff0c;其重要性不言而喻。中国在密码学领域也取得了显著的成就&#xff0c;其中SM3国密算法就是中国自主设计并推广使用的密码学标准之一。 一、SM3算法概述 SM3算法…

【机器学习】集成学习方法:Bagging与Boosting的应用与优势

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、集成学习的定义二、Bagging方法1. 随机森林&#xff08;Random Forest&#xff09;2. 其他Bagging方法 二、Boosting方法1. 梯度提升树&#xff08;Gradient Boosting Machine, GBM&#xff09;解释GBM的基本原理和…

【网络编程】进程间的通信

进程间通信意味着两个不同进程间交换数据&#xff0c;操作系统中应提供两个进程可以同时访问内存空间。 管道实现进程间通信 管道不属于进程资源&#xff0c;与套接字一样属于操作系统。两个进程通过操作系统提供内存空间进行通信 #include<unistd.h> int pipe(int fil…

IS022000认证:食品安全管理的金标准

食品安全是食品行业的命脉&#xff0c;IS022000食品安全管理体系认证作为最权威的认证之一&#xff0c;为企业提供了强有力的保障。要理解IS022000认证的意义&#xff0c;我们需要先了解它与HACCP和IS09001认证的关系。 HACCP&#xff08;Hazard Analysis and Critical Control…

前端学习CSS之神奇的块浮动

在盒子模型的基础上就可以对网页进行设计 不知道盒子模型的可以看前面关于盒子模型的内容 而普通的网页设计具有一定的原始规律,这个原始规律就是文档流 文档流 标签在网页二维平面内默认的一种排序方式,块级标签不管怎么设置都会占一行,而同一行不能放置两个块级标签 行级…

[Kubernetes] etcd 单机和集群部署

文章目录 1.etcd基本概念2.etcd的基本知识3.etcd优势4.etcd单机部署4.1 linux部署4.2 windows部署4.3 docker安装etcd 5.etcd集群部署 1.etcd基本概念 etcd是一个高可用的分布式键值存储系统&#xff0c;是CoreOS&#xff08;现在隶属于Red Hat&#xff09;公司开发的一个开源…

0614,表达式,语句

题目一&#xff1a; 许多简单的交互式程序都是基于菜单的&#xff1a;它们向用户显示可供选择的命令列表&#xff1b;一旦用户选择了某条命令&#xff0c;程序就执行相应的操作&#xff0c;然后提示用户输入下一条命令&#xff1b;这个过程一直会持续到用户选择 "退出&qu…

关于如何使用不到 ¥800 实现电动升降桌自由(双电机)

前言 在房子装修之前&#xff0c;就想着拥有一个书房。但是如果书房里面没有书桌&#xff0c;那不扯淡么&#xff1f;之后想着天天坐这么久&#xff0c;腰部颈部经常不适&#xff0c;所以又开始纠结买哪款人体工学椅子比较合适。 说时迟那时快。当天偶然刷小红书的时候&#x…

微信小游戏插件申请,微信小程序插件管理

微信小游戏的插件申请与小程序不一样&#xff0c;官方没有提供一个统一的管理入口进行申请插件&#xff0c;以及查看插件&#xff0c;没有小程序方便的&#xff1b; 小程序申请查看插件入口如下图所示&#xff1a; 小游戏的插件可以通过以下的方式进行申请&#xff1a; 如下…

建筑八大员证报名一寸彩色照片要求及手机自拍方法解读

在建筑行业&#xff0c;八大员证的持有者是广受尊重的专业人士。然而&#xff0c;要成为一名合格的八大员&#xff0c;首先必须通过资格审核和报名流程。其中重要的一步就是提交一寸彩色照片&#xff0c;以确保个人信息准确无误。那么&#xff0c;你是否清楚报名时照片的要求以…

Linux笔记--权限与属性命令、查找指令、压缩命令、网络指令

权限 使用ls指令查看详细信息时 rwx分别代表读写执行三种权限&#xff0c;book代表book用户&#xff0c;对于权限来说三种权限分别代表二进制一位&#xff0c;即同时拥有rwx就是111&#xff0c;此时这个文件权限为775 改变权限为rw-rwxr-w指令 book100ask:~/Desktop$ chmod …

Vue I18n国际化插件

Vue I18n国际化插件 安装目录结构及文件内容./locales/lang/zh.js./locales/lang/en.js./locales/index.js main.js引入页面具体使用及语言切换&#xff08;Vue3&#xff09;刷新保存原语言&#xff0c;App.vue添加路由守卫注意点 中文文档&#xff1a; https://kazupon.githu…

sprintboot容器功能

容器 容器功能Spring注入组件的注解Component&#xff0c;Controller&#xff0c;Service&#xff0c;Repository案例演示 Configuration应用实例传统方式使用Configuration 注意事项和细节 Import应用实例 ConditionalConditional介绍应用实例 ImportResource应用实例 配置绑定…