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.mzph.cn/news/4865.shtml

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

相关文章

如何将jar 包下载到自定义maven仓库

下载命令 mvn install:install-file -Dfileartifactid-version.jar -DgroupIdgroupid -DartifactIdartifactid -Dversionversion -Dpackagingjar -DlocalRepositoryPath. -DcreateChecksumtrue参数解释 在上述命令中&#xff0c;需要替换以下参数&#xff1a; artifactid-vers…

HTTP原理解析-超详细

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…

vue3+vue-router4:报错Uncaught (in promise) Error: Invalid navigation guard

报错图示&#xff1a; Error: Invalid navigation guard Uncaught (in promise) Error: Invalid navigation guard 错误影响描述&#xff1a; 配置开发、测试、生产时候&#xff0c;因为是公众号&#xff0c;所以想在开发环境下免鉴权&#xff0c;不走微信获取openid接口&a…

potplayer放大画面,画面拖拽。备份

放大画面&#xff1a; 按住alt和鼠标左键&#xff0c;就可以拖动放大后的画面了 窗口化示图

【DC-DC】APS54083 降压恒流驱动器大功率深度调光 舞台 RGB 汽车照明 台灯驱动芯片

产品描述 APS54083 是一款 PWM 工作模式,高效率、外围简单、外置功率 MOS 管&#xff0c;适用于 5-220V 输入高精度降压 LED 恒流驱动芯片。输出最大功率150W最大电流 6A。APS54083 可实现线性调光和 PWM 调光&#xff0c;线性调光脚有效电压范围 0.5-2.5V.PWM 调光频率范围 1…

学习babylon.js --- [3] 开启https

babylonjs提供WebVR功能&#xff0c;但是使用这个功能得用https&#xff0c;本文讲述如何使用自签名证书来开启https&#xff0c;基于第二篇文章中搭建的工程。 一 生成自签名证书 首先要安装openssl&#xff0c;这个去网上搜下就行了。安装完之后在终端下输入openssl回车可以…

MongoDB

MongoDB概述 MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。 它支持的数据结构非…

状态模式:游戏、工作流引擎中常用的状态机是如何实现的?

从今天起&#xff0c;我们开始学习状态模式。在实际的软件开发中&#xff0c;状态模式并不是很常用&#xff0c;但是在能够用到的场景里&#xff0c;它可以发挥很大的作用。从这一点上来看&#xff0c;它有点像我们之前讲到的组合模式。 可以简短的回顾一下组合模式&#xff1a…

uniapp安卓签名证书生成,签名证书的SHA1,SHA256,MD5获取

uniapp安卓证书生成有两种方式&#xff0c;一种是去dcloud开发者中心生成证书&#xff0c;另一种是安装jre环境&#xff0c;自己生成证书 第一种 dcloud生成证书 去该项目对应的应用处&#xff0c;生成证书需要等几分钟&#xff0c;生成后可以查看证书信息 第二种 自己生成…

如何下载SRA存放在AWS的原始数据

通常&#xff0c;我们都是利用prefetch从NCBI上获取数据&#xff0c;然后用fasterp-dump/fastq-dump 转成fastq。但遗憾的SRA的数据是原数据的有损压缩&#xff0c;比如说我19年参与发表的文章里单细胞数据上传的是3个文件&#xff0c;但是当时的faster-dump/fastq-dump只能拆出…

【ArcGIS Pro二次开发】(46):要素类从上到下、从左到右排序

要素类经过编辑之后&#xff0c;【OBJECTID】字段会变得不规律。应部分网友要求&#xff0c;做了这个从上到下、从左到右排序的工具。 不过后来在ArcGIS Pro中发现了一个【排序】工具&#xff0c;已经可以完美实现这个功能需求&#xff0c;发现自己做了个白工。 不过做了不能白…

Ghost Buster Pro for mac(快速清理卸载的应用残存文件)

Ghost Buster Pro for mac可从您已卸载的应用程序中查找并删除文件。该应用程序速度快如闪电&#xff0c;可立即释放内存。 许多应用程序都安装在计算机上&#xff0c;但它们通常只会在您的计算机上停留很短的时间。每个应用程序都会创建文件&#xff0c;但删除应用程序不会删…

若依字典使用

若依字典使用 此文章使用的若依是大于3.7.0版本的 JS文件配置 main.js中引入全局变量和方法 import DictData from /components/DictData DictData.install()DictData.js配置 可以从DictData.js中看出在install方法中调用了字典查询接口&#xff0c;在install方法中可以做…

前端 | (五)CSS三大特性及常用属性 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;CSS三大属性&#x1f407;层叠性&#x1f407;继承性&#x1f407;优先级 &#x1f4da;CSS常用属性&#x1f407;像素的概念&#x1f407;颜色的表示⭐️表…

火狐安卓版支持油猴了!后面将支持更多扩展插件

日前火狐浏览器每夜构建版的安卓版已经带来了更多扩展程序支持&#xff0c;这其中就包括大名鼎鼎的油猴扩展程序。本次火狐浏览器每夜构建版更新新增五款扩展程序支持&#xff0c;并且按照谋智基金会说法还会支持更多的扩展程序。 下载地址&#xff1a;https://ftp.mozilla.org…

WEB:FlatScience

背景知识 sql注入 SQLite数据库知识 SQLite3注入方法 题目 用dirsearch进行扫描&#xff0c;下面几个关键目录&#xff1a;robots.txt&#xff0c;login.php&#xff0c;admin.php&#xff0c;剩下的目录就是一些pdf格式的论文了 一个一个访问并查看源代码&#xff0c;在查看l…

windows下安装consul、springboot整合consul

Spring Cloud Consul通过自动配置和绑定到Spring Environment和其他Spring编程模型习语&#xff0c;为Spring Boot应用程序提供Consul集成。通过一些简单的注解&#xff0c;可以快速启用和配置应用程序内的常用模式&#xff0c;并使用Hashicorp的Consul构建大型分布式系统。提供…

检测到错误页面web应用服务器版本信息泄露

详细描述 Web服务器未能正确处理异常请求导致Web服务器版本信息泄露&#xff0c;攻击者收集到服务器信息后可进行进一步针对性攻击。 解决办法 临时修复建议如下&#xff1a; 1、关闭web服务器错误提示。 2、关闭运行平台的错误提示。 3、建立错误机制&#xff0c;不要把真实…

MySQL八股学习总览-from 小林coding

MySQL八股学习总览-from 小林coding MySql执行流程连接MySQL服务器查询缓存解析SQL执行SQL预处理器优化器执行器 MySql执行流程 连接MySQL服务器 经过如下的命令,就可以与MySQL服务器建立起连接,三次握手 mysql -h$ip -u$user -p服务端查询多少个客户端连接 show processlis…