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

IDEA操作MongoDB快速上手开发

写在前面:最近在公司实习,需要完成一个实习任务。这个任务用的是SSH框架,数据库需要使用mongoDB完成。由于刚接触MongoDB,所以不是很熟练,在网上查找了大量的资料,许多都是抄来抄去的,运行一堆错误。如今,我的工作任务已经完成,现在写下此篇,希望后来的打工人少一点痛苦!

首先,我有一定的数据库基础,但对于mongo还是一无所知的小白。所以有以下疑问:

1. 数据库怎么连接?(工具类封装)

2. 数据库连接后怎么进行CRUD?(API调用肯定和命令行有区别)

3. java实体类怎么才能入mongo的库?(很重要)

4. mongo查寻出来的数据,怎么映射到实体类中,转换成Java的数据结构?(很重要)

1. 数据库的连接

首先我是win10 系统,用的最新版的mongo数据库,这里就不介绍怎么安装mongo了。其次是,我这是纯净的maven项目,没有用springboot之类的,所以就从最原生的来。

(1)导入maven坐标

        <!--MongoDB--><dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-sync</artifactId><version>4.4.1</version></dependency>

注意:我在查阅资料的时候发现,mongo3.0+的创建数据库连接方式和mongo4.0+有区别。这里只说4.0+的。

(2)创建工具类

import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import org.bson.codecs.configuration.CodecRegistries;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.codecs.pojo.PojoCodecProvider;public class MongoDBUtil {private static final String CONNECTION_STRING = "mongodb://localhost:27017";private static final String DATABASE_NAME = "weeklyTask";//不通过认证获取连接数据库对象public static MongoDatabase getConnect(){//连接到 mongodb 服务MongoClient mongoClient = MongoClients.create(CONNECTION_STRING);;//连接到数据库//返回连接数据库对象return mongoClient.getDatabase(DATABASE_NAME);}//处理pojo和Bson之间的编码问题public static CodecRegistry getCodecRegistry(){//进行编码处理return CodecRegistries.fromRegistries(MongoClientSettings.getDefaultCodecRegistry(),CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build()));}
}

注意:这个工具类里面使用的本地无认证模式的。因为我没有设置mongo的密码。

2. CRUD操作

这里的CRUD操作,我就和上述中的2,3,4问题一起说了。直接上案例:

Pojo实体类创建

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private String uid;private String name;private String number;private String password;private int role;
}
获取集合对象
        // 获取集合对象
MongoCollection<User> collection =  MongoDBUtil.getConnect().getCollection("user", User.class).withCodecRegistry(MongoDBUtil.getCodecRegistry());

PS:其实这一步就是做Java实体类和mongo文档数据映射的!因为 MongoCollection<Document>,泛型默认是Document的。这里我们直接指定是User的,然后使用了编码转换withCodecRegistry(MongoDBUtil.getCodecRegistry())。这样就可以实现互转了。后面通过collection调用的方法中的Document都可以具体的写成User了。

新增操作

(1)单个新增:

collection.insertOne(new User("1","ceshi","ceshi","123456",0));
collection.insertOne(new User("2","zhuguan","zhuguan","123456",1));

(2)批量新增:

        List<User> userList = Arrays.asList(new User("1","ceshi","ceshi","123456",0),new User("2","zhuguan","zhuguan","123456",1));collection.insertMany(userList);

PS:我们完成上述操作后,执行新增操作,不用关注mongoDB中是否存在这个集合(表),他会自己去创建这个表的,并且将结构和数据映射上去。

修改操作

(1)修改单个数据

Bson filter = Filters.eq("uid", "1");
Bson update = Updates.set("name", "ceshi");
collection.updateOne(filter, update);

(2)修改多个数据

        Bson filter = Filters.eq("uid", "1");Bson update = Updates.combine(Updates.set("name", "Test"),Updates.set("password", "ceshi"));collection.updateOne(filter, update);

(3)批量修改

Bson filter = Filters.eq("password", "123456");
Bson update = Updates.set("password", "147258");
UpdateResult result = collection.updateMany(filter, update);

(4)整行修改

场景:有时候前台直接传过来的是一个对象,你不能确定它具体修改的属性是啥。

        // 构造Bson对象,用于匹配需要更新的文档Bson filter = Filters.eq("uid", "1");// 执行替换操作collection.replaceOne(filter, new User(...));

PS:mongo的数据格式BSON类型的,他的写法和Json类似。所以写过滤条件需要使用BSON。

删除操作

(1)单个删除

        Bson filter = Filters.eq("uid", "1");collection.deleteOne(filter);

(2)批量删除(删除密码所有为:‘123456’的)

Bson filter = Filters.eq("password", "123456");
collection.deleteMany(filter);

查询操作

(1)单个查询

        Bson filter = Filters.eq("uid",uid);FindIterable<User> users= collection.find(filter);User user = users.first();

(2)多个查询(List<User>)

        Bson filter = Filters.eq("uid","1");FindIterable<User> users= collection.find(filter);List<User> userList = new ArrayList<>();//防止资源和内存泄漏,自动关闭try (MongoCursor<Weekly> iterator = users.iterator()){while (iterator.hasNext()){userList.add(iterator.next());}}catch (Exception e){logger.error("查询错误:" + e.getMessage());}

PS:当使用MongoCursor遍历查询结果时,一定要手动关闭它,否则会造成资源泄露。可以使用try-with-resources语句块来自动关闭MongoCursor。当然数据量小,不写也不影响。

(3)分页查询(List<User>)

        page = (page == 0) ? 1 : page;// 当前页数pageSize = (pageSize == 0) ? 10 : pageSize; // 每页数据量Bson filter = Filters.eq("uid","1");FindIterable<User> users= collection.find(filter).sort(Sorts.descending("startTime"))                                     .skip((page -1) * pageSize).limit(pageSize);;List<User> userList = new ArrayList<>();//防止资源和内存泄漏,自动关闭try (MongoCursor<Weekly> iterator = users.iterator()){while (iterator.hasNext()){userList.add(iterator.next());}}catch (Exception e){logger.error("查询错误:" + e.getMessage());}

(4)其他查询

查询某个字段大于特定值的数据:

Bson filter = Filters.gt("age", 18);
FindIterable<Document> result = collection.find(filter);

查询某个字段小于特定值的数据:

Bson filter = Filters.lt("age", 18);
FindIterable<Document> result = collection.find(filter);

查询某个字段包含特定值的数据:

Bson filter = Filters.in("gender", Arrays.asList("female", "unknown"));
FindIterable<Document> result = collection.find(filter);

PS:常见的查询还有很多,如:范围查询、分页查询、嵌套查询、空查询、正则表达式查询等等。有空再开博客写吧。

以上就是Idea中用java快速上手MongoDB的过程了,基本的CRUD感觉足够了。个人感觉实现业务的方式有很多种,这种可能不是最好的,但我觉得还挺方便的。本篇就大概做了快速入门,有时间写个专栏,把这段时间来的问题梳理梳理。

相关文章:

IDEA操作MongoDB快速上手开发

写在前面&#xff1a;最近在公司实习&#xff0c;需要完成一个实习任务。这个任务用的是SSH框架&#xff0c;数据库需要使用mongoDB完成。由于刚接触MongoDB,所以不是很熟练&#xff0c;在网上查找了大量的资料&#xff0c;许多都是抄来抄去的&#xff0c;运行一堆错误。如今&a…...

从FPGA说起的深度学习(六)-任务并行性

这是新的系列教程&#xff0c;在本教程中&#xff0c;我们将介绍使用 FPGA 实现深度学习的技术&#xff0c;深度学习是近年来人工智能领域的热门话题。在本教程中&#xff0c;旨在加深对深度学习和 FPGA 的理解。用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为硬…...

5.39 综合案例2.0 - STM32蓝牙遥控小车4(体感控制)

综合案例2.0 - 蓝牙遥控小车4- 体感控制成品展示案例说明器件说明小车连线小车源码遥控手柄遥控器连线遥控器代码1.摇杆PS2模块说明2.六轴MPU-6050说明成品展示 案例说明 用STM32单片机做了一辆蓝牙控制的麦轮小车&#xff0c;分享一下小车的原理和制作过程。 控制部分分为手机…...

Scala之面向对象

目录 Scala包&#xff1a; 基础语法&#xff1a; Scala包的三大作用&#xff1a; 包名的命名规范&#xff1a; 写包的好处&#xff1a; 包对象&#xff1a; 导包说明&#xff1a; 类和对象&#xff1a; 定义类&#xff1a; 封装&#xff1a; 构造器&#xff1a; 主从…...

深度学习目标检测项目实战(四)—基于Tensorflow object detection API的骨折目标检测及其界面运行

深度学习目标检测项目实战(四)—基于Tensorflow object detection API的骨折目标检测及其界面运行 使用tensorflow object detection进行训练检测 参考原始代码&#xff1a;https://github.com/tensorflow/models/tree/master/research 我用的是1.x的版本 所以环境必须有gpu版…...

嵌入式工程师如何快速的阅读datasheet的方法

目录 ▎从项目角度来看datasheet ▎各取所需 ▎最后 Datasheet&#xff08;数据手册&#xff09;的快速阅读能力&#xff0c;是每个工程师都应该具备的基本素养。 无论是项目开始阶段的选型还是后续的软硬件设计&#xff0c;到后期的项目调试&#xff0c;经常有工程师对着英…...

(三)合约广告

1. 广告位&#xff08;CPT&#xff09;合约 系统&#xff1a;广告排期系统 网站把某一个广告位卖给广告商&#xff0c;这段时间归广告商所有&#xff0c;到点了下线 &#xff08;1&#xff09;流量选择的维度&#xff1a;时间段、地域等 &#xff08;2&#xff09;典型场景…...

【Android -- 软技能】分享一个学习方法

前言 很多人都想通过学习来提升自己&#xff0c;但是&#xff0c;可能因为两个问题&#xff0c;阻碍了自己的高效提升&#xff1a; 学什么&#xff1f; 怎么学&#xff1f; 本文将从自己的学习实践出发&#xff0c;针对这两个问题&#xff0c;给出自己的一套学习流程。 1…...

Python-DQN代码阅读(10)

目录 1.代码 1.1 代码阅读 1.2 代码分解 1.2.1 f open("experiments/" str(env.spec.id) "/performance.txt", "a") 1.2.2 f.write(str(ep) " " str(time_steps) " " str(episode_rewards) " " str(…...

MongoDB入坑

MongoDB入坑一、体系架构1、简介2、MongoDB VS RDBMS3、文件4、体系结构二、权限管理1、开启2、角色三、存储引擎四、备份 & 恢复五、高可用0、主从复制1、副本集2、分片一、体系架构 1、简介 DBMS No.5;NoSQL Document No.1 1&#xff09;BSON BSON&#xff08;Binary …...

【论文总结】针对操作系统级虚拟化的抽象资源攻击

介绍 这是一篇来自2021CCS的论文&#xff0c;作者有Nanzi Yang, Wenbo Shen, Jinku Li, Yutian Yang, Kangjie Lu, Jietao Xiao, Tianyu Zhou, Chenggang Qin, Wang Yu, Jianfeng Ma, Kui Ren。 概述 本文的贡献如下&#xff1a; 新的攻击面&#xff1a;作者揭示了一个影响操…...

C# 提取 PDF 文档中的文本

C# .Net 使用 IText7 从PDF文件中提取出所有文本内容 【文 / 张赐荣】 首先在 Nuget 包管理器中,安装"itext7" 和 "itext7.font-asian"。 如果不安装 "itext7.font-asian" PDF 文件中有非Unicode编码的字符,将会抛出运行时异常:iText.IO.Excep…...

mac如何升级node版本、切换node版本

一、mac如何升级node版本 当前官网稳定版本是18.15.0 所以我从v14.17.4升级到v18.15.0 二、mac如何切换node版本 切换到16.20.0版本 三、这里是用node.js的多版本管理器n来升级和切换的&#xff0c;命令如下&#xff1a; 1、sudo npm cache clean -f //清除node.js的cache …...

一位大专学历的女程序员要求月薪25K,学历重要吗?来看看面试过程

“请提供一份完整的简历&#xff0c;以便我审查。从您的简历中&#xff0c;我感觉您写得还不错。方便的话&#xff0c;您可以自我简单介绍一下吗&#xff1f;“ ”好的&#xff0c;我叫李娟&#xff0c;拥有大专学位&#xff0c;目前正在寻找一份Java开发架构师的工作岗位。“…...

ESP32驱动1.28寸GC9A01播放视频(一、视频分辨率的调整和视频格式的转换)

ESP32驱动1.28寸GC9A01播放视频&#xff08;一、视频分辨率的调整和视频格式的转换&#xff09;播放前准备转换视频分辨率用FFmpeg将.MP4转换为.mjpeg格式FFmpeg的win10环境搭建FFmpeg的下载环境变量的搭建MP4转换成mjpeg格式总结播放前准备 1.28寸GC9A01屏幕的分辨率是240x24…...

epoll的LT模式(水平触发)和ET模式(边沿触发)

前言 epoll的触发模式是个引发讨论非常多的话题&#xff0c;网络上这方面总结的文章也很多&#xff0c;首先从名字上就不是很统一&#xff0c;LT模式常被称为水平触发、电平触发、条件触发&#xff0c;而ET模式常被称为边缘触发、边沿触发等&#xff0c;这些都是从英文翻译过来…...

Java基础面试20题

Java的八大基本数据类型 答&#xff1a;可以分4种类型&#xff1a;布尔类型(boolean)&#xff0c;字符类型(char)&#xff0c;浮点类型(double&#xff0c;float)&#xff0c;整型(byte&#xff0c;short&#xff0c;int, long)。 String,StringBuffer与StringBuilder的区别? …...

Java面向对象封装

目录 封装的概念 封装具体实现步骤 示例代码如下 封装具体语法 封装的概念 Java封装是一种面向对象的编程方法,它的主要思想是将类的内部细节(包括数据和方法)隐藏起来,对外只提供公共的访问接口,从而保证了程序的安全性和稳定性。 封装具体实现步骤 1、声明类的成…...

队列实现图书信息管理(C语言)

文章目录Queue.hmain.cQueue.c用队列实现一个图书信息管理&#xff0c;这里放一下有哪些文件。&#xff08;ps&#xff1a;我之前写的是学生信息管理&#xff0c;但是有人说我们的作业是写图书&#xff0c;就该了下内容&#xff0c;没有改文件名&#xff09;队列是用链表实现的…...

Java开发 - 读写分离初体验

前言 上一篇中&#xff0c;我们介绍了主从复制&#xff0c;相信学过的小伙伴已经能够很好的掌握主从复制的技术&#xff0c;实际上也并没有那么难&#xff0c;虽然没有讲一主多从&#xff0c;多主多从的配置&#xff0c;但是从一主一从的配置中也很容易联想到该怎么配置&#…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...