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也提供了强大的支持,下面就开始动手试试吧。

java 复制代码
<!--集成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。代码如下:

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

4.2.3 @Field

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

java 复制代码
@Field("create_date")
private String createDate;

4.3 代码集成

4.3.1 创建用户实体 MongodbUser

参考代码如下:

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

4.3.2 创建数据访问对象MongodbUserRepository

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

java 复制代码
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数据库连接参数,连接信息参考如下:

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

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

4.4 编写单元测试

4.4.1 Query对象

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

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

java 复制代码
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 新增数据

新增三条数据。

java 复制代码
@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 代码参考如下:

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

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

4.4.4 更新数据

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

java 复制代码
//修改数据
@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 代码参考如下:

java 复制代码
//根据用户名指定查询
@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方法查询符合条件的数据集合。

java 复制代码
//根据年龄范围查询
@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电子书籍、简历模板等硬核资源

相关推荐
洛阳泰山12 小时前
Windows系统部署MongoDB数据库图文教程
数据库·windows·mongodb
yuanpan18 小时前
MongoDB与PostgreSQL两个数据库的特点详细对比
数据库·mongodb·postgresql
白露与泡影19 小时前
基于Mongodb的分布式文件存储实现
分布式·mongodb·wpf
孤的心了不冷19 小时前
【Linux】Linux安装并配置MongoDB
linux·运维·mongodb·容器
好吃的肘子1 天前
MongoDB 应用实战
大数据·开发语言·数据库·算法·mongodb·全文检索
独泪了无痕2 天前
MongoTemplate 基础使用帮助手册
spring boot·mongodb
好吃的肘子2 天前
MongoDB入门
数据库·mongodb
柳如烟@2 天前
在Rocky Linux 9.5上部署MongoDB 8.0.9:从安装到认证的完整指南
linux·运维·mongodb
好吃的肘子2 天前
MongoDB 高可用复制集架构
数据库·mongodb·架构
码上飞扬2 天前
MongoDB数据库深度解析:架构、特性与应用场景
数据库·mongodb·架构