JAVA单例MongoDB工具类详解编程语言

JAVA驱动版本:

       <!-- MongoDB驱动 --> 
        <dependency> 
            <groupId>org.mongodb</groupId> 
            <artifactId>mongo-java-driver</artifactId> 
            <version>3.0.2</version> 
        </dependency> 
 


工具类代码如下:

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实例对我们来说已经足够了<br> 
* 注意Mongo已经实现了连接池,并且是线程安全的。 <br> 
* 设计为单例模式, 因 MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,<br> 
* Mongo有个内置的连接池(默认为10个) 对于有大量写和读的环境中,为了确保在一个Session中使用同一个DB时,<br> 
* DB和DBCollection是绝对线程安全的<br> 
*  
* @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<ServerAddress> 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<Document> getCollection(String dbName, String collName) { 
if (null == collName || "".equals(collName)) { 
return null; 
} 
if (null == dbName || "".equals(dbName)) { 
return null; 
} 
MongoCollection<Document> collection = mongoClient.getDatabase(dbName).getCollection(collName); 
return collection; 
} 
/** 
* 查询DB下的所有表名 
*/ 
public List<String> getAllCollections(String dbName) { 
MongoIterable<String> colls = getDB(dbName).listCollectionNames(); 
List<String> _list = new ArrayList<String>(); 
for (String s : colls) { 
_list.add(s); 
} 
return _list; 
} 
/** 
* 获取所有数据库名称列表 
*  
* @return 
*/ 
public MongoIterable<String> getAllDBNames() { 
MongoIterable<String> s = mongoClient.listDatabaseNames(); 
return s; 
} 
/** 
* 删除一个数据库 
*/ 
public void dropDB(String dbName) { 
getDB(dbName).drop(); 
} 
/** 
* 查找对象 - 根据主键_id 
*  
* @param collection 
* @param id 
* @return 
*/ 
public Document findById(MongoCollection<Document> 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<Document> coll) { 
int count = (int) coll.count(); 
return count; 
} 
/** 条件查询 */ 
public MongoCursor<Document> find(MongoCollection<Document> coll, Bson filter) { 
return coll.find(filter).iterator(); 
} 
/** 分页查询 */ 
public MongoCursor<Document> findByPage(MongoCollection<Document> 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<Document> 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<Document> 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<Document> 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<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); 
// 修改数据 
// 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); 
} 
}

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/10147.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论