Spring Boot进阶(55):SpringBoot之集成MongoDB及实战使用 | 超级详细,建议收藏

 1. 前言🔥

        前几期我们有介绍Mysql、Redis等数据库介绍及实战演示,对基本的数据存放有很好的共性,但是如果说遇到大面积的xml、Json、bson等格式文档数据存放,以上数据库并非是最优选择,最优选择是Mongodb数据库。

        那么,SpringBoot具体如何集成MongoDB呢?这将又会是干货满满的一期,全程无尿点不废话只抓重点教,具有非常好的学习效果,拿好小板凳准备就坐!希望学习的过程中大家认真听好好学,学习的途中有任何不清楚或疑问的地方皆可评论区留言或私信,bug菌将第一时间给予解惑,那么废话不多说,直接开整!Fighting!! 

2. 环境说明🔥

本地的开发环境:

  • 开发工具:IDEA 2021.3
  • JDK版本: JDK 1.8
  • Spring Boot版本:2.3.1 RELEASE
  • Maven版本:3.8.2

3. 概念🔥 

3.1 什么是MongoDB?

        MongoDB是一个开源、高性能、无模式的文档型数据库,是NoSQL数据库产品中的一种。且与关系数据库的最为相像的。它是一个文档数据库,它的数据以文档方式进行存储,将数据存储在类似 JSON 的 BSON 文档中,所以它既可以存储比较复杂的数据类型,又相当的灵活,因此可以存储比较复杂的数据类型。

3.2 MongoDB有什么特点?

        Mongo 最大的特点就是支持查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引,这点我们下文会重点演示介绍。

4. SpringBoot集成演示

4.1 添加依赖

        在你的 pom.xml 中引入mongodb依赖。从依赖包结构上可以看出,又是spring-data的子项目,之前介绍过spring-data-jpa、spring-data-redis,对于mongodb的访问,spring-data也提供了强大的支持,下面就开始动手试试吧。

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

安装完mongodb的依赖之后,就可以开始我们的实践了!

4.2 常用注解

 4.2.1 @Document

在MongoDB中,对于常见的关系型数据库如Mysql、Oracle等,一些术语略有不同但实则一个意思,统计如下展示:

SQL术语

MongoDB术语

database

database

table

collection

row

document

column

field

如果类名和实际Collection名称不一致(大小写忽略),则需要进行说明,反之则不需要。

 4.2.2 @Id

使用该注解标注的字段,将映射为MongoDB中的_id,也就是默认的主键。若当前实体类没有使用@Id注解,则默认将字段名为id的字段映射为_id。注意:使用这个注解的字段类型可以为String或者ObjectId。使用该注解需引入org.springframework.data.annotation.Id。代码如下:

//此处不用该注解也可以,id会自动映射为_id
@Id
private Long id;

  4.2.3 @Field

使用该注解,我们可以将类中名称不一致的字段进行映射。假如在我们的类中,createDate采用了驼峰式命名,但我们希望映射为create_date,就可以使用该注解,代码如下。

@Field("create_date")
private String createDate;

4.3 代码集成

4.3.1 创建用户实体 MongodbUser

参考代码如下:

@Data
@NoArgsConstructor//无参构造
@AllArgsConstructor//全参构造
@Document(collection = "user")//Document注解表明对应了MongoDB中的user表。
public class MongodbUser {@Idprivate Long id;private String username;private Integer age;
}

4.3.2 创建数据访问对象MongodbUserRepository

创建数据访问对象MongodbUserRepository,代码参考如下:

package com.example.demo.service;import com.example.demo.entity.MongodbUser;
import org.springframework.data.mongodb.repository.MongoRepository;/*** @version 1.0* @date 2023/7/13 16:46*/
public interface  MongodbUserRepository extends MongoRepository<MongodbUser, Long> {//根据用户名查询MongodbUser findByUsername(String username);
}

        这里我们直接继承MongoRepository类,理由是使用方式相对简单,这样 MongodbUserRepository 接口就具备了通用的数据访问控制层的能力(简单的crud操作功能),复杂的crud操作可以通过自行封装MongoTemplate来实现。具体使用我会放到书写测试用例时进行重点介绍及演示。

拓展:上文介绍过Mongodb也是以Spring Date为中心的方法,基于所有Spring数据项目中众所周知的访问模式,都会提供更加灵活和复杂的api操作,MongoRepository就是起自带封装的,继承 PagingAndSortingRepository,实现一组 mongodb规范相关的方法.

缺陷:MongoRepository不够灵活,复杂crud操作只能通过MongoTemplate(跟Mybatis类似)来实现,其实对mongodb本身熟悉的话,使用MongoTemplate会更加游刃有余,MongoTemplate是Spring Data MongoDB封装的MongoDB官方Java驱动,它更加接近原生mongodb命令。

4.3.3 参数配置

在application.yml文件中添加MongoDB数据库连接参数,连接信息参考如下:

spring:data:mongodb:host: 127.0.0.1 #指定MongoDB服务地址port: 27017 #指定端口,默认就为27017database: test #指定使用的数据库(集合)

        由于我是使用了默认的数据库(test),也没设置数据库用户名跟密码,所以直接指定ip加端口号配置即可。

4.4 编写单元测试

4.4.1 Query对象

在编写单元测试之前,我先给大家着重介绍下Query对象的使用方法,具体如下:

1.创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)代码演示如下:

Query query = new Query(Criteria.where("id").is(id));

2.精准条件:criteria.and("key").is("条件")

3.模糊条件:criteria.and("key").regex("条件")

4.封装条件:query.addCriteria(criteria)

5.大于:Criteria gt = Criteria.where("key").gt("条件")

6.小于:Criteria lt = Criteria.where("key").lt("条件")

7.范围查询:query.addCriteria(Criteria.where("key").gte("条件").lte("条件")

如下我分别给同学们演示一下集成MongoDB下的增删改查操作。

4.4.2 新增数据

新增三条数据。

@Test
public void insertTest(){mongodbUserRepository.deleteAll();// 创建三个User,并验证User总数mongodbUserRepository.save(new MongodbUser(1L, "赵云", 30));mongodbUserRepository.save(new MongodbUser(2L, "貂蝉", 40));mongodbUserRepository.save(new MongodbUser(3L, "李白", 50));Assertions.assertEquals(3, mongodbUserRepository.findAll().size());
}

test-case 测试用例执行后,我们通过可视化界面进行再次校验,果真三条数据都保存入库了。截图请看如下

4.4.3 删除数据

操作:删除其中id=1的数据,testcese 代码参考如下:

//删除数据
@Test
public void deleteByIdTest(){mongodbUserRepository.deleteById(1L);Assertions.assertEquals(2, mongodbUserRepository.findAll().size());
}

test-case 测试用例执行后,我们通过可视化界面进行再次校验,果真id为1的那条数据被删除了。截图如下请看:

4.4.4 更新数据

这里我们 用到了使用Query和Update构造函数更新条件和更新内容,testcese 代码参考如下:

//修改数据
@Test
public void updateByIdTest() {// 使用Query和Update构造更新条件和更新内容Long id = 2L;Integer age = 99;Query query = new Query(Criteria.where("id").is(id));Update update = new Update().set("age", age);mongoTemplate.updateFirst(query, update, MongodbUser.class);
}

        test-case 测试用例执行后,我们通过可视化界面进行再次数据校验,经二次校验,id为2的那条数据中的age值从40更新为了新值,证明更新成功。截图请看如下:

拓展:

Query query = new Query() 相当于mysql的select;

Criteria criteria = new Criteria();里的criteria 相当于where后的条件;

实体类相当于表名,上面的理解就相当于select * from table where xxxx;

MongoDb的增删改查都要调用Query query = new Query();

4.4.5 条件查询

操作:根据用户名= '李白' 进行条件查询,testcese 代码参考如下:

//根据用户名指定查询
@Test
public void queryByNameTest() {//指定查询Query query = new Query(Criteria.where("username").is("李白"));System.out.println(mongoTemplate.find(query, MongodbUser.class));
}

我们从控制台,可以看到查询为用户名='李白'的数据被打印出来了,与预期结果一致。

4.4.6 组合条件查询

操作:查找年龄在 [30,60] 之间的数据,testcese 代码参考如下:

        代码逻辑跟更新数据一致,我们还是得利用Query和Criteria构造查询条件,使用MongoTemplate的find方法查询符合条件的数据集合。

//根据年龄范围查询
@Test
public void queryByNameTest() {//范围查询Query query = new Query();query.addCriteria(Criteria.where("age").gte(30).lte(60));System.out.println(mongoTemplate.find(query, MongodbUser.class));
}

我们从控制台,可以看到查询出符合30

4.4.7 小结

        总的来说,集成MongoDB和SpringBoot可以为Web应用程序提供高性能和可伸缩性的数据库系统。但是,在使用MongoDB时需要注意其内存占用和数据一致性等问题,这点是需要自己去衡量的,到底采用那种数据库来支撑数据存储,以达到使用最优。

5. 与Mysql对比🔥

        MySQL与MongoDB都是开源的常用数据库之一,但是MySQL是典型传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种非关系型的数据库。它们各有各的优缺点,下面是我梳理总结出来的它两之间的对比,同学们请看:

6. 热文推荐🔥

滴~如下推荐【Spring Boot 进阶篇】的学习大纲,请小伙伴们注意查收。

Spring Boot进阶(01):Spring Boot 集成 Redis,实现缓存自由

Spring Boot进阶(02):使用Validation进行参数校验

Spring Boot进阶(03):如何使用MyBatis-Plus实现字段的自动填充

Spring Boot进阶(04):如何使用MyBatis-Plus快速实现自定义sql分页

Spring Boot进阶(05):Spring Boot 整合RabbitMq,实现消息队列服务

Spring Boot进阶(06):Windows10系统搭建 RabbitMq Server 服务端

Spring Boot进阶(07):集成EasyPoi,实现Excel/Word的导入导出

Spring Boot进阶(08):集成EasyPoi,实现Excel/Word携带图片导出

Spring Boot进阶(09):集成EasyPoi,实现Excel文件多sheet导入导出

Spring Boot进阶(10):集成EasyPoi,实现Excel模板导出成PDF文件

Spring Boot进阶(11):Spring Boot 如何实现纯文本转成.csv格式文件?

Spring Boot进阶(12):Spring Boot 如何获取Excel sheet页的数量?

Spring Boot进阶(13):Spring Boot 如何获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值name值?

Spring Boot进阶(14):Spring Boot 如何手动连接库并获取指定表结构?一文教会你

Spring Boot进阶(15):根据数据库连接信息指定分页查询表结构信息

Spring Boot进阶(16):Spring Boot 如何通过Redis实现手机号验证码功能?

Spring Boot进阶(17):Spring Boot如何在swagger2中配置header请求头等参数信息

Spring Boot进阶(18):SpringBoot如何使用@Scheduled创建定时任务?

Spring Boot进阶(19):Spring Boot 整合ElasticSearch

Spring Boot进阶(20):配置Jetty容器

Spring Boot进阶(21):配置Undertow容器

Spring Boot进阶(22):Tomcat与Undertow容器性能对比分析

Spring Boot进阶(23):实现文件上传

Spring Boot进阶(24):如何快速实现多文件上传?

Spring Boot进阶(25):文件上传的单元测试怎么写?

Spring Boot进阶(26):Mybatis 中 resultType、resultMap详解及实战教学

Spring Boot进阶(27):Spring Boot 整合 kafka(环境搭建+演示)

Spring Boot进阶(28):Jar包Linux后台启动部署及滚动日志查看,日志输出至实体文件保存

Spring Boot进阶(29):如何正确使用@PathVariable,@RequestParam、@RequestBody等注解?不会我教你,结合Postman演示

Spring Boot进阶(30):@RestController和@Controller 注解使用区别,实战演示

...

7. 文末🔥

        如果想系统性的学习Spring Boot,小伙伴们直接订阅bug菌专门为大家创建的Spring Boot专栏《滚雪球学Spring Boot》从入门到精通,从无到有,从零到一!以知识点+实例+项目的学习模式由浅入深对Spring Boot框架进行学习&使用。

        如果你有一定的基础却又想精进Spring Boot,那么《Spring Boot进阶实战》将会是你的最好的选择;此栏进行知识点+实例+项目的学习方式全面深入框架剖析及各种高阶玩法,励志打造全网最全最新springboot学习专栏,投资学习自己性价比最高。

        本文涉及所有源代码,均已上传至github开源,供同学们一对一参考,GitHub,同时,原创开源不易,欢迎给个star🌟,想体验下被加Star的感jio,非常感谢 ❗

       我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

关注公众号,获取最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等硬核资源

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

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

相关文章

AI时代图像安全“黑科技”如何助力人工智能与科技发展?

〇、前言 7月7日下午&#xff0c;2023世界人工智能大会&#xff08;WAIC&#xff09;“聚焦大模型时代AIGC新浪潮—可信AI”论坛在上海世博中心红厅举行。人工智能等技术前沿领域的著名专家与学者、投资人和领军创业者汇聚一堂&#xff0c;共同探索中国科技创新的驱动力量。 在…

机器学习(十六):决策树

全文共18000余字&#xff0c;预计阅读时间约36~60分钟 | 满满干货&#xff0c;建议收藏&#xff01; 一、介绍 树模型是目前机器学习领域最为重要的模型之一&#xff0c;同时它也是集成学习中最常用的基础分类器。 与线性回归、逻辑回归等算法不同&#xff0c;树模型并不只是…

【电路效应】信号处理和通信系统模型中的模拟电路效应研究(SimulinkMatlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、Simulink仿真实现 &#x1f4a5;1 概述 在信号处理和通信系统模型中&#xff0c;模拟电路效应研究是指考虑到实际电路的特性对信号进行建模和分析的过程。模拟电路效应…

docker k8s

Docker docker到底与一般的虚拟机有什么不同呢&#xff1f; 我们知道一般的linux系统即GNU/Linux系统包括两个部分&#xff0c;linux系统内核GNU提供的大量自由软件&#xff0c;而centos就是众多GNU/Linux系统中的一个。 虚拟机会在宿主机上虚拟出一个完整的操作系统与宿主机完…

csdn新星计划vue3+ts+antd赛道——利用inscode搭建vue3(ts)+antd前端模板

文章目录 ⭐前言⭐利用inscode免费开放资源&#x1f496; 在inscode搭建vue3tsant项目&#x1f496; 调整配置&#x1f496; antd 国际化配置&#x1f496; 用户store&#x1f496; 路由权限&#x1f496; 预览 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享…

Golang跨平台UI框架之Wails(二)

上一篇文章我们讲解了如何简单创建一个 wails 的项目,但是现在有很多前端框架我们可以选择,比如: AngularVueSvelteReactLitVanilla各个都是时代的弄潮儿,就看哪一个适合你了,后续的系列都是以Angular为例。 1. 创建Angular模板项目 由于 wails 是没有官方支持Angular的…

SignalTap II 软件使用步骤

文章目录 前言一、SignalTap II是什么&#xff1f;二、使用步骤三、总结四、参考资料 前言 环境&#xff1a; 1、Quartus18.1 2、板子型号&#xff1a;原子哥开拓者2(EP4CE10F17C8) 要求&#xff1a; 能够使用SignalTap II进行片上调试。 一、SignalTap II是什么&#xff1f; S…

vue3+vite+ts+vant 开发浙里办H5应用流程和注意事项

vue3vitets 开发浙里办H5应用流程和注意事项 最近有个项目是要开发到浙里办的一个H5项目,记录一些问题; 浙里办irs系统内node版本和npm版本如下建议切到他们的版本再进行开发这样问题少一点 1.因为浙里办有自己的irs系统 需要吧前端整体的代码传上去 除了 打包后的dist 和 no…

4.CSS(一)

目录 一、CSS简介 二、CSS基础选择器 &#xff08;一&#xff09;标签选择器 &#xff08;二&#xff09;类选择器 类选择器-多类名 &#xff08;三&#xff09;id选择器 &#xff08;四&#xff09;通配符选择器 &#xff08;五&#xff09;总结 三、CSS字体属性 &…

VSCode种git rebase分支冲突解决无法继续rebase

情景&#xff1a; 常规来说我们git开分支开发完新功能之后&#xff0c;提交之前rebase dev分支&#xff0c;然后合并到dev上算是开发完成。 问题还原&#xff1a; 在开发完之后执行如下指令&#xff1a; 1.执行变基操作&#xff1a;git rebase dev。 //这一步出现冲突vscode上…

重磅升级 | 睿士主机威胁溯源系统全新升级,助力用户2023网络攻防演练

攻防演练至今已走过7个年头&#xff0c;逐渐成为网络安全防御体系中至关重要的一环。随着攻防演练对抗水平不断升级&#xff0c;攻击手段愈发隐蔽&#xff0c;攻击自动化程度逐步提高&#xff0c;技术储备也越来越有针对性&#xff0c;从广撒网到精准打击&#xff0c;这些都给蓝…

CS162 11-12 调度与死锁

调度 overview 1.FCFS 可以利用好cache缓存&#xff0c;减少上下文切换。 2.很直观&#xff0c;贪心&#xff0c;可以减少平均的响应时间 3 4. 5.等待调度的时间是平均的 6.优先级翻转&#xff0c;和优先级捐赠 解决 cfs中的调度 死锁 四个必要不充分条件 银行家算法&…