使用SpringBoot-data-mongodb操作MongoDB

embedded/2025/1/12 3:45:10/

引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

数据库配置

spring.data.mongodb.host=
# MongoDB 服务的端口号
spring.data.mongodb.port=27017
# 创建的数据库及用户名和密码
spring.data.mongodb.database=

增删改查:

增加数据:

import org.springframework.data.mongodb.core.MongoTemplate;@Autowiredprivate MongoTemplate mongoTemplate;public void test() {Song song = new Song();song.setSubjectId("s001");song.setLyrics("...");song.setName("成都");mongoTemplate.insert(song);}

对于有id属性的实体类用save添加数据

UserLog userLog = new UserLog(2, 2, "test1", "test1", "test1", new Date(), "test");
UserLog save = mongoTemplate.save(userLog);

用findAll查询所有数据

System.out.println("插入成功"+save);
List<UserLog> all = mongoTemplate.findAll(UserLog.class);
System.out.println("查询成功"+all);
UserLog byId = mongoTemplate.findById(1, UserLog.class);
System.out.println(byId);

用findById查询单条数据

修改数据

// 修改 id=1 的数据
Query query = new Query(Criteria.where("id").is(userLog.getId()));
System.out.println(query);
Update update = new Update();
update.set("oldValue", userLog.getOldValue());
// 执行修改,修改返回结果的是一个对象
UpdateResult result = mongoTemplate.updateFirst(query, update, UserLog.class);
// 修改的记录数大于 0 ,表示修改成功
System.out.println("修改的数据记录数量:" + result.getModifiedCount());
UserLog byId = mongoTemplate.findById(2, UserLog.class);
System.out.println(byId);

删除数据

DeleteResult result = mongoTemplate.remove(userLog);
// 删除的记录数大于 0 ,表示删除成功System.out.println("删除的数据记录数量:" + result.getDeletedCount());}

根据多条件查询SpringDataQuery

List<Song> songs = mongoTemplate.find(query, Song.class);

因为可能查看到多条数据,所以返回的结果就是对象的集合,第一个参数是查询对象Query实例,第二个参数是查询什么对象.class

先构建Query实例

Query query = new Query(criteria);

构建情况(两种):

  • Criteria criteria1 = Criteria.where("条件字段名").is("条件值")
  • 组合条件:
Criteria criteria = new Criteria();
criteria.orOperator(criteria1, criteria2);
Criteria criteria = new Criteria();
criteria.andOperator(criteria1, criteria2);

多重条件混合

import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Criteria;public List<Song> list(Song songParam) {// 总条件Criteria criteria = new Criteria();// 可能有多个子条件List<Criteria> subCris = new ArrayList();if (StringUtils.hasText(songParam.getName())) {subCris.add(Criteria.where("name").is(songParam.getName()));}if (StringUtils.hasText(songParam.getLyrics())) {subCris.add(Criteria.where("lyrics").is(songParam.getLyrics()));}if (StringUtils.hasText(songParam.getSubjectId())) {subCris.add(Criteria.where("subjectId").is(songParam.getSubjectId()));}// 必须至少有一个查询条件if (subCris.isEmpty()) {LOG.error("input song query param is not correct.");return null;}// 三个子条件以 and 关键词连接成总条件对象,相当于 name='' and lyrics='' and subjectId=''criteria.andOperator(subCris.toArray(new Criteria[]{}));// 条件对象构建查询对象Query query = new Query(criteria);// 仅演示:由于很多同学都在运行演示程序,所以需要限定输出,以免查询数据量太大query.limit(10);List<Song> songs = mongoTemplate.find(query, Song.class);return songs;
}

SpringData分页

查询支持分页比较简单只要调用PageRequest.of();

第一个参数是页码,从0开始,第二个是每页的数量

import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;Pageable pageable = PageRequest.of(0 , 20);
query.with(pageable);

对于分页来说,除了要查询结果意外,还需要查询总数,才能进一步计算出总共多少页,实现完整的分页功能,因此还需要两个步骤:

1.调用count(query,xx.class)查询总数

2.根据结果,分页条件,总数三个数据,构建分页器对象

import org.springframework.data.domain.Page;
import org.springframework.data.repository.support.PageableExecutionUtils;// 总数
long count = mongoTemplate.count(query, Song.class);
// 构建分页器
Page<Song> pageResult = PageableExecutionUtils.getPage(songs, pageable, new LongSupplier() {@Overridepublic long getAsLong() {return count;}
});

PageableExecutionUtils.getPage() 方法第一个参数是查询结果;第二个参数是分页条件对象;第三个参数稍微复杂一点,实现一个 LongSupplier 接口的匿名类,在匿名类的 getAsLong() 方法中返回结果总数。方法返回值是一个 Page分页器对象,使用起来比较方便


http://www.ppmy.cn/embedded/153193.html

相关文章

高级软件工程-复习

高级软件工程复习 坐标国科大&#xff0c;下面是老师说的考试重点。 Ruby编程语言的一些特征需要了解要能读得懂Ruby程序Git的基本命令操作知道Rails的MVC工作机理需要清楚&#xff0c;Model, Controller, View各司什么职责明白BDD的User Story需要会写&#xff0c;SMART要求能…

HTML和CSS相关详解,如何使网页为响应式?

要使网页响应式&#xff0c;首先需要了解响应式设计的基本理念&#xff1a;它使得网页能够根据不同的屏幕尺寸和设备类型自适应调整布局和内容展示&#xff0c;提升用户体验。响应式设计通常使用以下几个技术要点&#xff1a; 媒体查询 (Media Queries)&#xff1a;用来根据不…

人工智能学习路线全链路解析

一、基础准备阶段&#xff08;预计 2-3 个月&#xff09; &#xff08;一&#xff09;数学知识巩固与深化 线性代数&#xff08;约 1 个月&#xff09;&#xff1a; 矩阵基础&#xff1a;回顾矩阵的定义、表示方法、矩阵的基本运算&#xff08;加法、减法、乘法&#xff09;&…

嵌入式岗位面试八股文(篇四 网络编程)

wx&#xff1a;嵌入式工程师成长日记 1.socket网络编程中客户端和服务端用到哪些函数 1&#xff09;服务器端函数&#xff1a; &#xff08;1&#xff09;socket创建一个套接字 &#xff08;2&#xff09;bind绑定ip和port &#xff08;3&#xff09;listen使套接字变为可以…

深入讲解 Docker 及实践

Docker 是现代化应用开发、测试和生产环境部署中不可或缺的工具。它能够为开发人员提供与生产环境一致的开发环境&#xff0c;同时支持高效的容器化部署、资源隔离、容器编排等高级功能。尤其在微服务架构和云原生应用中&#xff0c;Docker 更是提供了简化的流程和高效的可扩展…

ORB-SALM3配置流程及问题记录

目录 前言 一、OPB-SLAM3基本配置流程 1.下载编译Pangolin 二、ORB-SLAM3配置 1.下载源码 2.创建ROS工作空间并编译ORB-SLAM3-ROS源码 3.尝试编译 三、运行测试 一、OPB-SLAM3基本配置流程 ORB-SLAM3是一个支持视觉、视觉加惯导、混合地图的SLAM&#xff08;Simultane…

istoreos安装tailscale命令

通用Linux安装命令 curl -fsSL https://tailscale.com/install.sh | sh使用官方软件源安装 opkg update opkg install curl curl -fsSL https://pkgs.tailscale.com/stable/iStoreOS/$(opkg print-architecture).no_armor.gpg | sudo tee /usr/share/keyrings/tailscale-arch…

备考蓝桥杯:顺序表详解(静态顺序表,vector用法)

目录 1.顺序表的概念 2.静态顺序表的实现 总代码 3.stl库动态顺序表vector 测试代码 1.顺序表的概念 要理解顺序表&#xff0c;我们要先了解一下什么是线性表 线性表是n个具有相同特征的数据元素的序列 这就是一个线性表 a1是表头 a4是表尾 a2是a3的前驱 a3是a2的后继 空…