👨🎓作者:bug菌
✏️博客:CSDN、掘金、infoQ、51CTO等
🎉简介:CSDN|阿里云|华为云|51CTO等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金 | InfoQ | 51CTO等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。...
✍️温馨提醒:本文字数:1999字, 阅读完需:约 5 分钟
🏆本文收录于《Spring Boot从入门到精通》,专门攻坚指数提升。
本专栏致力打造最硬核 Spring Boot 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。
环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE
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 测试用例执行后,我们通过可视化界面进行再次校验,果真三条数据都保存入库了。截图请看如下
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则是非关系型数据库,也叫文档型数据库,是一种非关系型的数据库。它们各有各的优缺点,下面是我梳理总结出来的它两之间的对比,同学们请看:
... ...
ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看如下的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬。
「赠人玫瑰,手留余香」,咱们下期拜拜~~
6. 热文推荐
若想学习更多,可以参考这篇专栏总结《2023最新首发,全网最全 Spring Boot 学习宝典(附思维导图)》,本专栏致力打造最硬核 Spring Boot 进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中。欢迎大家订阅持续学习。
在入门及进阶之途,我必助你一臂之力,系统性学习,从入门到精通,带你不走弯路,直奔终点;投资自己,永远性价比最高,都这么说了,你还不赶紧来学??
本文涉及所有源代码,均已上传至github开源,供同学们一对一参考 GitHub传送门,
同时,原创开源不易,欢迎给个star🌟,想体验下被🌟的感jio,非常感谢❗
7. 文末
我是bug菌,CSDN | 阿里云 | 华为云 | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金 | InfoQ | 51CTO等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。