【Java开发】 Spring 03:云服务器 Docker 环境下安装 MongoDB 并连接 Spring 项目实现简单 CRUD

news2024/11/16 13:35:46

接下来介绍一下 NoSQL ,相比于 Mysql 等关系型的数据库,NoSQL (文档型数据库)由于存储的数据之间无关系,因此具备大数据量,高性能等特点,用于解决大规模数据集合多重数据种类带来的挑战,而 MongoDB 正是其中的代表,下一篇文章会介绍同类型的 Redis。

目录

1 Docker 环境下安装 MongoDB

1.1 腾讯云服务器系统选择

1.2 通过 Docker 启动 MongoDB

①获取镜像

②创建容器

③安全组

④测试连接

2 SpringBoot 连接 MongoDB 及实现简单操作

2.1 环境搭建

①创建项目

②添加配置(二选一)

③添加实体类

2.2 基于 MongoTemplate 实现 CRUD

① MongoTemplate 常用操作

② Query对象

③ MongoTemplate 测试

2.3 基于 MongoRepository 实现 CRUD

① 添加Repository类

② MongoRepository 测试


1 Docker 环境下安装 MongoDB

1.1 腾讯云服务器系统选择

趁着学生优惠购进了腾讯云轻量服务器,然后就倒腾各种服务器的配置了,为了简化搭建时的工作,直接上 Docker 容器,初次选择系统和重装系统都可以选择 Docker 镜像:

1.2 通过 Docker 启动 MongoDB

①获取镜像

docker pull mongo

输出下载 mongo 的信息👇

②创建容器

docker run --name mongo -p 27017:27017 -v ~/docker-data/mongo:/data/db -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=root -d mongo

反馈信息👇

③安全组

④测试连接

使用 navicat 测试连接是否成功👇,这就大功告成了,Windows的话过程类似(前提是有Docker环境)~

 然后在 navicat 新建数据库👇

2 SpringBoot 连接 MongoDB 及实现简单操作

2.1 环境搭建

①创建项目

通过编译器 IDEA 实现:

ⅠNew Project

 Ⅱ 添加 MongoDB 依赖

也可在之前的项目的 pom.xml 文件中直接添加,Spring 是对 MongoDB 做了进一步封装,放在Spring Data。

②添加配置(二选一)

Ⅰ配置properties

若 Spring Boot 版本合适,那么配置完 properties 后,就可以实现自动注入了

路径:application.properties

#springboot MongoDB配置
spring.data.mongodb.username=root
spring.data.mongodb.password=root
spring.data.mongodb.authentication-database=root
spring.data.mongodb.database=test
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.auto-index-creation=true

Ⅱ 配置properties

不过很可惜,由于我的 Spring Boot 版本过高-2.7.5,不支持自动注入MongoTemplate,因此需要手动创建 MongoDB 配置类👇

路径:src/main/java/com/yinyu/mongodemo/config/MongoDBConfig.java

@Configuration
public class MongoDBConfig{
    
    @Bean
    public MongoClient mongoClient() {
        return MongoClients.create("mongodb://账号:密码@127.0.0.1:27017/");
    }
    @Bean
    public MongoTemplate mongoTemplate() {
        return new MongoTemplate(mongoClient(),"数据库");
    }

}

③添加实体类

路径:src/main/java/com/yinyu/mongodemo/mongopojo/User.java

@Builder
@Data
@Document("User")
@AllArgsConstructor
@NoArgsConstructor
public class User {

    @Id
    private String id;
    @Indexed
    private String name;
    private Integer age;
    private String email;
    private String createDate;

}

2.2 基于 MongoTemplate 实现 CRUD

① MongoTemplate 常用操作

  • 新增
mongoTemplate.insert(User)
  • 根据query内的查询条件删除
mongoTemplate.remove(query, User.class)
  • 如果数据存在就更新,否则插入新的数据
mongoTemplate.upsert(query, update, User.class)
  • 查询User文档的全部数据
mongoTemplate.findAll(User.class)
  • 根据 id 查询User文档的数据
mongoTemplate.findById(<id>, User.class)
  • 根据query内的查询条件查询
mongoTemplate.find(query, User.class)

② Query对象

  • 形式如下👇(query 对象用来封装所有条件对象,criteria对象用来构建条件)
Query query = new Query(Criteria.where("name").is("yinyu").and("age").is(18));

Ⅰ精准条件:Criteria.and(“key”).is(“条件”)

Ⅱ 模糊条件:Criteria.and(“key”).regex(“条件”)

Ⅲ 大于:Criteria.where(“key”).gt(“条件”)

Ⅳ 小于:Criteria.where(“key”).lt(“条件”)

Ⅵ 排序:query.with(new Sort(Sort.Direction.ASC, "age"). and(new Sort(Sort.Direction.DESC, "date")))

Ⅶ 添加封装条件:一个query中只能有一个andOperator(),其中 criteria 可为多个

query.addCriteria(new Criteria().andOperator(Criteria.where("name").is("yinyu")));​​​​​​​

③ MongoTemplate 测试

首先注入 MongoTemplate 👇

 @Autowired
 private MongoTemplate mongoTemplate;

Ⅰinsert 新增

@Test
public void createUser() {
    User user = User.builder()
            .age(18)
            .name("yinyu")
            .email("yinyu@163.com")
            .createDate(new Date().toString()).build();
    User user1 = mongoTemplate.insert(user);
    System.out.println(user1);
}

可以看到数据插入成功,id 自动生成 👇 ,属于 User 类!

Ⅱ findAll 查询所有

@Test
public void findAllUser() {
    List<User> userList  = mongoTemplate.findAll(User.class);
    userList.forEach(System.out::println);
}

查询成功👇

 Ⅲ findById 根据 Id 查询

@Test
public void findByIdUser() {
    User user  = mongoTemplate.findById("6374e0b28c8fca48987da076",User.class);
    System.out.println(user);
}

 Ⅳ find 根据query内的查询条件

查询 name 包含 yin 、 age 大于 18 的记录:

@Test
public void findUser1() {
    Query query = new Query(Criteria
            .where("name").regex("yin")
            .and("age").gt(18));
    List<User> userList = mongoTemplate.find(query, User.class);
    System.out.println(userList);
}

添加封装条件

查询 name = yinyu 、 age = 18 的记录,可能这样会好理解一些

@Test
public void findUser2() {
    Query query = new Query();
    query.addCriteria(new Criteria().andOperator(Criteria.where("name").is("yinyu"),Criteria.where("age").is(18)));
    List<User> userList = mongoTemplate.find(query, User.class);
    System.out.println(userList);
}


@Test
public void findUser3() {
    Criteria criteria = new Criteria();
    criteria.andOperator(Criteria.where("name").is("yinyu"),Criteria.where("age").is(18));
    List<User> userList = mongoTemplate.find(new Query(criteria), User.class);
    System.out.println(userList);
}

查询成功:👇 

2.3 基于 MongoRepository 实现 CRUD

Spring Data 提供了对 mongodb 数据访问的支持,我们只需要继承 MongoRepository 类,按照 Spring Data 规范就可以了。

① 添加Repository类

路径:src/main/java/com/yinyu/mongodemo/repository/UserRepository.java

@Repository
public interface UserRepository extends MongoRepository<User,String> {


}

② MongoRepository 测试

首先注入 MongoRepository 👇

@Autowired
private UserRepository userRepository;

Ⅰsave 新增

@Test
public void saveTest(){
    User user = User.builder()
            .age(12)
            .name("yinyinyu")
            .email("yinyu@163.com")
            .createDate(new Date().toString()).build();
    User user1 = userRepository.save(user);
    System.out.println(user1);
}

新增成功👇

 Ⅱ findAll 查询所有

和 MongoTemplate 不一样是,MongoRepository 的 findAll  不需要入参,因为在 Repository 类已经指定 User 类

@Test
public void findAllTest() {
    List<User> userList = userRepository.findAll();
    userList.forEach(System.out::println);
}

查询成功👇

Ⅲ findById 根据 id 查询

注:结尾需要加 .get 才能获得获得数据,同时也可加 isPresent 用于判断该数据是否存在

@Test
public void getByIdTest1() {
    //获取数据
    User user = userRepository.findById("6374e0b28c8fca48987da076").get();
    System.out.println(user);
}

@Test
public void getByIdTest2() {
    //判断该数据是否存在
    Boolean b = userRepository.findById("6374e0b28c8fca48987da076").isPresent();
    System.out.println(b);
}

Ⅳ findAll 根据Example<User>查询

@Test
public void findExampleTest1() {
    User user = User.builder().name("yinyu").age(18).build();
    Example<User> userExample = Example.of(user);
    List<User> userList = userRepository.findAll(userExample);
    userList.forEach(System.out::println);
}

Ⅴ findAll 添加匹配器-matcher 模糊查询​​​​​​​

@Test
public void findExampleTest2() {
    User user = User.builder().name("yinyu").age(18).build();
    //创建匹配器,即如何使用查询条件
    ExampleMatcher matcher = ExampleMatcher.matching()
            .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
            .withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
    Example<User> userExample = Example.of(user,matcher);
    List<User> userList = userRepository.findAll(userExample);
    System.out.println(userList);
}


参考文章

SpringBoot 2.5 整合MongoDB踩坑记录及解决方法_HellHellNo的博客-CSDN博客

SpringBoot整合MongoDB及简单的操作_活跃的咸鱼的博客-CSDN博客_springboot+mongodb项目创建

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

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

相关文章

点击化学试剂1609736-43-7,TCO-NH2 hydrochloride,反式环辛烯-氨基HCL盐

TCO-amine hydrochloride物理数据&#xff1a; CAS&#xff1a;1609736-43-7| 中文名&#xff1a; 反式环辛烯-氨基盐酸盐&#xff0c;反式环辛烯-氨基HCL盐 | 英文名&#xff1a;TCO-amine hydrochloride 结构式&#xff1a; 中文别名&#xff1a; 环辛-4-烯-1-基 (3-氨基丙…

Mvvm中的Lifecycle

lifecycle&#xff1a;一个持有activity/fragment生命周期信息的类&#xff0c;允许其他对象观察此对状态 Event:从框架和lifecycle类派发的生命周期事件&#xff0c;也就是activity和fragment的各个状态会发Event state:这个就好理解了&#xff0c;就是activity和fragment当…

工业互联与MQTT

、工业互联网 新一代信息通信技术与工业经济深度融合的新型基础设施、应用模式和工业生态&#xff0c;通过对人、机、物、系统等的全面连接&#xff0c;构建起覆盖全产业链、全价值链的全新制造和服务体系&#xff0c;为工业乃至产业数字化、网络化、智能化发展提供了实现途径&…

论文阅读-Dr.Deep_基于医疗特征上下文学习的患者健康状态可解释评估

论文地址&#xff1a;Dr.Deep&#xff1a;基于医疗特征上下文学习的患者健康状态可解释评估 (ict.ac.cn) 代码地址&#xff1a;GitHub - Accountable-Machine-Intelligence/Dr.Deep 简介&#xff1a; 深度学习是当前医疗多变量时序数据分析的主流方法。临床辅助决策关乎病人生…

深入浅出Nodejs中的大文件读写

笔者最近在做一些node端的文件读写和分片上传工作&#xff0c;在这个过程中&#xff0c;发现node读取的文件如果超过2G&#xff0c;超过了读取Blob最大值&#xff0c;会出现读取异常&#xff0c;此外在node中读写文件也受服务器RAM的限制等&#xff0c;需要分片读取&#xff0c…

2022年认证杯SPSSPRO杯数学建模A题(第二阶段)人员的紧急疏散求解全过程文档及程序

2022年认证杯SPSSPRO杯数学建模 A题 人员的紧急疏散求解 原题再现&#xff1a; 在过去的几十年里&#xff0c;由于大规模集会活动的数量和规模的增加&#xff0c;紧急疏散的问题变得越来越重要。通过有限宽度的门或狭窄通道进行疏散是最值得关注的情况之一。为了更好地理解各…

.Net Maui 开发之路(1): APP基本设置(图标、应用名称)

.Net Maui APP基本设置(图标、应用名称) 前言一、App显示名称设置二、App显示图标设置三、App加载动画设置四、App透明状态栏设置总结前言 最终实现的显示效果如下图 提示:以下是本篇文章正文内容,下面案例可供参考 一、App显示名称设置 1、在项目上右键,选择编辑项目文…

02 DevOps 之 Jenkins

1. 什么是CICD 推荐阅读&#xff1a;CICD原理及流程 CICD面试题 在要介绍jenkins之前&#xff0c;我们需要了解CICD是什么&#xff1f; Continuous Integration (CI) 持续集成 Continuous Delivery (CD) 持续交付 Continuous Deployment (CD) 持续部署 1.1 持续集成 持续集成…

Echarts折线图隐藏markPoint只显示最大值和最小值的文本,且只在该两点显示symbol

算是一个比较偏门的需求吧&#xff0c;具体UED给的设计图效果如下&#xff1a; 看起来非常简单&#xff0c;但实际实现起来……也确实简单&#xff0c;就是步骤多一点~ 我们知道Echarts提供的markPoint标注最大值和最小值是会有一个水滴图案的&#xff1a; 首先要做的就是隐藏这…

进程状态和优先级【Linux】

1.进程状态的分类 在Linux内核中&#xff0c;进程状态分为七大类&#xff0c;不同的状态有不同的含义。 下面的状态在kernel中定义&#xff1a; /* * The task state array is a strange "bitmap" of * reasons to sleep. Thus "running" is zero, and *…

深度学习笔记--Transformer中position encoding的源码理解与实现

1--源码 import torch import math import numpy as np import torch.nn as nnclass Pos_Embed(nn.Module):def __init__(self, channels, num_frames, num_joints):super().__init__()# 根据帧序和节点序生成位置向量pos_list [] for tk in range(num_frames):for st in ran…

感知机的认识和简单的实现

一、感知机perceptron 1.1 感知机的信号 只有0和1两种取值 1.2 神经元会计算传递过来的信号总和 只有当信号总和超过某个界限的时候&#xff0c;神经元才会被激活 1.3 信号权重 不同的权重对应的信号的重要性越高 二、常见的逻辑电路 与门与非门或门 2.1 思考 使用感…

@Scope与@RefreshScope注解

在SpringIOC中&#xff0c;我们熟知的BeanScope有单例&#xff08;singleton&#xff09;、原型&#xff08;prototype&#xff09;&#xff0c; Bean的Scope影响了Bean的管理方式&#xff0c;例如创建Scopesingleton的Bean时&#xff0c;IOC会保存实例在一个Map中&#xff0c;…

nest.js创建以及error相关问题

开始之前&#xff0c;你可以使用 Nest CLI 创建项目&#xff0c;也可以克隆一个 starter project&#xff08;两者的结果是一样的&#xff09;。 若要使用 Nest CLI 构建项目&#xff0c;请运行以下命令。这将创建一个新的项目目录&#xff0c;并使用核心的 Nest 文件和支撑模…

我把 CPU 三级缓存的秘密,藏在这 8 张图里

本文已收录到 GitHub AndroidFamily&#xff0c;有 Android 进阶知识体系&#xff0c;欢迎 Star。技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 进 Android 面试交流群。 前言 大家好&#xff0c;我是小彭。 在上一篇文章里&#xff0c;我们聊到了计算机存储器系统的金…

盘点机PDA搭配蓝牙便携打印机,条码标签打印,超市仓库条码管理,条码标签纸

null使用盘点机PDA&#xff0c;搭配蓝牙便携打印机&#xff0c;移动打印条码标签的操作和设置。对于商品本身没有条码的商品&#xff0c;比如&#xff1a;外购回来无条码的商品&#xff0c;工厂自己生产出来的成品&#xff0c;那么这种就需要打印商品条码进行粘贴&#xff0c;即…

Spring Security认证之登录表单配置

本文内容来自王松老师的《深入浅出Spring Security》&#xff0c;自己在学习的时候为了加深理解顺手抄录的&#xff0c;有时候还会写一些自己的想法。 自定义登录页面 文接上篇&#xff0c;这一篇学习如何自定义登录表单。我们创建一个Spring Boot项目之后&#xff0c;还是一样…

windows docker 及 k8s 环境搭建

docker 环境搭建 下载 docker 下载 docker for desktop&#xff0c; , 配置 镜像源 开通 kubenates 功能 注册一个 docker hub 账号 记住账号密码&#xff0c; 将来拉取镜像要用到&#xff0c; 在 docker for desktop 中登录该账号 kubenates 环境搭建 docker 中开通 k8…

nginx服务器

一、介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一个公开版本0.1.0发布于2…

用户管理系统(2)

2.实现添加功能:有两个和后端交互的接口 根据用户的身份显示登陆界面: 进行插入操作: 1)在我们的前端直接获取到用户名&#xff0c;密码&#xff0c;确认密码&#xff0c;年龄&#xff0c;QQ&#xff0c;邮箱&#xff0c;判断他们是否为空&#xff0c;检测密码和确认密码是否一…