Java单例模式下的MongoDB数据库操作工具类
本文实例讲述了Java单例模式下的MongoDB数据库操作工具类。分享给大家供大家参考,具体如下:
我经常对MongoDB进行一些基础操作,将这些常用操作合并到一个工具类中,方便自己开发使用。
没用SpringData、Morphia等框架是为了减少学习、维护成本,另外自己直接JDBC方式的话可以更灵活,为自己以后的积累留一个脚印。
JAVA驱动版本:
org.mongodb mongo-java-driver 3.0.2
工具类代码如下:
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实例对我们来说已经足够了
*注意Mongo已经实现了连接池,并且是线程安全的。
*设计为单例模式,因MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,
*Mongo有个内置的连接池(默认为10个)对于有大量写和读的环境中,为了确保在一个Session中使用同一个DB时,
*DB和DBCollection是绝对线程安全的
* *@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 //ListlistHost=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 getCollection(StringdbName,StringcollName){ if(null==collName||"".equals(collName)){ returnnull; } if(null==dbName||"".equals(dbName)){ returnnull; } MongoCollection collection=mongoClient.getDatabase(dbName).getCollection(collName); returncollection; } /** *查询DB下的所有表名 */ publicList getAllCollections(StringdbName){ MongoIterable colls=getDB(dbName).listCollectionNames(); List _list=newArrayList (); for(Strings:colls){ _list.add(s); } return_list; } /** *获取所有数据库名称列表 * *@return */ publicMongoIterable getAllDBNames(){ MongoIterable s=mongoClient.listDatabaseNames(); returns; } /** *删除一个数据库 */ publicvoiddropDB(StringdbName){ getDB(dbName).drop(); } /** *查找对象-根据主键_id * *@paramcollection *@paramid *@return */ publicDocumentfindById(MongoCollection coll,Stringid){ ObjectId_idobj=null; try{ _idobj=newObjectId(id); }catch(Exceptione){ returnnull; } DocumentmyDoc=coll.find(Filters.eq("_id",_idobj)).first(); returnmyDoc; } /**统计数*/ publicintgetCount(MongoCollection coll){ intcount=(int)coll.count(); returncount; } /**条件查询*/ publicMongoCursor find(MongoCollection coll,Bsonfilter){ returncoll.find(filter).iterator(); } /**分页查询*/ publicMongoCursor findByPage(MongoCollection 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 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 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 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 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); //修改数据 //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); } }
更多关于java相关内容感兴趣的读者可查看本站专题:《Java使用JDBC操作数据库技巧总结》、《Java+MySQL数据库程序设计总结》、《Java数据结构与算法教程》、《Java文件与目录操作技巧汇总》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。