我经常对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