当前位置: 首页 > article >正文

使用SpringBoot-data-mongodb操作MongoDB

引入依赖

<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;

  @Autowired
  private 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() {
  @Override
  public long getAsLong() {
    return count;
  }
});

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


http://www.kler.cn/a/472667.html

相关文章:

  • 蓝桥杯训练
  • 【Linux 之 二十 】使用 ln 命令创建符号链接
  • Meilisearch ASP.Net Core API 功能demo
  • 用户界面软件02
  • C语言基本知识复习浓缩版:标识符、函数、进制、数据类型
  • 嵌入式技术之Linux(Ubuntu) 一
  • 总结2024,迎接2025
  • 一套极简易的直流无刷电机(Deng FOC)开发套件介绍
  • 企业开通部署 Azure OpenAI 流程:如何创建一个AI聊天机器人
  • 【深度学习基础】线性神经网络 | 线性回归的简洁实现
  • 单片机死机问题处理
  • (2023|NIPS,LLaVA-Med,生物医学 VLM,GPT-4 生成自指导指令跟随数据集,数据对齐,指令调优)
  • 简易CPU设计入门:算术逻辑单元(一)
  • 技术选型深度解析:Qt、PyQt与Vue在界面开发中的权衡与抉择
  • Linux 文件的特殊权限—ACL项目练习
  • 协方差矩阵
  • 网络设备安全
  • allure报告修改默认语言为中文
  • 爬虫学习记录
  • STM32-笔记38-I2C-oled实验
  • Improving Language Understanding by Generative Pre-Training GPT-1详细讲解
  • 10. C语言 函数详解
  • WPS-JS宏快速上手
  • Docker 容器自动化管理之脚本(Script for Docker Container Automation Management)
  • 【linux系统之redis6】redis的安装与初始化
  • 如何隐藏 Nginx 版本号 并自定义服务器信息,提升安全性