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快速上手开发
写在前面:最近在公司实习,需要完成一个实习任务。这个任务用的是SSH框架,数据库需要使用mongoDB完成。由于刚接触MongoDB,所以不是很熟练,在网上查找了大量的资料,许多都是抄来抄去的,运行一堆错误。如今&a…...
从FPGA说起的深度学习(六)-任务并行性
这是新的系列教程,在本教程中,我们将介绍使用 FPGA 实现深度学习的技术,深度学习是近年来人工智能领域的热门话题。在本教程中,旨在加深对深度学习和 FPGA 的理解。用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为硬…...
5.39 综合案例2.0 - STM32蓝牙遥控小车4(体感控制)
综合案例2.0 - 蓝牙遥控小车4- 体感控制成品展示案例说明器件说明小车连线小车源码遥控手柄遥控器连线遥控器代码1.摇杆PS2模块说明2.六轴MPU-6050说明成品展示 案例说明 用STM32单片机做了一辆蓝牙控制的麦轮小车,分享一下小车的原理和制作过程。 控制部分分为手机…...
Scala之面向对象
目录 Scala包: 基础语法: Scala包的三大作用: 包名的命名规范: 写包的好处: 包对象: 导包说明: 类和对象: 定义类: 封装: 构造器: 主从…...
深度学习目标检测项目实战(四)—基于Tensorflow object detection API的骨折目标检测及其界面运行
深度学习目标检测项目实战(四)—基于Tensorflow object detection API的骨折目标检测及其界面运行 使用tensorflow object detection进行训练检测 参考原始代码:https://github.com/tensorflow/models/tree/master/research 我用的是1.x的版本 所以环境必须有gpu版…...
嵌入式工程师如何快速的阅读datasheet的方法
目录 ▎从项目角度来看datasheet ▎各取所需 ▎最后 Datasheet(数据手册)的快速阅读能力,是每个工程师都应该具备的基本素养。 无论是项目开始阶段的选型还是后续的软硬件设计,到后期的项目调试,经常有工程师对着英…...
(三)合约广告
1. 广告位(CPT)合约 系统:广告排期系统 网站把某一个广告位卖给广告商,这段时间归广告商所有,到点了下线 (1)流量选择的维度:时间段、地域等 (2)典型场景…...
【Android -- 软技能】分享一个学习方法
前言 很多人都想通过学习来提升自己,但是,可能因为两个问题,阻碍了自己的高效提升: 学什么? 怎么学? 本文将从自己的学习实践出发,针对这两个问题,给出自己的一套学习流程。 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)BSON BSON(Binary …...
【论文总结】针对操作系统级虚拟化的抽象资源攻击
介绍 这是一篇来自2021CCS的论文,作者有Nanzi Yang, Wenbo Shen, Jinku Li, Yutian Yang, Kangjie Lu, Jietao Xiao, Tianyu Zhou, Chenggang Qin, Wang Yu, Jianfeng Ma, Kui Ren。 概述 本文的贡献如下: 新的攻击面:作者揭示了一个影响操…...
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来升级和切换的,命令如下: 1、sudo npm cache clean -f //清除node.js的cache …...
一位大专学历的女程序员要求月薪25K,学历重要吗?来看看面试过程
“请提供一份完整的简历,以便我审查。从您的简历中,我感觉您写得还不错。方便的话,您可以自我简单介绍一下吗?“ ”好的,我叫李娟,拥有大专学位,目前正在寻找一份Java开发架构师的工作岗位。“…...
ESP32驱动1.28寸GC9A01播放视频(一、视频分辨率的调整和视频格式的转换)
ESP32驱动1.28寸GC9A01播放视频(一、视频分辨率的调整和视频格式的转换)播放前准备转换视频分辨率用FFmpeg将.MP4转换为.mjpeg格式FFmpeg的win10环境搭建FFmpeg的下载环境变量的搭建MP4转换成mjpeg格式总结播放前准备 1.28寸GC9A01屏幕的分辨率是240x24…...
epoll的LT模式(水平触发)和ET模式(边沿触发)
前言 epoll的触发模式是个引发讨论非常多的话题,网络上这方面总结的文章也很多,首先从名字上就不是很统一,LT模式常被称为水平触发、电平触发、条件触发,而ET模式常被称为边缘触发、边沿触发等,这些都是从英文翻译过来…...
Java基础面试20题
Java的八大基本数据类型 答:可以分4种类型:布尔类型(boolean),字符类型(char),浮点类型(double,float),整型(byte,short,int, long)。 String,StringBuffer与StringBuilder的区别? …...
Java面向对象封装
目录 封装的概念 封装具体实现步骤 示例代码如下 封装具体语法 封装的概念 Java封装是一种面向对象的编程方法,它的主要思想是将类的内部细节(包括数据和方法)隐藏起来,对外只提供公共的访问接口,从而保证了程序的安全性和稳定性。 封装具体实现步骤 1、声明类的成…...
队列实现图书信息管理(C语言)
文章目录Queue.hmain.cQueue.c用队列实现一个图书信息管理,这里放一下有哪些文件。(ps:我之前写的是学生信息管理,但是有人说我们的作业是写图书,就该了下内容,没有改文件名)队列是用链表实现的…...
Java开发 - 读写分离初体验
前言 上一篇中,我们介绍了主从复制,相信学过的小伙伴已经能够很好的掌握主从复制的技术,实际上也并没有那么难,虽然没有讲一主多从,多主多从的配置,但是从一主一从的配置中也很容易联想到该怎么配置&#…...
通用运放设计挑战:扫地机器人传感器信号调理实战解析
1. 项目概述:当扫地机器人遇上通用放大器最近在帮一个做智能硬件的朋友优化他们新一代扫地机器人的主控板,聊到传感器信号调理这块,他跟我大倒苦水。他说,现在的扫地机为了更“聪明”,身上集成的传感器越来越多&#x…...
G-Helper终极指南:3步快速解决华硕笔记本色彩失真问题
G-Helper终极指南:3步快速解决华硕笔记本色彩失真问题 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Ex…...
C++ mutable关键字深度解析:从const正确性到线程安全实践
1. 从一次线上调试的“诡异”现象说起 那天下午,我正盯着一个线上服务的监控面板,一个看似无关紧要的日志打印频率异常引起了我的注意。这是一个用C编写的多线程数据处理模块,其中有一个用于统计处理次数的成员变量,被声明为 con…...
HBuilderX网站打包APP
下载HBuilderX安装包官网地址:https://www.dcloud.io/ 选择HBuilderX极客开发工具 点击DOWNLOAD 点击历史版本,这里为什么不下载最新的版本,是因为我一开始下载的最新版本,打包一直提示cannot find module babel-core 将HBuilder…...
构建自主可控安全自动化平台:从开源情报到自动化响应实践
1. 项目概述:从开源代码到安全实践的桥梁最近在梳理一些开源安全项目时,我注意到了mattijsmoens/openclaw-sovereign-shield这个仓库。单从名字看,“Sovereign Shield”(主权之盾)就透着一股强烈的防御和自主掌控的意味…...
MAA助手:解放双手的明日方舟全自动游戏管理工具实战指南
MAA助手:解放双手的明日方舟全自动游戏管理工具实战指南 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://g…...
告别硬盘数据丢失焦虑!电脑专属5种恢复方法,无踩坑,速存
日常使用电脑时,文件误删是高频突发状况——辛苦整理的办公文档、珍藏的生活影像、重要的程序安装包,一旦不小心删除,难免让人手足无措。好在2026年,随着数据存储技术的迭代与恢复工具的升级,电脑误删文件的恢复成功率…...
原神玩家信息查询完整指南:如何快速掌握账号详情
原神玩家信息查询完整指南:如何快速掌握账号详情 【免费下载链接】GenshinPlayerQuery 根据原神uid查询玩家信息(基础数据、角色&装备、深境螺旋战绩等) 项目地址: https://gitcode.com/gh_mirrors/ge/GenshinPlayerQuery 还在为无法全面了解自己的原神账…...
保姆级教程:在Ubuntu 22.04上用ROS2 Humble和Gazebo搞定TurtleBot3仿真(从安装到建图导航)
保姆级教程:在Ubuntu 22.04上用ROS2 Humble和Gazebo搞定TurtleBot3仿真(从安装到建图导航) 机器人操作系统(ROS)正在重塑现代机器人开发流程。作为ROS2的最新长期支持版本,Humble Hawksbill为开发者带来了更…...
终极指南:如何用Reset-Windows-Update-Tool快速修复Windows更新故障
终极指南:如何用Reset-Windows-Update-Tool快速修复Windows更新故障 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool …...
