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



    org.springframework.boot
    spring-boot-starter-data-mongodb

安装完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 {
    
    @Id
    private 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 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 #指定端口,默认就为27017
      database: 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 测试用例执行后,我们通过可视化界面进行再次校验,果真三条数据都保存入库了。截图请看如下

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

4.4.3 删除数据

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

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

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

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

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更新为了新值,证明更新成功。截图请看如下:

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

拓展:

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));
}

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

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

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

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

4.4.7 小结

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

5. 与Mysql对比

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

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

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电子书籍、简历模板等硬核资源

你可能感兴趣的:(SpringBoot零基础入门,MongoDB,nosql数据库,集成Mongodb实战)