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

news2024/11/18 6:28:06

接下来介绍一下 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/11571.html

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

相关文章

Aspose.OMR for .NET 22.11.X Crack

Aspose.OMR for .NET 是一个可靠且通用的编程 API&#xff0c;用于设计和自动识别手填答题卡、调查、测试、选票、SAT 考试表格、保险索赔以及受访者通过随机抽取答案来回答问题的类似文件在圆形或正方形中标记。从成百上千个表单中手动读取和汇总结果的漫长且容易出错的过程归…

深入学习函数(2)

目录 一、函数的嵌套调用和链式访问 1、嵌套调用 2、链式访问 二、函数的声明和定义 1、函数的声明 2、函数的定义 声明和定义的拓展 拆成三个文件的好处 一、函数的嵌套调用和链式访问 当代码写的越来越多时&#xff0c;就会发现&#xff0c;其实一个程序都…

Day802.JVM热点问题 -Java 性能调优实战

JVM部分热点问题 Hi&#xff0c;我是阿昌&#xff0c;今天学习JVM部分热点问题的内容。 1、字符串常量不是在java8中已经被放入到堆中了吗&#xff0c;应该不在方法区中了&#xff0c;咋一些图中还在方法区中&#xff1f; JVM 的内存模型只是一个规范&#xff0c;方法区也是…

Fiddler基础使用

目录预备知识关于web的一些基础知识实验目的实验环境实验步骤一实验步骤二实验步骤三预备知识 关于web的一些基础知识 要分析Fiddler抓取的数据包&#xff0c;我们首先要熟悉HTTP协议。HTTP即超文本传输协议&#xff0c;是一个基于请求/响应模式的、无状态的、应用层的协议&a…

【Python开发】Flask项目的组织架构

Flask项目的组织架构在大型Flask项目中&#xff0c;主要有三种常见的项目组织架构&#xff1a;功能式架构&#xff08;也就是 Bluelog 程序使用的架构&#xff09;、分区式架构和混合式架构。我们将以一个示例程序 myapp 作为示例来介绍这三种架构的特点和区别&#xff0c;这个…

教你用HTML+CSS实现百叶窗动画效果

推荐学习专栏&#xff1a; 【JavaWeb】Web前端JavaWeb学习专栏 文章目录前言1、百叶窗效果2、原理讲解3、制作百叶窗4、资源下载5、完整代码总结前言 我们浏览网页的时候总能看见一些炫酷的特效&#xff0c;比如百叶窗效果&#xff0c;本文我们就用HTMLCSS制作一个百叶窗小项…

副业该怎么选择,适合新手的四个副业项目,零基础也可操作的兼职

副业有可能有时挣得并不多&#xff0c;但它是一个改变未来的好机会。假如玩的开了&#xff0c;盈利并不比你工资少。95%的人自主创业也是从第二职业做起&#xff0c;做着干着就全职的了。 四个全员第二职业&#xff0c;新手如何做到单月9000&#xff0c;深入分析看下文&#xf…

license授权服务器

项目介绍 为软件提供授权制的使用方式&#xff0c;license申请端可以为产品生成license授权文件&#xff0c;集成了flowable工作流&#xff0c;经审批后生成license文件。 然后导入到服务端。客户端与服务端netty通信。实时判断license是否合法&#xff0c;从而使软件得到安全…

辣椒辣素修饰卵清蛋白 Capsaicin-ova,苍耳亭偶联鸡卵白蛋白 Xanthatin-ovalbumin

产品名称&#xff1a;辣椒辣素修饰卵清蛋白 英文名称&#xff1a; Capsaicin-ova 用途&#xff1a;科研 状态&#xff1a;固体/粉末/溶液 产品规格&#xff1a;1g/5g/10g 保存&#xff1a;冷藏 储藏条件&#xff1a;-20℃ 储存时间&#xff1a;1年 辣椒碱又称辣椒辣素&#xf…

抓包工具总结对照【fiddler F12 Charles wireshark】

本文主要对比fiddler Charles wireshark&#xff0c;纯手敲制作&#xff0c;动动小手点赞 文章目录抓包fidderF12开发者工具wiresharkCharles下载安装使用web抓包APP 抓包IOSAndroidCharles过滤弱网测试篡改数据修改请求数据重复发送请求Compose编辑接口服务器压力测试本地映射…

前端:Node.js遇到的错误整理

node.js当前错误汇总&#xff1a;错误1npm WARN config global --global, --local are deprecated. Use --locationglobal instead.原因&#xff1a;初步判断是node.js版本问题解决方法&#xff1a;错误2npm WARN logfile could not create logs-dir: Error: EPERM: operation …

MySQL主从复制最全教程(CentOS7 yum)

一、MySQL主从复制介绍 &#xff08;1&#xff09;MySQL数据库默认是支持主从复制的&#xff0c;不需要借助于其他的技术&#xff0c;我们只需要在数据库中简单的配置即可。 &#xff08;2&#xff09;MySQL主从复制是一个异步的复制过程&#xff0c;底层是基于Mysql数据库自…

在Docker里安装FastDFS分布式文件系统详细步骤

安装需要的软件包 yum install -y yum-utils 设置yum源 yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo 安装docker yum install -y docker-ce 查看docker版本验证安装是否成功 docker -v 启动docker systemctl start d…

C++ 实用指南

C 发展得非常快&#xff01;例如&#xff0c;C 标准的页数从 C98/03 的 879 页增加到了 C20 的 1834 页&#xff0c;多了近 1000 页&#xff01;更重要的是&#xff0c;C 每次修订后&#xff0c;我们都会获得几十个新特性。你需要学习所有这些东西才能写出好代码吗&#xff1f;…

【计算机毕业设计】旅游网站ssm源码

下载链接:https://download.csdn.net/download/licongzhuo/87051535https://download.csdn.net/download/licongzhuo/87051535 一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 随着人民生活水平的提高,旅游业已经越来越大众化,而旅游业的核心是信息,不论是…

Redis数据结构之——跳表skiplist

写在前面 以下内容是基于Redis 6.2.6 版本整理总结 一、跳表&#xff08;skiplist&#xff09; 如何理解跳表&#xff1f;在了解跳表之前&#xff0c;我们先从普通链表开始&#xff0c;一点点揭开跳表的神秘面纱~ 首先&#xff0c;普通单链表来说&#xff0c;即使链表是有序…

第2-3-4章 上传附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss

文章目录5.3 接口开发-上传附件5.3.1 接口文档5.3.2 代码实现5.3.3 接口测试5.3 接口开发-上传附件 第2-1-2章 传统方式安装FastDFS-附FastDFS常用命令 第2-1-3章 docker-compose安装FastDFS,实现文件存储服务 第2-1-5章 docker安装MinIO实现文件存储服务-springboot整合minio…

MindMaster思维导图及亿图图示会员 超值获取途径

MindMaster思维导图及亿图图示会员 超值获取途径 会员九折优惠方法分享给大家&#xff01;如果有需要&#xff0c;可以上~ 以下是食用方法&#xff1a; MindMaster 截图 亿图图示 截图 如果需要MindMaster思维导图或者亿图图示会员&#xff0c;可按照如下操作领取超值折扣优惠…

SaaS系统平台赋能大健康产业互联网变革,助力企业提升市场占有率

当前&#xff0c;数字化浪潮正在重塑大健康产业。随着全国多个重要省市的数字医疗、数字医保等措施正火热展开&#xff0c;我国大健康产业的数字化转型进程正在提速&#xff0c;这也为新一轮的行业洗牌带来新的发展机遇。 大健康产业数字化转型痛点&#xff1a;传统医疗信息化…

消息队列之kafka

1.先部署zookeeper集群 2.了解zookeeper 分布式服务系统框架&#xff1a;存储业务服务节点的元数据及状态信息并 负责通知zookeeper上注册服务节点给客户端 一、Zookeeper 概述 官方下载地址&#xff1a;archive.apache.org/dist/zookee… 1.1 Zookeeper 定义 Zookeeper…