springboot整合MongoDB实战

目录

环境准备

引入依赖

配置yml

注入mongoTemplate

集合操作

文档操作

创建实体

添加文档

查询文档

更新文档

删除文档


环境准备

引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置yml
spring:data:mongodb:uri: mongodb://127.0.0.1:27017/appdb?authSource=admin
注入mongoTemplate
@Autowired
MongoTemplate mongoTemplate;
集合操作
    @Testpublic void testCreateCollection(){boolean emp = mongoTemplate.collectionExists("employee");if(emp){mongoTemplate.dropCollection("employee");}mongoTemplate.createCollection("employee");}
文档操作
 相关注解@Document修饰范围: 用在类上作用: 用来映射这个类的一个对象为mongo中一条文档数据。属性:( value 、collection )用来指定操作的集合名称 @Id修饰范围: 用在成员变量、方法上作用: 用来将成员变量的值映射为文档的_id的值@Field修饰范围: 用在成员变量、方法上作用: 用来将成员变量及其值映射为文档中一个key:value对。属性:( name , value )用来指定在文档中 key的名称,默认为成员变量名@Transient修饰范围:用在成员变量、方法上作用:用来指定此成员变量不参与文档的序列化
创建实体
@Document("employee")  //对应emp集合中的一个文档
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {@Id   //映射文档中的_idprivate Integer id;@Field("username")private String name;@Fieldprivate int age;@Fieldprivate Double salary;@Fieldprivate Date entryDay;
}
添加文档

       insert方法返回值是新增的Document对象,里面包含了新增后_id的值。如果集合不存在会自动创建集合。通过Spring Data MongoDB还会给集合中多加一个_class的属性,存储新增时Document对应Java中类的全限定路径。这么做为了查询时能把Document转换为Java类型。

@Test
public void testInsert(){Employee employee = new Employee(1, "小明", 30,10000.00, new Date());//添加文档// sava:  _id存在时更新数据//mongoTemplate.save(employee);// insert: _id存在抛出异常   支持批量操作mongoTemplate.insert(employee);List<Employee> list = Arrays.asList(new Employee(2, "张三", 21,5000.00, new Date()),new Employee(3, "李四", 26,8000.00, new Date()),new Employee(4, "王五",22, 8000.00, new Date()),new Employee(5, "张龙",28, 6000.00, new Date()),new Employee(6, "赵虎",24, 7000.00, new Date()),new Employee(7, "赵六",28, 12000.00, new Date()));//插入多条数据mongoTemplate.insert(list,Employee.class);
}

       插入重复数据时: insert报DuplicateKeyException提示主键重复,save对已存在的数据进行更新。
       批处理操作时: insert可以一次性插入所有数据,效率较高,save需遍历所有数据,一次插入或更新,效率较低。

查询文档

       Criteria是标准查询的接口,可以引用静态的Criteria.where的把多个条件组合在一起,就可以轻松地将多个方法标准和查询连接起来,方便我们操作查询语句。

       

@Test
public void testFind(){System.out.println("==========查询所有文档===========");//查询所有文档List<Employee> list = mongoTemplate.findAll(Employee.class);list.forEach(System.out::println);System.out.println("==========根据_id查询===========");//根据_id查询Employee e = mongoTemplate.findById(1, Employee.class);System.out.println(e);System.out.println("==========findOne返回第一个文档===========");//如果查询结果是多个,返回其中第一个文档对象Employee one = mongoTemplate.findOne(new Query(), Employee.class);System.out.println(one);System.out.println("==========条件查询===========");//new Query() 表示没有条件//查询薪资大于等于8000的员工//Query query = new Query(Criteria.where("salary").gte(8000));//查询薪资大于4000小于10000的员工//Query query = new Query(Criteria.where("salary").gt(4000).lt(10000));//正则查询(模糊查询)  java中正则不需要有////Query query = new Query(Criteria.where("name").regex("张"));//and  or  多条件查询Criteria criteria = new Criteria();//and  查询年龄大于25&薪资大于8000的员工//criteria.andOperator(Criteria.where("age").gt(25),Criteria.where("salary").gt(8000));//or 查询姓名是张三或者薪资大于5000的员工criteria.orOperator(Criteria.where("name").is("张三"),Criteria.where("salary").gt(5000));Query query = new Query(criteria);//sort排序//query.with(Sort.by(Sort.Order.desc("salary")));//skip limit 分页  skip用于指定跳过记录数,limit则用于限定返回结果数量。query.with(Sort.by(Sort.Order.desc("salary"))).skip(0)  //指定跳过记录数.limit(4);  //每页显示记录数//查询结果List<Employee> employees = mongoTemplate.find(query, Employee.class);employees.forEach(System.out::println);
}
@Test
public void testFindByJson() {//使用json字符串方式查询//等值查询//String json = "{name:'张三'}";//多条件查询String json = "{$or:[{age:{$gt:25}},{salary:{$gte:8000}}]}";Query query = new BasicQuery(json);//查询结果List<Employee> employees = mongoTemplate.find(query, Employee.class);employees.forEach(System.out::println);
}
更新文档

updateFirst() 只更新满足条件的第一条记录

updateMulti() 更新所有满足条件的记录

upsert() 没有符合条件的记录则插入数据

@Test
public void testUpdate(){//query设置查询条件Query query = new Query(Criteria.where("salary").gte(15000));System.out.println("==========更新前===========");List<Employee> employees = mongoTemplate.find(query, Employee.class);employees.forEach(System.out::println);Update update = new Update();//设置更新属性update.set("salary",13000);//updateFirst() 只更新满足条件的第一条记录//UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Employee.class);//updateMulti() 更新所有满足条件的记录//UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Employee.class);//upsert() 没有符合条件的记录则插入数据//update.setOnInsert("id",11);  //指定_idUpdateResult updateResult = mongoTemplate.upsert(query, update, Employee.class);//返回修改的记录数System.out.println(updateResult.getModifiedCount());System.out.println("==========更新后===========");employees = mongoTemplate.find(query, Employee.class);employees.forEach(System.out::println);
}
删除文档
@Test
public void testDelete(){//删除所有文档//mongoTemplate.remove(new Query(),Employee.class);//条件删除Query query = new Query(Criteria.where("salary").gte(10000));mongoTemplate.remove(query,Employee.class);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642354.shtml

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

相关文章

优先级队列(堆)详解

优先级队列&#xff08;堆&#xff09;详解 目录 堆的概念堆的存储方式堆的基本操作优先级队列模拟实现PriorityQueue接口介绍堆排序Top-k问题 1、堆的概念 如果有一个关键码的集合K {k0&#xff0c;k1&#xff0c; k2&#xff0c;…&#xff0c;kn-1}&#xff0c;把它的所…

SAP 五个报废率设置简介(上)

通常在生产制造过程中都会面临报废率的问题,生产工艺路线的问题,原材料质量的问题,总会有一些产品在生产过程中被做成报废品,通常报废率的设置有时候会遵循行业的标准设置,亦或者根据工厂生产中统计的历史数据分析后根据不同的产品设置不同的报废率,从而在执行物料的采购…

VM下Unbunt虚拟机上网设置

系列文章目录 VM下虚拟机上网设置 VM下虚拟机上网设置 右击VM软件中你需要设置的虚拟机&#xff0c;选择设置 宿主机如果你用的是笔记本外加WIFI连接选择NAT网络模式 进入虚拟机看能否上网 不行的话&#xff0c;进入虚拟机点击&#xff0c;选择最后一栏&#xff0c;编辑连接 点…

华为认证的HCIP考实验考试么?

HCIP在考试的时候不考实验&#xff0c;只考笔试&#xff0c;只是不同方向的HCIP认证考试的考试科目不同&#xff0c;有的考一科&#xff0c;有的考二科&#xff0c;有的考三科&#xff0c;具体看方向来定。HCIA和HCIP只考笔试。HCIE考笔试和实验。 虽然HCIP不考实操&#xff0…

《WebKit 技术内幕》学习之七(1): 渲染基础

《WebKit 技术内幕》之七&#xff08;1&#xff09;&#xff1a; 渲染基础 WebKit的布局计算使用 RenderObject 树并保存计算结果到 RenderObject 树。 RenderObject 树同其他树&#xff08;如 RenderLayer 树等&#xff09;&#xff0c;构成了 WebKit 渲染的为要基础设施。 1…

【数据结构】链表(单链表与双链表实现+原理+源码)

博主介绍&#xff1a;✌全网粉丝喜爱、前后端领域优质创作者、本质互联网精神、坚持优质作品共享、掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战✌有需要可以联系作者我哦&#xff01; &#x1f345;附上相关C语言版源码讲解&#x1f345; &#x1f44…

python04-变量命名规则

python需要使用标识符来给变量命名。 标识符&#xff0c;我来解释下&#xff0c;就是给程序中变量、类、方法命名的符号&#xff0c;简单理解就是起一个名字&#xff0c;这个名字必须是合法的名字&#xff0c; 对于Python来说&#xff0c;标识符必须是以字母、下划线(_)开头&…

鸿蒙自定义刷新组件使用

前言 DevEco Studio版本&#xff1a;4.0.0.600 1、RefreshLibrary_HarmonyOS.har&#xff0c;用于HarmonyOS "minAPIVersion": 9, "targetAPIVersion": 9, "apiReleaseType": "Release", "compileSdkVersion": "3.…

用户画像系列——在线服务调优实践

前面文章讲到画像的应用的几个方面&#xff0c;其中画像的在线服务应用主要是在推荐场景、策略引擎场景&#xff0c;这两部分场景都是面向线上的c端服务。 推荐场景&#xff1a;根据不同的用户推荐不同的内容&#xff0c;做到个性化推荐&#xff0c;需要读取画像的一些偏好数据…

【方法】如何把Excel“只读方式”变成可直接编辑?

Excel在“只读方式”下&#xff0c;编辑后是无法直接保存原文件的&#xff0c;那如何可以直接编辑原文件呢&#xff1f;下面来一起看看看吧。 如果Excel设置的是无密码的“只读方式”&#xff0c;那在打开Excel后&#xff0c;会出现对话框&#xff0c;提示“是否以只读方式打开…

什么是甘特图?谁还不知道?做管理的来看看!

在现代商业社会&#xff0c;项目管理已成为不可或缺的技能。而甘特图作为一种强大的项目管理工具&#xff0c;正逐渐受到越来越多人的青睐。那么&#xff0c;什么是甘特图&#xff1f;又有什么工具可以绘制甘特图呢&#xff1f;本文将为你一一解答。 一、甘特图的定义 甘特图…

Unity - 简单音频视频

“Test_04” 音频 使用AudioTest脚本控制Audio Source组件&#xff0c;在脚本中声明"music"和"se"之后&#xff0c;在unity中需要将音频资源拖拽到对应位置。 AudioTest public class AudioTest : MonoBehaviour {// 声明音频// AudioClippublic AudioC…

Vulnhub-dc4

靶场下载 https://download.vulnhub.com/dc/DC-4.zip 信息收集 判断目标靶机的存活地址: # nmap -sT --min-rate 10000 -p- 192.168.1.91 -oN port.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-21 16:36 CST Stats: 0:00:03 elapsed; 0 hosts completed (1 up…

三、MySQL之创建和管理表

一、基础知识 1.1 一条数据存储的过程 存储数据是处理数据的第一步 。只有正确地把数据存储起来,我们才能进行有效的处理和分析。否则,只 能是一团乱麻,无从下手。 在 MySQL 中, 一个完整的数据存储过程总共有 4 步,分别是创建数据库、确认字段、创建数据表、插入数据。 …

在字节5年被优化,太难了。。。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 先简单说下&#xff0c;涵哥是某不知名 985 的本硕&#xff0c;17 年毕业加入字节&#xff0c;以…

自学网安-DNS

01DNS Domain Name Service域名服务 作用&#xff1a;为客户机提供域名解析服务器 02域名组成 2.1域名组成概述 如"www.sina.com.cn"是一个域名&#xff0c;从严格意义上讲&#xff0c;"sina.com.cn"才被称为域名(全球唯一)&#xff0c;而"www"…

layui 自定义日期选择器今日、昨日 、本周、本月、上个月等

1、layui 日期选择器 laydate日期选择器 <div class"layui-input-inline"><input class"layui-input" id"dateTime" placeholder"日期范围"> </div><script> layui.use([laydate], function () {laydate.ren…

QT upd测试

QT upd测试 本次测试将服务器和客户端写在了一个工程下&#xff0c;代码如下 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QUdpSocket> #include<QTimer>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE…

编程入门:五个你必须知道的编程常识

常识1&#xff1a;编程不仅仅是写代码 当我们谈论编程时&#xff0c;大多数人首先想到的是写代码。这是正确的&#xff0c;但并不完整。编程不仅仅是写代码&#xff0c;而是解决问题的一种方式。编程是一种工具&#xff0c;我们使用它来创建能够解决特定问题的产品和服务。 比…

qmt和ptrade有什么区别?国内免费量化交易软件精选:让你轻松上手量化交易!

QMT 和 PTrade 是两个不同的平台&#xff0c;具有不同的功能和特点。 QMT&#xff08;Quantitative Market Trading&#xff09;是一种量化交易平台&#xff0c;主要面向专业的量化交易员和机构交易员。它提供了一系列的工具和功能&#xff0c;帮助交易员进行定量分析、模型开…