MongoDB整合SpringBoot

文章目录

  • SpringBoot整合MongoDB
    • 环境准备
    • 文档操作
      • 相关注解
      • 创建实体
      • 添加文档
      • 查询文档
      • 更新文档
      • 删除文档
    • 小技巧:如何去掉_class属性

SpringBoot整合MongoDB

https://docs.spring.io/spring-boot/docs/current/reference/html/data.html#data.nosql.mongodb.repositories

注意关注MongoDB服务端和客户端之间的版本兼容问题:https://docs.spring.io/spring-data/mongodb/reference/preface.html



环境准备

  1. 引入依赖
<!--spring data mongodb-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>



  1. 配置文件的编写

    server:port: 8088spring:application:name: mongdb-serverdata:mongodb:uri: mongodb://hushang:123456@192.168.75.100:27017/test?authSource=admin
    #       uri等同于下面的配置
    #      database: test
    #      host: 192.168.75.100
    #      port: 27017
    #      username: hushang
    #      password: 123456
    #      authentication-database: admin
    

    连接配置参考文档:https://docs.mongodb.com/manual/reference/connection-string/



  1. 测试

    // LearnMongodbApplicationTest为我们在测试包下定义的主启动类
    public class MongoTemplateTests extends LearnMongodbApplicationTest{@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void testCollection(){boolean exists = mongoTemplate.collectionExists("emp");if (exists){// 删除集合mongoTemplate.dropCollection("emp");}// 如果不存在则创建mongoTemplate.createCollection("emp");}
    }
    



文档操作

相关注解

  • @Document

    • 修饰范围: 用在类上
    • 作用: 用来映射这个类的一个对象为mongo中一条文档数据。
    • 属性:( value 、collection )用来指定操作的集合名称
  • @Id

    • 修饰范围: 用在成员变量、方法上
    • 作用: 用来将成员变量的值映射为文档的_id的值
  • @Field

    • 修饰范围: 用在成员变量、方法上
    • 作用: 用来将成员变量及其值映射为文档中一个key:value对。
    • 属性:( name , value )用来指定在文档中 key的名称,默认为成员变量名
  • @Transient

    • 修饰范围:用在成员变量、方法上
    • 作用:用来指定此成员变量不参与文档的序列化



创建实体

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;import java.util.Date;/*** @Description: 临时emp 集合中的文档实体对象* @Author 胡尚* @Date: 2024/7/27 19:09*/
@Data
@Document("emp")  // 需要和mongodb中的collection名对应上
@AllArgsConstructor
@NoArgsConstructor
public class Employee {@Idprivate Integer id;@Field("username")private String name;@Fieldprivate Integer age;@Fieldprivate Date cteateTime;// 指定此成员变量不参与文档的序列化@Transientprivate String script;
}



添加文档

insert方法返回值是新增的Document对象,里面包含了新增后_id的值。如果集合不存在会自动创建集合。

通过Spring Data MongoDB还会给集合中多加一个_class的属性,存储新增时Document对应Java中类的全限定路径。

这么做为了查询时能把Document转换为Java类型。

@Test
public void testInsertDocument(){Employee user = new Employee(1, "hushang", 25, new Date(), "这是一个测试数据");// 添加文档// save()  方法  _id存在时进行更新操作Employee userSave = mongoTemplate.save(user);System.out.println(userSave);// insert() _id存在时抛异常  支持批量操作//Employee userSave = mongoTemplate.insert(user);}



此时我mongodb中保存的结果为

test> db.emp.find()
[{_id: 1,username: 'hushang',age: 25,cteateTime: ISODate("2024-07-27T11:19:15.014Z"),_class: 'com.hs.learn.entity.Employee'}
]



我们在试试insert()方法的批量插入

@Test
public void testInsertDocument(){ArrayList<Employee> employeeArrayList = new ArrayList<>();employeeArrayList.add(new Employee(2, "hushang", 25, new Date(), ""));employeeArrayList.add(new Employee(3, "hushang", 25, new Date(), ""));employeeArrayList.add(new Employee(4, "hushang", 25, new Date(), ""));// 插入多条记录mongoTemplate.insert(employeeArrayList, Employee.class);
}



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



查询文档

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

在这里插入图片描述



@Test
public void testFind(){log.info("==========查询所有文档===========");List<Employee> employeeList = mongoTemplate.findAll(Employee.class);employeeList.forEach(System.out::println);log.info("==========根据_id查询===========");Employee mongoTemplateById = mongoTemplate.findById(1, Employee.class);System.out.println(mongoTemplateById);log.info("==========findOne返回第一个文档===========");Employee employeeByOne = mongoTemplate.findOne(new Query(), Employee.class);System.out.println(employeeByOne);log.info("==========条件查询===========");//new Query() 表示没有条件//查询年龄大于等于18的数据Query query1 = new Query(Criteria.where("age").gt(18));//查询年龄大于等于18 小于28的数据Query query2 = new Query(Criteria.where("age").gt(18).lt(28));// 正则查询(模糊查询)  java中正则不需要有//// 这里用 name  或者是 username 都能查询Query query3 = new Query(Criteria.where("name").regex("hu"));log.info("==========and  or  多条件查询===========");Criteria criteria = new Criteria();// 查询年龄大于18 并且 name为hushang的//        criteria.andOperator(Criteria.where("age").gt(18), Criteria.where("name").is("hushang"));// 查询name为hushang 或者 年龄小于等于30criteria.orOperator(Criteria.where("name").is("hushang"), Criteria.where("age").lte(30));Query query4 = new Query(criteria);System.out.println(mongoTemplate.find(query4, Employee.class));log.info("==========sort排序===========");// 安装年龄进行降序排序Query query5 = new Query();query5.with(Sort.by(Sort.Order.desc("age")));log.info("======skip limit 分页 =======");// skip用于指定跳过记录数,limit则用于限定返回结果数量。// 安装年龄进行排序,在进行分页Query query6 = new Query();query6.with(Sort.by(Sort.Order.desc("age"))).skip(1).limit(2);}



@Test
public void testFindByJson(){// 等值查询 查询username为hushang的文档String json = "{username: 'hushang'}";// 多条件查询String json2 = "{$and: [{age: {$gt: 18}},{age: {$lt: 28}}]}";BasicQuery basicQuery = new BasicQuery(json2);List<Employee> employees = mongoTemplate.find(basicQuery, Employee.class);employees.forEach(System.out::println);}



更新文档

在Mongodb中无论是使用客户端API还是使用Spring Data,更新返回结果一定是受行数影响。如果更新后的结果和更新前的结果是相同,返回0。

  • updateFirst() 只更新满足条件的第一条记录
  • updateMulti() 更新所有满足条件的记录
  • upsert() 没有符合条件的记录则插入数据
// Update对象是这个包下的 import org.springframework.data.mongodb.core.query.Update;@Test
public void testUpdate(){//query设置查询条件Query query = new Query(Criteria.where("username").is("hushang"));log.info("==========更新前===========");List<Employee> employees = mongoTemplate.find(query, Employee.class);employees.forEach(System.out::println);Update update = new Update();update.set("age", 18);// updateFirst()只更新满足条件的一条文档//        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Employee.class);// updateMulti()更新所有满足条件的文档//        UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Employee.class);// upsert() 没有符合条件的记录则插入数据//        UpdateResult updateResult = mongoTemplate.upsert(query, update, Employee.class);}



删除文档

@Test
public void testDelete(){//删除所有文档//mongoTemplate.remove(new Query(),Employee.class);//条件删除Query query = new Query(Criteria.where("age").gte(45));mongoTemplate.remove(query,Employee.class);// mongodb还有下面两个移除相关的方法// mongoTemplate.findAllAndRemove()// mongoTemplate.findAndRemove()
}



小技巧:如何去掉_class属性

@Configuration
public class TulingMongoConfig {/*** 定制TypeMapper去掉_class属性* @param mongoDatabaseFactory* @param context* @param conversions* @return*/@BeanMappingMongoConverter mappingMongoConverter(MongoDatabaseFactory mongoDatabaseFactory,MongoMappingContext context, MongoCustomConversions conversions){DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDatabaseFactory);MappingMongoConverter mappingMongoConverter =new MappingMongoConverter(dbRefResolver,context);mappingMongoConverter.setCustomConversions(conversions);//构造DefaultMongoTypeMapper,将typeKey设置为空值mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));return mappingMongoConverter;}}

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

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

相关文章

prompt技巧(2) - 如何解决对话过程中角色反转问题

在一些角色扮演场景下&#xff0c;需要大模型扮演某个角色进行对话&#xff0c;但是在对话过程中偶尔会发生角色反转问题&#xff0c;如大模型扮演客户角色与销售人员进行对话&#xff0c;大模型有时会忘记自己身份&#xff0c;突然以销售人员的身份进行回答&#xff0c;这种情…

ubuntu上部署vue项目到ngixn中+SpringBoot项目+postgresql数据库

文章目录 前提1.Ubuntu上安装ngix2.部署Vue项目2.1上传vue项目2.2.配置 3.Ubuntu上安装Postgres4.部署springboot项目 前提 记一次在ubuntu部署前端vue和后端springboot项目&#xff0c;以及数据库postgresql的安装以及启动、停止等常用的命令。 1.Ubuntu上安装ngix 1、检查…

Cuppa CMS v1.0 任意文件读取漏洞(CVE-2022-25578)

前言 春秋云镜靶场是一个专注于网络安全培训和实战演练的平台&#xff0c;旨在通过模拟真实的网络环境和攻击场景&#xff0c;提升用户的网络安全防护能力和实战技能。这个平台主要提供以下功能和特点&#xff1a; 实战演练&#xff1a; 提供各种网络安全攻防演练场景&#…

yolo模型训练出的.pt文件过大

当我们使用yolov8训练时候&#xff0c;保存的模型变大&#xff0c;如下图&#xff1a; 原模型 训练出来的模型 经过仔细调查&#xff0c;发现是保存的模型中多了很多数据。 原模型 训练出来的模型 只需要把文件中.pt文件读取&#xff0c;重写一遍保存。 from ultralytics im…

深入源码:解析SpotBugs (6)jvm 字节码简介

文章目录 一、JVM字节码概述一、文件结构概述二、详细解析1. 魔数和Class文件的版本2. 常量池3. 访问标志4. 类索引、父类索引与接口索引集合5. 字段表和方法表6. 属性表 字节码Spotbugs 作为一名资深的Java开发工程师&#xff0c;对JVM及其字节码有着深入的理解。现在&#xf…

Linux基于centOS7 【进度条】【Git】【gdb】学习

目录 进度条 进度条的前置准备 sleep &#xff08;秒&#xff09;& usleep&#xff08;微秒&#xff09; sleep加\n和不加\n的区别 IO函数的缓冲区 回车&换行 10秒倒计时 进度条编写 git的使用 为什么要有git&#xff08;git版本控制器&#xff09; git的主要…

江科大/江协科技 STM32学习笔记P13

文章目录 TIM定时中断1、TIM简介计数器PSC预分频器ARR自动重装寄存器 2、定时器类型基本定时器主模式触发DAC 通用定时器高级定时器 3、定时器原理定时中断基本结构预分频器时序计数器时序RCC时钟树 TIM定时中断 1、TIM简介 定时器的基准时钟一般都是主频72MHz&#xff0c;如果…

业绩增长新引擎:智能名片如何助力销售突破

01、智能名片&#xff0c;营销增长利器 在当今竞争激烈的市场环境下&#xff0c;企业正面临着类似品牌曝光不足、销售线索获取困难、客户关系维护复杂等诸多挑战。为帮助企业解决相关难题&#xff0c;促进业绩高效增长&#xff0c;纷享营销通的 智能名片 应运而生&#xff0…

Leetcode—74. 搜索二维矩阵【中等】

2024每日刷题&#xff08;149&#xff09; Leetcode—74. 搜索二维矩阵 实现代码 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size();int n matrix[0].size();int l 0;int r m * n;int mid -1…

DB-gpt + one-api + kimi-free-api 真香

# 1. 新建文件夹 one-api 和 子目录 mkdir -p /docker/one-api/data# 运行容器one-api docker run --name one-api -d --restart always -p 3333:3000 \ -e TZAsia/Shanghai -e REDIS_CONN_STRINGredis://192.168.0.3:6379 -e SYNC_FREQUENCY60 -e SQL_DSNroot:123456tcp(192.1…

springboot整合junit-用于测试用例

package impl;public interface BookDao {public void save(); }第一步&#xff1a;打开软件&#xff0c;点击file&#xff0c;点击new 然后选择module&#xff0c;在右侧选择springboot 第二步&#xff1a;选择配置和JDK以及java版本 ①选择maven类型 ②选择JDK1.8版本 ③选…

极限两边夹定理

极限两边夹定理 1. 定义 两边夹定理 (又称作夹逼定理) 说的是&#xff0c;如果一个函数 f f f 被夹在函数 g g g 和函数 h h h 之 间&#xff0c;当 x → a x \rightarrow a x→a 时&#xff0c;这两个函数 g g g 和 h h h 都收敛于同一个极限 L L L&#xff0c;那么当…

全国区块链职业技能大赛样题第9套后端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 项目预览 登录 用户管理

LRTimelapse Pro 7.0 安装教程

软件介绍 LRTimelapse Pro (LRT) 是一款专业的延迟摄影编辑渲染工具&#xff0c;具有高清输出、简单易用、无缝转换等特点。是非常强大的一款延迟摄影工具&#xff01;LRTimelapse Pro可以将您的影片提升一个水准。 程序可以配合 Adobe Lightroom, Adobe Camera RAW 和 Adobe…

2024年孝感中级职称报名开始了吗?

2024年孝感中级职称申报终于开始了&#xff0c;之前参加过水测的小伙伴们&#xff0c;开始准备评审了 2024年孝感本批次申报时间&#xff1a;中级、初级职称网上申报时间:2024年8月1日至8月31日。 注意&#xff1a;个人通过“湖北省职称评审管理信息系统”申报&#xff0c;须先…

Llama 3.1 重磅发布,登顶开源大模型王座!

7月23日&#xff0c;Meta正式发布迄今为止最强大的开源模型——Llama 3.1 405B&#xff0c;同时发布了全新升级的Llama 3.1 70B和8B模型。 Meta在正式发布里也附上了长达92页的论文《The Llama 3 Herd of Models》&#xff0c;揭示了Llama 3模型的技术和训练细节。 论文地址&am…

Jacoco 单元测试配置

前言 编写单元测试是开发健壮程序的有效途径&#xff0c;单元测试写的好不好可以从多个指标考量&#xff0c;其中一个就是单元测试的覆盖率。单元测试覆盖率可以看到我们的单元测试覆盖了多少代码行、类、分支等。查看单元测试覆盖率可以使用一些工具帮助我们计算&#xff0c;…

图解RocketMQ之生产者如何进行消息重试

大家好&#xff0c;我是苍何。 上一篇留了一个小问题&#xff0c;如果消费者出现异常&#xff0c;消费某一条消息失败&#xff0c;这时候 RocketMQ 会怎么处理呢&#xff1f; 你可能会用你聪明绝顶的脑袋瓜子想&#xff0c;苍何你是不是傻&#xff0c;失败了肯定重试啊&#…

单据新增,限制单据栏位的录入值,设置过滤条件

希望通过开发实现 单据头的组织栏位,只能选择101开头的组织,实现的效果如下: 代码如下: using Kingdee.BOS.Util; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using System.ComponentModel;namespace cux.button.test {…

基于opencv的人脸识别(实战)

前言 经过这几天的学习&#xff0c;我已经跃跃欲试了&#xff0c;相信大家也是&#xff0c;所以我决定自己做一个人脸识别程序。我会把自己的思路和想法都在这篇博客内讲清楚&#xff0c;大家可以当个参考&#xff0c;&#x1f31f;仅供学习使用&#x1f31f;。 &#x1f31f…