JAVA单例MongoDB工具类
本文内容纲要:
我经常对MongoDB进行一些基础操作,将这些常用操作合并到一个工具类中,方便自己开发使用。
没用SpringData、Morphia等框架是为了减少学习、维护成本,另外自己直接JDBC方式的话可以更灵活,为自己以后的积累留一个脚印。
JAVA驱动版本:
<!--MongoDB驱动-->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.0.2</version>
</dependency>
工具类代码如下:
packageutils;
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.commons.configuration.CompositeConfiguration;
importorg.apache.commons.configuration.ConfigurationException;
importorg.apache.commons.configuration.PropertiesConfiguration;
importorg.bson.Document;
importorg.bson.conversions.Bson;
importorg.bson.types.ObjectId;
importcom.mongodb.BasicDBObject;
importcom.mongodb.MongoClient;
importcom.mongodb.MongoClientOptions;
importcom.mongodb.MongoClientOptions.Builder;
importcom.mongodb.WriteConcern;
importcom.mongodb.client.MongoCollection;
importcom.mongodb.client.MongoCursor;
importcom.mongodb.client.MongoDatabase;
importcom.mongodb.client.MongoIterable;
importcom.mongodb.client.model.Filters;
importcom.mongodb.client.result.DeleteResult;
/**
*MongoDB工具类Mongo实例代表了一个数据库连接池,即使在多线程的环境中,一个Mongo实例对我们来说已经足够了<br>
*注意Mongo已经实现了连接池,并且是线程安全的。<br>
*设计为单例模式,因MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,<br>
*Mongo有个内置的连接池(默认为10个)对于有大量写和读的环境中,为了确保在一个Session中使用同一个DB时,<br>
*DB和DBCollection是绝对线程安全的<br>
*
*@authorzhoulingfei
*@date2015-5-29上午11:49:49
*@version0.0.0
*@Copyright(c)1997-2015NavInfoCo.Ltd.AllRightsReserved.
*/
publicenumMongoDBUtil{
/**
*定义一个枚举的元素,它代表此类的一个实例
*/
instance;
privateMongoClientmongoClient;
static{
System.out.println("===============MongoDBUtil初始化========================");
CompositeConfigurationconfig=newCompositeConfiguration();
try{
config.addConfiguration(newPropertiesConfiguration("mongodb.properties"));
}catch(ConfigurationExceptione){
e.printStackTrace();
}
//从配置文件中获取属性值
Stringip=config.getString("host");
intport=config.getInt("port");
instance.mongoClient=newMongoClient(ip,port);
//or,toconnecttoareplicaset,withauto-discoveryoftheprimary,supplyaseedlistofmembers
//List<ServerAddress>listHost=Arrays.asList(newServerAddress("localhost",27017),newServerAddress("localhost",27018));
//instance.mongoClient=newMongoClient(listHost);
//大部分用户使用mongodb都在安全内网下,但如果将mongodb设为安全验证模式,就需要在客户端提供用户名和密码:
//booleanauth=db.authenticate(myUserName,myPassword);
Builderoptions=newMongoClientOptions.Builder();
//options.autoConnectRetry(true);//自动重连true
//options.maxAutoConnectRetryTime(10);//themaximumautoconnectretrytime
options.connectionsPerHost(300);//连接池设置为300个连接,默认为100
options.connectTimeout(15000);//连接超时,推荐>3000毫秒
options.maxWaitTime(5000);//
options.socketTimeout(0);//套接字超时时间,0无限制
options.threadsAllowedToBlockForConnectionMultiplier(5000);//线程队列数,如果连接线程排满了队列就会抛出“Outofsemaphorestogetdb”错误。
options.writeConcern(WriteConcern.SAFE);//
options.build();
}
//------------------------------------共用方法---------------------------------------------------
/**
*获取DB实例-指定DB
*
*@paramdbName
*@return
*/
publicMongoDatabasegetDB(StringdbName){
if(dbName!=null&&!"".equals(dbName)){
MongoDatabasedatabase=mongoClient.getDatabase(dbName);
returndatabase;
}
returnnull;
}
/**
*获取collection对象-指定Collection
*
*@paramcollName
*@return
*/
publicMongoCollection<Document>getCollection(StringdbName,StringcollName){
if(null==collName||"".equals(collName)){
returnnull;
}
if(null==dbName||"".equals(dbName)){
returnnull;
}
MongoCollection<Document>collection=mongoClient.getDatabase(dbName).getCollection(collName);
returncollection;
}
/**
*查询DB下的所有表名
*/
publicList<String>getAllCollections(StringdbName){
MongoIterable<String>colls=getDB(dbName).listCollectionNames();
List<String>_list=newArrayList<String>();
for(Strings:colls){
_list.add(s);
}
return_list;
}
/**
*获取所有数据库名称列表
*
*@return
*/
publicMongoIterable<String>getAllDBNames(){
MongoIterable<String>s=mongoClient.listDatabaseNames();
returns;
}
/**
*删除一个数据库
*/
publicvoiddropDB(StringdbName){
getDB(dbName).drop();
}
/**
*查找对象-根据主键_id
*
*@paramcollection
*@paramid
*@return
*/
publicDocumentfindById(MongoCollection<Document>coll,Stringid){
ObjectId_idobj=null;
try{
_idobj=newObjectId(id);
}catch(Exceptione){
returnnull;
}
DocumentmyDoc=coll.find(Filters.eq("_id",_idobj)).first();
returnmyDoc;
}
/**统计数*/
publicintgetCount(MongoCollection<Document>coll){
intcount=(int)coll.count();
returncount;
}
/**条件查询*/
publicMongoCursor<Document>find(MongoCollection<Document>coll,Bsonfilter){
returncoll.find(filter).iterator();
}
/**分页查询*/
publicMongoCursor<Document>findByPage(MongoCollection<Document>coll,Bsonfilter,intpageNo,intpageSize){
BsonorderBy=newBasicDBObject("_id",1);
returncoll.find(filter).sort(orderBy).skip((pageNo-1)*pageSize).limit(pageSize).iterator();
}
/**
*通过ID删除
*
*@paramcoll
*@paramid
*@return
*/
publicintdeleteById(MongoCollection<Document>coll,Stringid){
intcount=0;
ObjectId_id=null;
try{
_id=newObjectId(id);
}catch(Exceptione){
return0;
}
Bsonfilter=Filters.eq("_id",_id);
DeleteResultdeleteResult=coll.deleteOne(filter);
count=(int)deleteResult.getDeletedCount();
returncount;
}
/**
*FIXME
*
*@paramcoll
*@paramid
*@paramnewdoc
*@return
*/
publicDocumentupdateById(MongoCollection<Document>coll,Stringid,Documentnewdoc){
ObjectId_idobj=null;
try{
_idobj=newObjectId(id);
}catch(Exceptione){
returnnull;
}
Bsonfilter=Filters.eq("_id",_idobj);
//coll.replaceOne(filter,newdoc);//完全替代
coll.updateOne(filter,newDocument("$set",newdoc));
returnnewdoc;
}
publicvoiddropCollection(StringdbName,StringcollName){
getDB(dbName).getCollection(collName).drop();
}
/**
*关闭Mongodb
*/
publicvoidclose(){
if(mongoClient!=null){
mongoClient.close();
mongoClient=null;
}
}
/**
*测试入口
*
*@paramargs
*/
publicstaticvoidmain(String[]args){
StringdbName="GC_MAP_DISPLAY_DB";
StringcollName="COMMUNITY_BJ";
MongoCollection<Document>coll=MongoDBUtil.instance.getCollection(dbName,collName);
//插入多条
//for(inti=1;i<=4;i++){
//Documentdoc=newDocument();
//doc.put("name","zhoulf");
//doc.put("school","NEFU"+i);
//Documentinterests=newDocument();
//interests.put("game","game"+i);
//interests.put("ball","ball"+i);
//doc.put("interests",interests);
//coll.insertOne(doc);
//}
////根据ID查询
//Stringid="556925f34711371df0ddfd4b";
//Documentdoc=MongoDBUtil2.instance.findById(coll,id);
//System.out.println(doc);
//查询多个
//MongoCursor<Document>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<Person>cursor2=coll.find(Person.class).iterator();
//删除数据库
//MongoDBUtil2.instance.dropDB("testdb");
//删除表
//MongoDBUtil2.instance.dropCollection(dbName,collName);
//修改数据
//Stringid="556949504711371c60601b5a";
//Documentnewdoc=newDocument();
//newdoc.put("name","时候");
//MongoDBUtil.instance.updateById(coll,id,newdoc);
//统计表
//System.out.println(MongoDBUtil.instance.getCount(coll));
//查询所有
Bsonfilter=Filters.eq("count",0);
MongoDBUtil.instance.find(coll,filter);
}
}
也请多提宝贵意见和建议。
本文内容总结:
原文链接:https://www.cnblogs.com/zhoulf/p/4571647.html