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

news2024/11/23 21:22:30

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 主键
     */
    @Id
    private 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;
    }

    @Override
    public 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.coloradmin.cn/o/609430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汽车新能源 - 单体电压值为什么通常是5V以内

常见蓄电池单体电压的值&#xff08;25℃&#xff09;&#xff0c;如下表&#xff1a; 蓄电池类型单体电压&#xff08;V&#xff09;铅酸 蓄电池2.08镍金属氢 蓄电池&#xff08;NIMH&#xff09;1.32锂离子 蓄电池2.5~4.2&#xff08;典型3.6&#xff09; 单体电压为什么不…

安卓学习笔记(一)

从今天开始我们开始学习安卓的知识&#xff1a; 1.0 Android基础入门教程 1.Android背景与当前的状况 Android系统是由Andy Rubin创建的&#xff0c;后来被Google收购了&#xff1b;最早的版本是:Android 1.1版本 而现在最新的版本是今年5.28&#xff0c;Google I/O大会上推…

Logstash部署与使用

ElasticSearch 1、ElasticSearch学习随笔之基础介绍 2、ElasticSearch学习随笔之简单操作 3、ElasticSearch学习随笔之java api 操作 4、ElasticSearch学习随笔之SpringBoot Starter 操作 5、ElasticSearch学习随笔之嵌套操作 6、ElasticSearch学习随笔之分词算法 7、ElasticS…

123网盘在线解析PHP版源码

123网盘解析PHP版本源码是一种非常实用的工具&#xff0c;可以方便地帮助用户在网页上直接解析出其它网站中的资源&#xff0c;并提供下载链接。当用户需要获取某些资源时&#xff0c;往往需要通过各种搜索引擎或者专业的资源网站进行查找&#xff0c;而且很多时候找到了资源链…

Android NDK集成OpenCV使用C++的.h和.so库函数

Android NDK集成OpenCV使用C的.h和.so库函数 opencv可以作为一个单独的Android module库&#xff0c;被工程下的其他模块使用&#xff0c;但是这样就没法在Android NDK项目的c代码直接使用opencv的.h文件和.so文件。要在Android NDK项目C代码文件中使用&#xff0c;则需要以An…

Nautilus Chain上首个DEX PoseiSwap即将开启IDO

据悉&#xff0c;Nautilus Chain 上的首个 DEX PoseiSwap 即将开启 IDO &#xff0c;根据官方的最新公告显示&#xff0c;PoseiSwap 即将于 6 月 13 日至 6 月 14 日期间&#xff0c;在 Bounce 平台开启其治理通证 $POSE 的 IDO&#xff08;Initial DEX Offering&#xff09;&a…

数据分析--Numpy初级(一)

Numpy初级 Ndarray对象dtype对象 Numpy是数据分析的基础库&#xff0c;它支持大量的维度计算与矩阵运算。同时他也是一个运行速度非常快的数学库&#xff0c;主要用于数组计算&#xff0c;具有线性代数、傅里叶变换、随机数生成等功能。 Ndarray对象 Numpy最重要的一个特点就…

【内部类】

目录 1.什么是内部类2.内部类分类2.1静态内部类2.非静态内部类2.3 局部内部类&#xff08;几乎不用&#xff0c;大家了解&#xff09; 3.匿名内部类 1.什么是内部类 在Java中&#xff0c;可以将一个类定义在一个类中或者在一个方法中&#xff0c;前者称为内部类&#xff0c;后…

JAVA打印Hello World的底层实现

任何一个学过JAVA的人应该都对这段代码非常熟悉。空闲时间翻了下代码&#xff0c;看看它的底层是怎么实现的 public class HelloWorld {public static void main(String[] args) {System.out.print("Hello, World!");} }首先点开out&#xff0c;发现它是System类中的…

JAVA微服务_网关

服务网关 什么是服务网关/API网关 API Gateway&#xff08;APIGW / API 网关&#xff09;&#xff0c;顾名思义&#xff0c;是系统对外的唯一入口。API网关封装了系统内部架构&#xff0c;为每个客户端提供定制的API。 近几年来移动应用与企业间互联需求的兴起。从以前单一的…

数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

目录 问题分类 无权图单源最短路径算法 思路 伪代码 时间复杂度 代码实现&#xff08;C语言&#xff09; 有权图单源最短路径算法 Dijkstra&#xff08;迪杰斯特拉&#xff09;算法 伪代码 时间复杂度 代码实现&#xff08;C语言&#xff09; 多源最短路径算法 …

《Apollo 智能驾驶进阶课程》四、感知

1. 感知概貌 2. 传感器和标定 激光雷达&#xff1a;主动式&#xff0c;发射功率限制 Camera: 被动式&#xff0c;受到光照影响大 Radar : 多普勒效率 相对速度 超声波: 感知距离有限&#xff0c;倒车时使用。 … 最后设备还在研发过程中。 PnP问题&#xff0c;解决标定。 IC…

chatgpt赋能python:Python实现字符串匹配的SEO优化

Python实现字符串匹配的SEO优化 在现代网络中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已成为一项必不可少的技能。它涉及到网站的排名、用户的流量和营销策略等方面。关键字匹配是一种常见的SEO技术&#xff0c;它可以帮助你的网站在搜索引擎中排名更高。 本篇文…

Java 实现判定顺序表中是否包含某个元素的方法

一、思路 1.定义一个toFind变量来传入要查找的元素 2.遍历整个顺序表并判定当前下标的元素等不等于toFind 3.如果等于就返回一个true&#xff0c;否则返回false。 二、图解 首先调用以下的方法求出顺序表的长度&#xff0c;再使用 for 循环遍历每一个元素。 // 求顺序表的长…

《嵌入式系统》知识总结9:使用STM32固件库操纵GPIO

STM32固件库&#xff08;函数库&#xff09; “STM32 标准函数库”它是由 ST 公司针对 STM32 提供的函数接口&#xff0c;即 API (Application Program Interface)&#xff0c;开发者可调用这些函数接口来配置 STM32的寄存器&#xff0c;使开发人员得以脱离最底层的寄存器操作&…

《阿里大数据之路》研读笔记(1)

首先先看到OLAP和OLTP的区别&#xff1a; OLTP(Online transaction processing):在线/联机事务处理。典型的OLTP类操作都比较简单&#xff0c;主要是对数据库中的数据进行增删改查&#xff0c;操作主体一般是产品的用户或者是操作人员。 OLAP(Online analytical processing):…

libVLC 抓取视频帧并渲染(QGraphicsView)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在《libVLC 抓取视频帧并渲染(QWidget)》介绍完 QWidget 对视频帧的渲染之后,是时候介绍第二种方式了 - QGraphicsView/QGraphicsScene/QGraphicsItem 图形视图框架。 基本步骤:自定义一个 QGraphicsIte…

RK3588平台开发系列讲解(驱动基础篇)等待队列

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、等待队列二、等待队列头三、等待队列项四、添加/删除队列五、等待唤醒六、等待事件沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧…

KeepChatGPT: chatGPT增强插件,解决报错、保持活跃,让AI更丝滑

KeepChatGPT&#xff1a; chatGPT增强插件&#xff0c;解决报错、保持活跃&#xff0c;让AI更丝滑 这是一个ChatGPT的畅聊与增强插件。开源免费。不仅能解决所有报错不再刷新&#xff0c;还有保持活跃、取消审计、克隆对话、净化首页、展示大屏、展示全屏、言无不尽、拦截跟踪…

周赛348(模拟、反向思维、数位DP)

文章目录 [6462. 最小化字符串长度](https://leetcode.cn/problems/minimize-string-length/)阅读理解 [6424. 半有序排列](https://leetcode.cn/problems/semi-ordered-permutation/)模拟 [6472. 查询后矩阵的和](https://leetcode.cn/problems/sum-of-matrix-after-queries/)…