MongoDB学习笔记【part4】SpringBoot集成MongoDB、MongoTemplate开发CURD

news2024/12/26 0:27:32

一、Spring Boot 集成 Mongodb

spring-data-mongodb 提供了 MongoTemplateMongoRepository 两种方式访问mongodb,MongoRepository 操作简单,但 MongoTemplate 更加灵活,我们在项目中可以灵活使用这两种方式操作mongodb。

第一步,引入依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10.1</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>
第二步,配置 application.properties
spring.data.mongodb.uri=mongodb://192.168.3.100:27017/testdb
第三步,添加实体

添加 @Document 注解,可以把一个实体类映射成一个文档。

添加 @Id 注解,将该属性映射为 mongodb 的 _id 字段。

@Data
@Document("User")
public class User {

    @Id
    private String id;
    private String name;
    private Integer number;
    private String position;
    
}
第四步,启动容器和MongoDB客户端
  1. 若没有安装 mongodb 的镜像,则需要安装镜像,然后执行 docker run <容器名称> 创建一个 mongo 容器,带端口号和其他具体配置的创建请参考 MongoDB学习笔记【part1】概念与安装 。
  2. 若之前已经创建,则跳过上一步,直接执行 docker start <容器名称> 来启动之前停止运行的容器。
  3. 启动后执行 docker exec -it <数据库名称> /bin/bash 以守护模式进入容器终端。
  4. 接着执行 mongosh 进入 mongoDB 客户端。
第五步,添加测试类
@SpringBootTest
class MongodemoApplicationTests {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 1.添加
     */
    @Test
    public void createUser(){
        User user = new User();
        user.setName("parker");
        user.setNumber(7);
        user.setPosition("striker");
        User insert_user = mongoTemplate.insert(user);

        System.out.println(insert_user);
    }
    
}
第六步,测试成功

template会返回带 _id 的新实体:

User(id=63cba6483a54a937e410d3bd, name=parker, number=7, position=striker)
到 linux 上查看,插入成功。

在这里插入图片描述


二、MongoTemplate 的常用方法

方法说明
mongoTemplate.findAll(User.class);查询User文档的全部数据
mongoTemplate.findById(, User.class);查询User文档id为的数据
mongoTemplate.find(query, User.class);根据query内的查询条件查询
mongoTemplate.upsert(query, update, User.class);修改
mongoTemplate.remove(query, User.class);删除
mongoTemplate.insert(User);新增
Qurey 对象

基本使用方法:创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)。

方法说明
criteria.and(“key”).is(“条件”);精准条件
criteria.and(“key”).regex(“条件”);模糊条件
query.addCriteria(criteria);封装条件
Criteria gt = Criteria.where(“key”).gt(“条件”);大于(需创建新的criteria)
Criteria lt = Criteria.where(“key”).lt(“条件”);小于(需创建新的criteria)
query.addCriteria(new Criteria().andOperator(gt,lt));封装大于、小于条件
query.with(new Sort(Sort.Direction.ASC, “age”). and(new Sort(Sort.Direction.DESC, “date”)))排序

注:一个query中只能有一个 andOperator() ,若要传多个参数可以传入Criteria数组。


三、使用 MongoTemplate 进行CURD

1.插入一条数据
    /**
     * 1.添加
     */
    @Test
    public void createUser(){
        User user = new User();
        user.setName("parker");
        user.setNumber(7);
        user.setPosition("striker");
        User insert_user = mongoTemplate.insert(user);

        System.out.println(insert_user);
    }
    

template会返回带 _id 的新实体。

2.查询所有数据
    /**
     * 2.查询所有
     */
    @Test
    public void findAll(){
        List<User> list = mongoTemplate.findAll(User.class);
        System.out.println(list);
    }
3.通过 id 查询
    /**
     * 3.通过id查询
     */
    @Test
    public void findById(){
        User user = mongoTemplate.findById("63cba6483a54a937e410d3bd", User.class);
        System.out.println(user);
    }

成功打印数据库中数据 User(id=63cba6483a54a937e410d3bd, name=parker, number=7, position=striker) 。

4.条件查询
    /**
     * 4.条件查询
     */
    @Test
    public void findUserList(){
        // select * from User where name="parker" and number=7
        Query query = new Query(Criteria.where("name").is("parker").and("number").is(7));
        List<User> users = mongoTemplate.find(query, User.class);
        System.out.println(users);
    }
5.模糊查询
    /**
     * 5.模糊查询
     */
    @Test
    public void findUserList2(){
        // select * from User where name like "park"
        //模糊查询的条件
        String name = "par";
        //构建正则表达式
        String regex = String.format("%s%s%s","^.*",name,".*$");
        //创建模板,第一个参数为正则表达式对象,第二个参数表示大小写不敏感
        Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
        //查询
        Query query = new Query(Criteria.where("name").regex(pattern));
        List<User> users = mongoTemplate.find(query, User.class);
        System.out.println(users);
    }
6.分页查询
/**
 * 6.分页查询
 */
@Test
public void findUserPage() {

    //模拟分页参数构造
    int pageNo = 1;
    int pageSize = 5;
    //模拟条件构造
    String name = "";
    String regex = String.format("%s%s%s", "^.*", name, ".*$");
    Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
    Query query = new Query(Criteria.where("name").regex(pattern));
    //查询
    List<User> users = mongoTemplate.find(query.skip((pageNo-1)*pageSize).limit(pageSize),User.class);
    System.out.println(users);
}
7.修改
/**
 * 7.修改
 */
@Test
public void updateUser(){
    //根据id查询
    User user = mongoTemplate.findById("63cba6483a54a937e410d3bd", User.class);
    //模拟修改值
    user.setNumber(15);
    user.setPosition("midfield");
    //调用方法实现修改
    Query query = new Query(Criteria.where("_id").is(user.getId()));
    Update update = new Update();
    update.set("number",user.getNumber());
    update.set("position",user.getPosition());
    UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
    //返回的upsert对象可以通过getModifiedCount来查看影响的行数
    long count = upsert.getModifiedCount();
    System.out.println(count);
}

调用的 MongoTemplate 方法为 upsert ,不是 update ,无混淆!upsert 方法返回一个对象,可以通过该对象查看成功修改了多少行。

8.删除
/**
 * 8.删除
 */
@Test
public void deleteUser(){
    Query query = new Query(Criteria.where("_id").is("63cba6483a54a937e410d3bd"));
    DeleteResult deleteResult = mongoTemplate.remove(query, User.class);
    //返回的upsert对象可以通过getDeletedCount来查看影响行数
    long count = deleteResult.getDeletedCount();
    System.out.println(count);
}

remove 方法返回一个对象,可以通过该对象查看成功删除了多少行。

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

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

相关文章

铸造性能监控平台【grafana+influxdb/prometheus+Linux/Windows】

目录一、grafanainfluxdbjmeter1、前言2、安装grafana和influxdb3、启动grafana4、访问grafana5、启动influxdb6、配置influxdb和jmeter7、在grafana中显示数据8、其他模板二、grafanaprometheusexporter1、前言2、grafana启动3、exporter安装与运行4、prometheus安装与运行5、…

代码随想录算法训练营第23天 二叉树 java : 669. 修剪二叉搜索树108.将有序数组转换为二叉搜索树538.把二叉搜索树转换为累加树

文章目录LeetCode 669. 修剪二叉搜索树题目讲解思路LeetCode 108.将有序数组转换为二叉搜索树题目讲解思路LeetCode 538.把二叉搜索树转换为累加树题解思路总结LeetCode 669. 修剪二叉搜索树 题目讲解 思路 在1到3的区间选择 元素 如何超过3 或者 小于1 如果小于1 叫要考虑 …

NeRF: Representing Scenesas Neural Radiance Fieldsfor View Synthesis论文阅读

注意&#xff1a;和很多文章一样&#xff0c;在Google搜索到最终版本时&#xff0c;有链接指出其有7个历史版本&#xff0c;但内容较详细的却不是最终版本&#xff0c;而是ECCV (2020)版&#xff0c;阅读时可以两个版本配合着阅读。 1. 摘要 我们提出了一种方法&#xff0c;通…

202301读书笔记|《命运》蔡崇达

202301读书笔记|《命运》蔡崇达 《命运》是我读的蔡崇达的第二本书&#xff0c;第一本是《皮囊》印象最深的一句就是“肉体是拿来用来的&#xff0c;不是拿来伺候的。” 当时读完第一本就很受触动&#xff0c;这一次读完《命运》依然很触动我。作者真的很厉害&#xff0c;这个故…

SpringBoot看这一篇文章就够了

第一章 SpringBoot简介 第1节 SpringBoot是什么 1 21.SpringBoot是一个可以快速创建可运行的、独立的、生产级的基于Spring的应用程序 2.SpringBoot采用一种约定优于配置的设计理念,可以快速让用户创建出一个可运行的基于Spring的应用第2节 SpringBoot的优势 1 2 3 4 51.快速构…

nacos源码解析==SPI和spring.factories机制-服务注册-心跳发送-服务拉取-服务调用

Spring.Factories这种机制实际上是仿照java中的SPI扩展机制实现的 springboot核心基础之spring.factories机制 - 知乎 SpringBoot1IDEA编写一个自己的starter_一个java开发的博客-CSDN博客_idea创建spring starter spring-cloud-starter-alibaba-nacos-discovery 将要注册到…

know sth. new 大话C#的进阶必知点解析第1章 第5节 名贵中药材程序WPF显示图片报错,找不到资源? 什么原因

1 Ui布局代码&#xff1b; 布局方面&#xff0c;主要还是继承了原先的布局方式。包括图片的展示&#xff0c;也是用了最外层border边框的方式&#xff0c;边框加入背景颜色方式的图片展示&#xff1b; 去把目标图片进行显示出来&#xff0c;这个没有太多技术含量。 至于图片的…

Spring Boot操作数据库学习之整合Druid

文章目录一 Druid 简介二 配置数据源创建项目步骤及数据库内容三 整合操作3.1 添加Druid数据源依赖3.2 编写配置文件3.3 测试3.4 自定义绑定数据源设置3.5 导入Log4j的依赖&配置日志输出3.6 添加DruidDataSource组件3.7 测试3.8 配置 Druid 数据源监控3.9 配置过滤器一 Dru…

SAPIEN PowerShell Studio 介绍

PowerShell Studio是一款优秀的基于PowerShell研发的脚本编辑器&#xff0c;它拥有全新的代码分析、智能预选、xaml支持功能&#xff0c;能够给用户提供一套完整的软件开发环境&#xff0c;让用户能够更加轻松的工作&#xff0c;这样一来大家开发项目的效率就会大大提升。创建模…

Day866.binlogredoLog -MySQL实战

日志系统 Hi&#xff0c;我是阿昌&#xff0c;今天学习的是关于MySql的binlog&redoLog的内容。 一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块&#xff0c;最后到达存储引擎。 那么&#xff0c;一条更新语句的执行流程又是怎样的呢&#x…

人大金仓数据库的用户与角色

创建用户 create user 用户名 授予用户创建数据库权限 alter user 用户名 要给的权限 然后查看用户信息 \du 用户名 设置用户密码 没有口令不能登录 alter user 用户名 password ‘kingbase’; 修改用户的并发连接数 alter user 用户 connection limit 要设置的连接数; 修改…

as-if-serialhappens-before

一、as-if-serialas-if-serial语义的意思是&#xff1a;不管怎么重排序&#xff08;编译器和处理器为了提高并行度&#xff09;&#xff0c;&#xff08;单线程&#xff09;程序的执行结果不能被改变。编译器、runtime和处理器都必须遵守as-if-serial语义。 为了遵守as-if-seri…

java类成员/final/static都涉及到了2023025

类成员&#xff1a; 在Java类里只能包含成员变量、方法、构造器、初始化块、内部类&#xff08;包括接口、枚举&#xff09;这5种成员&#xff0c;目前已经介绍了前面4种&#xff0c;其中static可以修饰成员变量、方法、初始化块、内部类&#xff08;包括接口&#xff0c;枚举&…

显示器的相关知识

目录 显示器的作用 显示器的尺寸 人眼的可视角度 显示器的分辨率 显示器的刷新率 显示器的灰阶响应时间 显示器的色域 显示器的色深 显示器的色准 显示器的HDR参数 显示器的面板 画面撕裂 前言 导致画面撕裂的原因 防画面撕裂技术 视频的码率 显示器的作用 把…

Golang 多模块开发

Golang 多模块开发 今天学习下Golang中多模块的基础知识&#xff0c;学习多模块的运行原理&#xff0c;使用多模块的方式&#xff0c;可以让开发者的代码在其他多个模块中构建、运行。提高代码的复用&#xff0c;从而提高开发效率。 在今天的学习中&#xff0c;将在工作工作空…

bfs入门教程(广度优先搜索)(含图解)

源自《啊哈算法》 目录 bfs正文 题目 思路 完整代码1 完整代码2 再解炸弹人 题目 思路 完整代码1 完整代码2 总结 bfs正文 第四章--深度优先搜索中&#xff0c;我们用dfs找到了寻找小哈的最短路径 接下来&#xff0c;我们要用bfs&#xff08;Breadth First Sear…

Zookeeper的本地安装部署和分布式安装部署

文章目录一. 本地模式安装部署1&#xff09;安装前准备2&#xff09;配置修改3&#xff09;操作Zookeeper1.2 配置参数解读二. 分布式安装部署1&#xff09;集群规划2&#xff09;解压安装3&#xff09;配置服务器编号4&#xff09;配置zoo.cfg文件5&#xff09;集群操作客户端…

Leetcode.126 单词接龙 II

题目链接 Leetcode.126 单词接龙 II 题目描述 按字典 wordList完成从单词 beginWord到单词 endWord转化&#xff0c;一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> ... -> sk这样的单词序列&#xff0c;并满足&#xff1a; 每对相邻的单词之间…

《高效能团队模式》读书笔记2

如果我们将团队类型的数量缩减为四类基本团队拓扑&#xff0c;这个问题就迎刃而解了。 流动式团队 赋能团队 复杂子系统团队 平台团队只要使用得当&#xff0c;这四类团队拓扑能够满足构建和运行现代软件系统的需要。结合有效的软件边界&#xff08;第6章&#xff09;和团队交互…

Java注解,元注解,自定义注解的使用

Java注解&#xff0c;元注解&#xff0c;自定义注解的使用Java注解基本的注解1.Override2.Deprecated3.SuppressWarnings4.SafeVarargs5.FunctionalInterfaceJava提供的元注解1.Retention2.Target3.Documented4.Inherited自定义注解自定义注解的使用Java注解 从JDK5开始,Java增…