SpringBoot 整合 MongoDB 实现数据的增删改查功能

news/2024/11/19 23:41:50/

1、介绍说明

在 MongoDB 中有三个比较重要的名词:数据库、集合、文档

数据库(Database):和关系型数据库一样,每个数据库中有自己的用户权限,不同的项目组可以使用不同的数据库
集合(Collection): 集合指的是文档组(类似于 Mysql 中的表的概念),里面可以存储许多文档
文档(Document): 文档是 MongoDB 中最基本的数据单元,由键值对组成,类似于 JSON 格式,可以存储不同字段,字段的值可以包括其他文档、数组和文档数组
搞懂这三个名词,基本就可以上手了,今天我们以 SpringBoot 整合 MongoDB 为例,实现数据的增删改查。

2、代码实践

2.1、创建 SpringBoot 工程,添加 MongoDB 依赖包

<!-- 引入springboot -->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.0.RELEASE</version>
</parent><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

2.2、添加配置文件

在application.properties文件中添加mongodb相关配置!

#配置数据库连接地址

spring.data.mongodb.uri=mongodb://userName:password@127.0.0.1:27017/dbName

相关参数说明:

userName:表示用户名,根据实际情况填写即可
password:表示用户密码,根据实际情况填写即可
dbName:表示数据库,可以自定义,初始化数据的时候,会自动创建

2.3、创建实体类

创建一个实体类Stuinfo,其中注解@Document(collection=“stuInfo”)表示当前实体类对应的集合名称是stuInfo,类似于关系型数据库中的表名称。

注解@Id表示当前字段,在集合结构中属于主键类型。

/*** 使用@Document注解指定集合名称*/
@Document(collection="stuInfo")
public class StuInfo implements Serializable {private static final long serialVersionUID = 99999999999999L;/*** 使用@Id注解指定MongoDB中的 _id 主键*/@Idprivate Long id;private String userName;private String passWord;private Integer age;private Date createTime;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}@Overridepublic String toString() {return "StuInfo{" +"id=" + id +", userName='" + userName + '\'' +", passWord='" + passWord + '\'' +", age=" + age +", createTime=" + createTime +'}';}
}

2.4、操作 MongoDB

Springboot 操作 MongoDB 有两种方式。

第一种方式是采用 Springboot 官方推荐的 JPA 方式,这种操作方式,使用简单但是灵活性比较差。

第二种方式是采用 Spring Data MongoDB 基于 MongoDB 官方 Java API 封装的 MongoTemplate 操作类对 MongoDB 进行操作,这种方式非常灵活,能满足绝大部分需求。

本文将采用第二种方式进行介绍

2.5、插入文档

MongoTemplate提供了insert()方法,用于插入文档,示例代码如下:

用于插入文档

没指定集合名称时,会取@Document注解中的集合名称

@Autowired
private MongoTemplate mongoTemplate;@Test
public void mongoTest(){try {StuInfo stuInfo =new StuInfo();stuInfo.setId(2l);stuInfo.setUserName("test");stuInfo.setPassWord("123456");stuInfo.setCreateTime(new Date());mongoTemplate.insert(stuInfo);System.out.println("插入成功");}catch (Exception ex){ex.printStackTrace();}
}

我们可以用MongoDB Compass 工具进行查看

自定义集合名称,插入文档

指定集合名称即可

mongoTemplate.insert(stuInfo,”stuInfo”);

自定义集合,批量插入文档

如果采用批量插入文档,必须指定集合名称

List<StuInfo> list =new ArrayList<>();
StuInfo stuInfo =new StuInfo();
stuInfo.setId(3l);
stuInfo.setUserName("test3");
stuInfo.setPassWord("123456");
stuInfo.setCreateTime(new Date());
StuInfo stuInfo1 =new StuInfo();
stuInfo1.setId(4l);
stuInfo1.setUserName("test4");
stuInfo1.setPassWord("123456");
stuInfo1.setCreateTime(new Date());
list.add(stuInfo);
list.add(stuInfo1);
mongoTemplate.insert(list,"stuInfo");
System.out.println("批量插入成功");

2.6、存储文档

MongoTemplate提供了save()方法,用于存储文档。

在存储文档的时候会通过主键 ID 进行判断,如果存在就更新,否则就插入,示例代码如下:

存储文档,如果没有插入,否则通过主键ID更新

StuInfo stuInfo =new StuInfo();
stuInfo.setId(2l);
stuInfo.setUserName("修改后的名称");
stuInfo.setPassWord("123123");
stuInfo.setCreateTime(new Date());
mongoTemplate.save(stuInfo);
System.out.println("修改成功");

自定义集合,存储文档

StuInfo stuInfo =new StuInfo();
stuInfo.setId(2l);
stuInfo.setUserName("修改后的名称");
stuInfo.setPassWord("123123");
stuInfo.setCreateTime(new Date());
mongoTemplate.save(stuInfo,"stuInfo");
System.out.println("修改成功");

2.7、更新文档

MongoTemplate提供了updateFirst()和updateMulti()方法,用于更新文档,示例代码如下:

更新文档,匹配查询到的文档数据中的第一条数据

StuInfo stuInfo =new StuInfo();
stuInfo.setId(2l);
stuInfo.setUserName("修改Name");
stuInfo.setPassWord("222222");
stuInfo.setCreateTime(new Date());
//更新条件
Query query= new Query(Criteria.where("id").is(stuInfo.getId()));//更新值
Update update= new Update().set("userName", stuInfo.getUserName()).set("passWord", stuInfo.getPassWord());
//更新查询满足条件的文档数据(第一条)
UpdateResult result =mongoTemplate.updateFirst(query,update, StuInfo.class);
if(result!=null){System.out.println("更新条数:" + result.getMatchedCount());
}

更新文档,匹配查询到的文档数据中的所有数据

StuInfo stuInfo =new StuInfo();
stuInfo.setId(2l);
stuInfo.setUserName("修改Name");
stuInfo.setPassWord("222222");
stuInfo.setCreateTime(new Date());
//更新条件
Query query= new Query(Criteria.where("id").is(stuInfo.getId()));//更新值
Update update= new Update().set("userName", stuInfo.getUserName()).set("passWord", stuInfo.getPassWord());
//更新查询满足条件的文档数据(第一条)
UpdateResult result =mongoTemplate.updateMulti(query,update, StuInfo.class);
if(result!=null){System.out.println("更新条数:" + result.getMatchedCount());
}

2.8、删除操作

MongoTemplate提供了remove()、用于删除文档,

删除符合条件的所有文档,并返回删除的文档,这里我就不一一贴代码了,大家可以查一下帮助文档或者搜索引擎

2.9、查询文档

MongoTemplate提供了文档查询方法,日常开发中用的findById()方法,示例代码如下:

long id = 1l;
StuInfo result = mongoTemplate.findById(id, StuInfo.class);
System.out.println("查询结果:" + result.toString());

查询集合中的全部文档数据

long id = 1l;
List<StuInfo> list = mongoTemplate.findAll(StuInfo.class);
System.out.println("查询总行:" + list.size());

查询的还有很多方法,大家需要时可以查询帮助文档

3.0、索引管理

索引在所有的数据库中,暂居的位置非常重要,例如当你检索一张上百万的数据表的时候,如果没走索引,查询效率会极其缓慢,对于 MongoDB 来说,同样如此。

示例如下:

创建升序索引

// 设置字段名称
String field = "userName";
// 创建索引
mongoTemplate.getCollection("stuInfo").createIndex(Indexes.ascending(field));

移除索引

// 设置字段名称
String field = "userName";
// 创建索引
mongoTemplate.getCollection("stuInfo").dropIndex(Indexes.ascending(field));

查询集合中所有的索引

我们还可以通过在实体类上加注解方式来创建索引 @Indexed

3.1、引入 MongoDB 中的事务

单节点 mongodb 不支持事务,需要搭建 MongoDB 复制集。

3、小结

在实际的业务场景中,可能还需要用到聚合函数等高级查询,大家如果有这种需求,可以访问如下地址获取更加详细的api

spring官方文档 https://docs.spring.io/spring-data/data-mongo/docs/1.10.12.RELEASE/api/  介绍

MongoDB 官方文档查询 api https://www.mongodb.com/docs/drivers/java/ 介绍

本文主要围绕 SpringBoot 整合 MongoDB 实现数据的增删改查操作进行基本介绍,如果有描述不对的,还望网友留言指出!我会第一时间修改相关内容。假如我的这篇内容对你有任何帮助的话,麻烦给我点一个赞。你的点赞就是我前进的动力。


http://www.ppmy.cn/news/209945.html

相关文章

「解析」牛客网-华为机考企业真题 1-20

又是一年春招时&#xff0c;有幸收到华为自动驾驶算法岗&#xff0c;之前刷题不多&#xff0c;在此汇总下牛客网的真题&#xff0c;主要采用Python编写&#xff0c;个人觉得语言只是实现工具而已&#xff0c;并不是很关键&#xff0c;Python简洁易懂&#xff0c;更加适合算法工…

Jenkins+Docker+SpringCloud微服务持续集成之集群部署

一、集群部署流程说明 环境配置 #环境配置 hostnamectl set-hostname web2-server && su systemctl stop firewalld systemctl disable firewalldvim /etc/selinux/config SELINUXdisabledvim /etc/resolv.conf nameserver 114.114.114.114#安装依赖包 yum install -y…

vr 体验 vr游戏

<<the lab>>是htc value 官方出的vr实验室&#xff0c;里面包含了很多个小游戏&#xff0c;是目前最好的vr体验实例。

ps4虚拟现实VR眼镜入手体验

随着近几年越来越多的资本注入VR行业&#xff0c;市面上VR眼镜的款式和品牌也越来越多&#xff0c;不管是价格高低可以说VR眼镜已经覆盖了中高低端市场&#xff0c;今天小九主要为大家来讲一下ps4虚拟现实VR眼镜的入手体验&#xff0c;为什么要挑选这一款呢?因为市面上很多游戏…

索尼PS4程序升级,令PS VR带来私人3D影院体验

原文标题&#xff1a;索尼PS4程序升级&#xff0c;令PS VR带来私人3D影院体验 从VR技术“复兴”以来&#xff0c;被类比最多的就是此前的3D技术&#xff0c;后者已经随着几大电视厂商正式停产3D电视而寿终正寝。虽然3D电视已经没戏了&#xff0c;但不代表你买的3D蓝光碟也没用了…

Oculus'Quest是第一款真正的VR游戏机

Oculus’Quest是第一款真正的VR游戏机 Oculus VR在周三的年度Connect开发者大会上发布了一个巨大的硬件惊喜&#xff1a;全新的独立Quest虚拟现实耳机。Quest是Oculus过去五年VR工作的总结&#xff0c;Facebook首席执行官马克扎克伯格称这是迈向十亿人进入VR的重要一步。 但第…

java vr 开发_VR:虚拟与现实

​1 周末体验了一把VR眼镜带来的不同乐趣。 给我的直观感受可以用两个字来形容&#xff1a;”颠覆“。 其中的游戏体验可以用2D到3D上升一个维度&#xff0c;3D再到VR再次上升一个维度来形容&#xff0c;完全的沉浸体验&#xff0c;给人身临其境的感觉。 戴上VR眼镜&#xff0c…

索尼PS VR游戏体验汇总 399美元起高端VR究竟值不值得买?

索尼PS VR附带的迷之小黑盒到底是干什么用的&#xff1f; 时隔两年&#xff0c;索尼再次在 GDC&#xff08;游戏开发者大会&#xff09; 展示 PlayStation VR &#xff08;之前叫 Project Morpheus&#xff09;。在 Oculus Rift、HTC Vive 等明星产品纷纷公布售价后&#xff0c…