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 {
@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, 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 #指定端口,默认就为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 测试用例执行后,我们通过可视化界面进行再次校验,果真三条数据都保存入库了。截图请看如下
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电子书籍、简历模板等硬核资源