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开发 - 读写分离初体验
前言 上一篇中,我们介绍了主从复制,相信学过的小伙伴已经能够很好的掌握主从复制的技术,实际上也并没有那么难,虽然没有讲一主多从,多主多从的配置,但是从一主一从的配置中也很容易联想到该怎么配置&#…...

图文详解CAN Log文件 - ASC文件格式
目录 1 CAN Log文件 -- ASC文件格式 1.1 Header 1.2 版本编号 1.3 经典CAN网络中的描述 1.3.1 经典CAN Standard标准帧的描述 1.3.2 经典CAN Extended扩展帧的描述 1.3.3 CAN Remote远程帧的描述 1.3.4 CAN Error错误帧的描述 1.4 CANFD网络中的描述 1.4.1 经典CAN S…...

网络编程套接字(一)
学习任务: 我们先来认识端口号,区分好主机IP和端口号的区别,以及涉及到进程PID和端口号的区别。 然后简单认识一下TCP协议和UDP协议,这两个协议都是传输层的。接着了解什么是网络字节序,它有什么作用。然后是网络编程的…...
Mysql数据库存储过程
1、参数分类 存储过程的参数类型可以是IN、OUT和INOUT。根据这点分类如下: 1、没有参数(无参数无返回) 2、仅仅带 IN 类型(有参数无返回) 3、仅仅带 OUT 类型(无参数有返回) 4、既带 IN 又带 O…...
当我开始学习人工智能:人工智能的学派及研究目标
上课真是不认真啊,现在都写不来了作业了,真的会谢 一、人工智能的学派及其争论 1.1 对人工智能方法的争论 三个学派 符号主义 认为人的认知基元是符号,认知过程即符号操作过程。 认为人是一个物理符号系统,计算机也是一个物理符…...

Html5钢琴块游戏制作与分享(音游可玩)
当年一款手机节奏音游,相信不少人都玩过或见过。最近也是将其做了出来分享给大家。 游戏的基本玩法:点击下落的黑色方块,弹奏音乐。(下落的速度会越来越快) 可以进行试玩,手机玩起来效果会更好些。 点击…...
MySQL数据库——数据库设计概念和数据库设计步骤
数据库设计就是根据业务系统的具体需求,结合我们所选用的数据库,建立好表结构及表与表之间的管理关系,为这个业务系统构造出最优秀的数据存储模型的过程。使之能有效的对应用的数据进行存储,并高效的对已经存储的数据进行访问。 …...

【云原生】Kubernetes(k8s)之Pod概念和使用
k8s之Pod概念和使用一、Pod简介1.1、Pod的阶段(状态)1.2、容器状态二、Pod的定义2.1、restartPolicy2.2、imagePullPolicy2.3、command2.4、args2.5、resources三、Pod的使用3.1、创建并访问Pod3.2、多个应用容器3.3、Init容器3.3.1、Init容器与普通容器…...

数组(九)-- LC[316][321][402] 去除重复字母
1 移掉 K 位数字 1.1 题目描述 题目链接:https://leetcode.cn/problems/remove-k-digits/ 1.2 思路分析 这道题让我们从一个字符串数字中删除 k 个数字,使得剩下的数最小。也就说,我们要保持原来的数字的相对位置不变。 以题目中的 num1432…...

ubuntu下Thrift安装
thrift是一种常用rpc框架,工作中经常会用到,本文记录一下其安装过程。 目录 1.下载软件包 1.1thrift下载 1.2libevent下载 1.3boost下载 2.安装(注意步骤) 2.1安装libevent 2.2安装boost 2.3安装与Python2.7版本对应的py…...

读懂AUTOSAR :DiagnosticLogAndTrace DLT(四)-- API解析
一、周期调用的函数:Dlt_TxFunction 根据参数DltGeneralTrafficShapingSupport,决定如何去发送DLT消息。如果为TRUE,那需要参考参数DltLogChannelTrafficShapingBandwidth为每个Log通道设置发送带宽;如果为FALSE,那么…...