mongodb java 单例_Java单例MongoDB工具类

我经常对MongoDB进行一些基础操作,将这些常用操作合并到一个工具类中,方便自己开发使用。

没用Spring Data、Morphia等框架是为了减少学习、维护成本,另外自己直接JDBC方式的话可以更灵活,为自己以后的积累留一个脚印。

Java驱动版本:

org.mongodb

mongo-java-driver

3.0.2

工具类代码如下:

package utils;

import java.util.ArrayList;

import java.util.List;

import org.apache.commons.configuration.CompositeConfiguration;

import org.apache.commons.configuration.ConfigurationException;

import org.apache.commons.configuration.PropertiesConfiguration;

import org.bson.Document;

import org.bson.conversions.Bson;

import org.bson.types.ObjectId;

import com.mongodb.BasicDBObject;

import com.mongodb.MongoClient;

import com.mongodb.MongoClientOptions;

import com.mongodb.MongoClientOptions.Builder;

import com.mongodb.WriteConcern;

import com.mongodb.client.MongoCollection;

import com.mongodb.client.MongoCursor;

import com.mongodb.client.MongoDatabase;

import com.mongodb.client.MongoIterable;

import com.mongodb.client.model.Filters;

import com.mongodb.client.result.DeleteResult;

/**

* MongoDB工具类 Mongo实例代表了一个数据库连接池,即使在多线程的环境中,一个Mongo实例对我们来说已经足够了

* 注意Mongo已经实现了连接池,并且是线程安全的。

* 设计为单例模式, 因 MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,

* Mongo有个内置的连接池(默认为10个) 对于有大量写和读的环境中,为了确保在一个Session中使用同一个DB时,

* DB和DBCollection是绝对线程安全的

*

* @author zhoulingfei

* @date 2015-5-29 上午11:49:49

* @version 0.0.0

* @Copyright (c)1997-2015 NavInfo Co.Ltd. All Rights Reserved.

*/

public enum MongoDBUtil {

/**

* 定义一个枚举的元素,它代表此类的一个实例

*/

instance;

private MongoClient mongoClient;

static {

System.out.println("===============MongoDBUtil初始化========================");

CompositeConfiguration config = new CompositeConfiguration();

try {

config.addConfiguration(new PropertiesConfiguration("mongodb.properties"));

} catch (ConfigurationException e) {

e.printStackTrace();

}

// 从配置文件中获取属性值

String ip = config.getString("host");

int port = config.getInt("port");

instance.mongoClient = new MongoClient(ip, port);

// or, to connect to a replica set, with auto-discovery of the primary, supply a seed list of members

// List listHost = Arrays.asList(new ServerAddress("localhost", 27017),new ServerAddress("localhost", 27018));

// instance.mongoClient = new MongoClient(listHost);

// 大部分用户使用mongodb都在安全内网下,但如果将mongodb设为安全验证模式,就需要在客户端提供用户名和密码:

// boolean auth = db.authenticate(myUserName, myPassword);

Builder options = new MongoClientOptions.Builder();

// options.autoConnectRetry(true);// 自动重连true

// options.maxAutoConnectRetryTime(10); // the maximum auto connect retry time

options.connectionsPerHost(300);// 连接池设置为300个连接,默认为100

options.connectTimeout(15000);// 连接超时,推荐>3000毫秒

options.maxWaitTime(5000); //

options.socketTimeout(0);// 套接字超时时间,0无限制

options.threadsAllowedToBlockForConnectionMultiplier(5000);// 线程队列数,如果连接线程排满了队列就会抛出“Out of semaphores to get db”错误。

options.writeConcern(WriteConcern.SAFE);//

options.build();

}

// ------------------------------------共用方法---------------------------------------------------

/**

* 获取DB实例 - 指定DB

*

* @param dbName

* @return

*/

public MongoDatabase getDB(String dbName) {

if (dbName != null && !"".equals(dbName)) {

MongoDatabase database = mongoClient.getDatabase(dbName);

return database;

}

return null;

}

/**

* 获取collection对象 - 指定Collection

*

* @param collName

* @return

*/

public MongoCollection getCollection(String dbName, String collName) {

if (null == collName || "".equals(collName)) {

return null;

}

if (null == dbName || "".equals(dbName)) {

return null;

}

MongoCollection collection = mongoClient.getDatabase(dbName).getCollection(collName);

return collection;

}

/**

* 查询DB下的所有表名

*/

public List getAllCollections(String dbName) {

MongoIterable colls = getDB(dbName).listCollectionNames();

List _list = new ArrayList();

for (String s : colls) {

_list.add(s);

}

return _list;

}

/**

* 获取所有数据库名称列表

*

* @return

*/

public MongoIterable getAllDBNames() {

MongoIterable s = mongoClient.listDatabaseNames();

return s;

}

/**

* 删除一个数据库

*/

public void dropDB(String dbName) {

getDB(dbName).drop();

}

/**

* 查找对象 - 根据主键_id

*

* @param collection

* @param id

* @return

*/

public Document findById(MongoCollection coll, String id) {

ObjectId _idobj = null;

try {

_idobj = new ObjectId(id);

} catch (Exception e) {

return null;

}

Document myDoc = coll.find(Filters.eq("_id", _idobj)).first();

return myDoc;

}

/** 统计数 */

public int getCount(MongoCollection coll) {

int count = (int) coll.count();

return count;

}

/** 条件查询 */

public MongoCursor find(MongoCollection coll, Bson filter) {

return coll.find(filter).iterator();

}

/** 分页查询 */

public MongoCursor findByPage(MongoCollection coll, Bson filter, int pageNo, int pageSize) {

Bson orderBy = new BasicDBObject("_id", 1);

return coll.find(filter).sort(orderBy).skip((pageNo - 1) * pageSize).limit(pageSize).iterator();

}

/**

* 通过ID删除

*

* @param coll

* @param id

* @return

*/

public int deleteById(MongoCollection coll, String id) {

int count = 0;

ObjectId _id = null;

try {

_id = new ObjectId(id);

} catch (Exception e) {

return 0;

}

Bson filter = Filters.eq("_id", _id);

DeleteResult deleteResult = coll.deleteOne(filter);

count = (int) deleteResult.getDeletedCount();

return count;

}

/**

* FIXME

*

* @param coll

* @param id

* @param newdoc

* @return

*/

public Document updateById(MongoCollection coll, String id, Document newdoc) {

ObjectId _idobj = null;

try {

_idobj = new ObjectId(id);

} catch (Exception e) {

return null;

}

Bson filter = Filters.eq("_id", _idobj);

// coll.replaceOne(filter, newdoc); // 完全替代

coll.updateOne(filter, new Document("$set", newdoc));

return newdoc;

}

public void dropCollection(String dbName, String collName) {

getDB(dbName).getCollection(collName).drop();

}

/**

* 关闭Mongodb

*/

public void close() {

if (mongoClient != null) {

mongoClient.close();

mongoClient = null;

}

}

/**

* 测试入口

*

* @param args

*/

public static void main(String[] args) {

String dbName = "GC_MAP_DISPLAY_DB";

String collName = "COMMUNITY_BJ";

MongoCollection coll = MongoDBUtil.instance.getCollection(dbName, collName);

// 插入多条

// for (int i = 1; i <= 4; i++) {

// Document doc = new Document();

// doc.put("name", "zhoulf");

// doc.put("school", "NEFU" + i);

// Document interests = new Document();

// interests.put("game", "game" + i);

// interests.put("ball", "ball" + i);

// doc.put("interests", interests);

// coll.insertOne(doc);

// }

// // 根据ID查询

// String id = "556925f34711371df0ddfd4b";

// Document doc = MongoDBUtil2.instance.findById(coll, id);

// System.out.println(doc);

// 查询多个

// MongoCursor cursor1 = coll.find(Filters.eq("name", "zhoulf")).iterator();

// while (cursor1.hasNext()) {

// org.bson.Document _doc = (Document) cursor1.next();

// System.out.println(_doc.toString());

// }

// cursor1.close();

// 查询多个

// MongoCursor cursor2 = coll.find(Person.class).iterator();

// 删除数据库

// MongoDBUtil2.instance.dropDB("testdb");

// 删除表

// MongoDBUtil2.instance.dropCollection(dbName, collName);

// 修改数据

// String id = "556949504711371c60601b5a";

// Document newdoc = new Document();

// newdoc.put("name", "时候");

// MongoDBUtil.instance.updateById(coll, id, newdoc);

// 统计表

// System.out.println(MongoDBUtil.instance.getCount(coll));

// 查询所有

Bson filter = Filters.eq("count", 0);

MongoDBUtil.instance.find(coll, filter);

}

}

也请多提宝贵意见和建议。0b1331709591d260c1c78e86d0c51c18.png

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

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

相关文章

Oracle中执行存储过程call和exec区别

在sqlplus中这两种方法都可以使用&#xff1a; exec pro_name(参数1..); call pro_name(参数1..); 区别&#xff1a; 1. 但是exec是sqlplus命令&#xff0c;只能在sqlplus中使用&#xff1b;call为SQL命令&#xff0c;没有限制. 2. 存储过程没有参数时,exec可以直接跟过…

每秒处理10万订单乐视集团支付架构

原文&#xff1a;http://www.iteye.com/news/31550 ----------- 随着乐视硬件抢购的不断升级&#xff0c;乐视集团支付面临的请求压力百倍乃至千倍的暴增。作为商品购买的最后一环&#xff0c;保证用户快速稳定的完成支付尤为重要。所以在15年11月&#xff0c;我们对整个支付…

X--名称空间详解

转自:http://blog.csdn.net/lisenyang/article/details/18312039 X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的、用来引导XAML代码将XAML代码编译为CLR代码。 4.1X名称空间里面到底都有些什么&#xff1f; x名称空间映射的是:http://schemas.microsoft.com/wi…

事物 php,什么是php事务

事务&#xff1a;用于保证数据的一致性&#xff0c;他由一组相关的dml语句组成&#xff0c;改组的dml语句要么全部成功&#xff0c;要么全部失败。当前版本的插件并不是事务安全的&#xff0c;因为他并没有识别全部的事务操作。SQL 事务单元是在单一服务器中运行的。插件并不能…

Flask form(登录,注册)

用户登录 from flask import Flask, render_template, request, redirect from wtforms import Form from wtforms.fields import core from wtforms.fields import html5 from wtforms.fields import simple from wtforms import validators from wtforms import widgetsapp …

怎么看so文件是哪个aar引进来的_手机爱奇艺下载视频存在哪个文件夹

我们很多朋友喜欢看视频使用爱奇艺观看&#xff0c;并且喜欢直接把视频缓冲到手机里&#xff0c;或是直接下载视频文件&#xff0c;但是经常不知道手机爱奇艺下载视频存在哪个文件夹&#xff0c;不知道怎么分享给好友或是传到电脑上&#xff0c;下面就来简单介绍一下。手机爱奇…

esxi能直通的显卡型号_显卡刷bios教程

一般来说显卡默认的出厂bios就已经很稳定&#xff0c;如果没有特殊情况下建议不要刷显卡bios。一般而言部分网友刷显卡BIOS目的是开核或超频&#xff0c;那么对于一个不会刷显卡bios的网友来说肯定会问显卡怎么刷bios类似的问题&#xff0c;那么本文这里就说一下有关显卡怎么刷…

关于Linux网卡调优之:RPS (Receive Packet Steering)

昨天在查LVS调度均衡性问题时&#xff0c;最终确定是 persistence_timeout 参数会使用IP哈希。目的是为了保证长连接&#xff0c;即一定时间内访问到的是同一台机器。而我们内部系统&#xff0c;由于出口IP相对单一&#xff0c;所以总会被哈希到相同的RealServer。 过去使用LVS…

footer.php置底,CSS五种方式实现Footer置底

页脚置底(Sticky footer)就是让网页的footer部分始终在浏览器窗口的底部。当网页内容足够长以至超出浏览器可视高度时&#xff0c;页脚会随着内容被推到网页底部&#xff1b;但如果网页内容不够长&#xff0c;置底的页脚就会保持在浏览器窗口底部。方法一&#xff1a;将内容部分…

安卓adapter适配器作用_自带安卓系统的便携屏,能玩出什么花样?

之前说到去年出差太多&#xff0c;平常就把便携屏带上了。之前也说了如果是像笔者这样的出差狗也知道&#xff0c;托运需要提前去机场一路着急忙慌&#xff0c;不托运只需要打印登机牌(纸质才给报销)排队安检登机就完了。有的时候可以把标准显示器来回寄&#xff0c;只要包装强…

Typora markdown公式换行等号对齐_Typora编写博客格式化文档的最佳软件

Typora-编写博客格式化文档的最佳软件Typora 不仅是一款支持实时预览的 Markdown 文本编辑器&#xff0c;而且还支持数学公式、代码块、思维导图等功能。它有 OS X、Windows、Linux 三个平台的版本&#xff0c;是完全免费的。作为技术人员或者专业人员&#xff0c;使用Markdown…

docker-machine

vbox安装 sudo /sbin/vboxconfig &#xfffc; yum install gcc make yum install kernel-devel-3.10.0-514.26.2.el7.x86_64 转载于:https://www.cnblogs.com/yixiaoyi/p/dockermachine.html

intention lock_写作技巧:你写出来的情节有用吗?好情节的原则——LOCK系统

读者喜欢一本小说的原因只有一个&#xff1a;很棒的故事。——Donald Maass来&#xff0c;话筒对准这位小作家&#xff0c;请问你是如何构思故事的&#xff1f;是习惯于现在脑海中把故事都想好了&#xff0c;才开始写作&#xff1f;还是习惯于临场发挥&#xff0c;喜欢一屁股坐…

power designer数据流图_鲲云公开课 | 三分钟带你了解数据流架构

目前&#xff0c;市场上的芯片主要包括指令集架构和数据流架构两种实现方式。指令集架构主要包括X86架构、ARM架构、精简指令集运算RISC-V开源架构&#xff0c;以及SIMD架构。总体来说&#xff0c;四者都属于传统的通用指令集架构。传统的指令集架构采用冯诺依曼计算方式&#…

linux php环境搭建教程,linux php环境搭建教程

linux php环境搭建的方法&#xff1a;首先获取相关安装包&#xff1b;然后安装Apache以及mysql&#xff1b;接着修改配置文件“httpd.conf”&#xff1b;最后设置环境变量和开机自启&#xff0c;并编译安装PHP即可。一、获取安装包PHP下载地址&#xff1a;http://cn.php.net/di…

jsp放在web-inf下的注意事项

原文&#xff1a;http://blog.csdn.net/whatlookingfor/article/details/38381881 ------------------------------------------------- web-inf目录是不对外开放的&#xff0c;外部没办法直接访问到。所有只能通过映射来访问&#xff0c;比如映射为一个action或者servlet通过…

asp.net 获取全部在线用户_Qamp;A | 在线考试问卷答疑

01.如何批量导入试题&#xff1f;如果您已经在word或者excel中准备好了考试文档&#xff0c;通过批量导入试题的方式&#xff0c;可以让考试问卷的制作更加方便快捷。详细了解批量导入考试的文本格式&#xff1a;【点击此处】02.如何进行考试随机抽题&#xff1f;老师事先建立题…

PHP 框架 模块化,Laravel 的模块化开发框架 Notadd RC1

本文我们要和大家分享 Laravel 的模块化开发框架 Notadd RC1 的介绍&#xff0c;它的优点是修复了首页编辑模式下滚动的BUG (Eleven)&#xff0c;修复了后台菜单管理修改后不跳转的BUG (ganlanshu0211)&#xff0c;修复后台 ESLint 的 Camelcase 的错误 (狒狒)&#xff0c;暂时…

spring mvc 工作流程

1A&#xff09;客户端发出http请求&#xff0c;只要请求形式符合web.xml 文件中配置的*.action的话&#xff0c;就由DispatcherServlet 来处理。 1B&#xff09;DispatcherServlet再将http请求委托给映射器 的对象来将http请求交给对应的Action来处理 2&#xff0…

excel切片器_如何在Excel表格中使用切片器

切片器除了在数据透视表中会使用到&#xff0c;在Excel的表格功能下面&#xff0c;也是可以进行使用的。下面就来介绍一下如何使用切片器这个工具。创建和使用切片器1.首先就是要创建一个表格。选中目标区域&#xff0c;使用快捷键CtrlT&#xff0c;创建一个表格。2.点击“插入…