数据库DB
/*
* MongoDB工具类 Mongo实例代表了一个数据库连接池,即使在多线程的环境中,一个Mongo实例对我们来说已经足够了<br>
* 注意Mongo已经实现了连接池,并且是线程安全的。 <br>
* 设计为单例模式, 因 MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,<br>
* Mongo有个内置的连接池(默认为10个) 对于有大量写和读的环境中,为了确保在一个Session中使用同一个DB时,<br>
* DB和DBCollection是绝对线程安全的<br>
*/
@SuppressWarnings("deprecation")
public class MongoDBUtil {
protected static MongoClient mongoClient = null;
//mongodb服务器IP
private static String ADDR = "127.0.0.1";
//mongodb的端口号
private static int PORT = 27017;
static {
mongoClient = new MongoClient(ADDR, PORT);
// 多个mongodb服务器连接如下
// List<ServerAddress> listHost = Arrays.asList(new ServerAddress("localhost", 27017),new ServerAddress("localhost", 27018));
// 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.build();
}
public static MongoClient getMongoClient() {
if(mongoClient == null) mongoClient = new MongoClient(ADDR, PORT);
return mongoClient;
}
/**
* 关闭Mongodb
*/
public static void close() {
if (mongoClient != null) {
mongoClient.close();
mongoClient = null;
}
}
/**
* 获取所有数据库名称列表
* @return 所有数据库名称
*/
public static List<String> findAllDBNames() {
return mongoClient.getDatabaseNames();
}
/**
* 获取DB实例 - 指定DB
* @param dbName 数据库名
* @return 数据库实例
*/
public static MongoDatabase findDB(String dbName) {
if (dbName != null && !"".equals(dbName)) {
MongoDatabase database = mongoClient.getDatabase(dbName);
return database;
}
return null;
}
/**
* 删除一个数据库
*/
public static void dropDB(String dbName) {
findDB(dbName).drop();
}
}
集合Collection
public class MongoCollectionUtil extends MongoDBUtil {
/**
* 查询DB下的所有表名
* @param dbName 数据库名
* @return 数据库中表名
*/
public static List<String> findAllCollections(String dbName) {
MongoIterable<String> colls = findDB(dbName).listCollectionNames();
List<String> _list = new ArrayList<String>();
for (String s : colls) {
_list.add(s);
}
return _list;
}
/**
* 查询DB下的所有表的数量
* @param dbName 库名
* @param collName 集合名
* @return
*/
public static int findAllDocumentCount(String dbName) {
List<String> colls = findAllCollections(dbName);
return (int) colls.size();
}
/**
* 获取某个库下,某个集合中文档数量
* @param dbName 库名
* @param collName 集合名
* @return
*/
public static int findAllDocumentCount(String dbName, String collName) {
MongoCollection<Document> coll = findDB(dbName).getCollection(collName);
return (int) coll.count();
}
/**
* 在库下创建集合
* @param dbName 库名
* @param collName 集合名
* @return
*/
public static void createCollection(String dbName, String collName) {
findDB(dbName).createCollection(collName);
}
/**
* 删除某个库下,某个集合
* @param dbName 库名
* @param collName 集合名
* @return
*/
public static void dropCollection(String dbName, String collName) {
findDB(dbName).getCollection(collName).drop();
}
/**
* 获取某个库下,某个集合中文档
* @param dbName 库名
* @param collName 集合名
* @return
*/
public static MongoCollection<Document> findCollection(String dbName, String collName) {
if (null == dbName || "".equals(dbName)) return null;
if (null == collName || "".equals(collName)) return null;
MongoCollection<Document> collection = mongoClient.getDatabase(dbName).getCollection(collName);
return collection;
}
}
文件Document
public class MongoDocumentUtil extends MongoCollectionUtil {
/**
* 文档集合中添加文档
* @param dbName 库名
* @param collName 集合名
* @param document 文档
*/
public static void addDocument(String dbName, String collName, Document document) {
addDocument(findCollection(dbName, collName), document);
}
/**
* 文档集合中添加多个文档
* @param dbName 库名
* @param collName 集合名
* @param document 文档
*/
public static void addDocument(String dbName, String collName, List<Document> documents) {
addDocument(findCollection(dbName, collName), documents);
}
/**
* 文档集合中添加文档
* @param coll 集合文档
* @param document 文档
*/
public static void addDocument(MongoCollection<Document> coll, Document document) {
List<Document> documents = new ArrayList<Document>();
documents.add(document);
addDocument(coll, documents);
}
/**
* 文档集合中添加多个文档
* @param coll 集合文档
* @param documents 多个文档
*/
public static void addDocument(MongoCollection<Document> coll, List<Document> documents) {
coll.insertMany(documents);
}
/**
* 根据文档Id修改文档
* @param dbName 库名
* @param collName 集合名
* @param id id
* @param newdoc 新文档
* @return
*/
public static Document updateDocumentById(String dbName, String collName, String id, Document newdoc) {
return updateDocumentById(findCollection(dbName, collName), id, newdoc);
}
/**
* 根据文档Id修改文档
* @param coll 集合文档
* @param id id
* @param newdoc 新文档
* @return
*/
public static Document updateDocumentById(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);
return updateDocument(coll, filter, newdoc);
}
/**
* 根据文档Id修改文档
* @param coll 集合文档
* @param filter 查询条件
* @param newdoc 新文档
* @return
*/
public static Document updateDocument(String dbName, String collName, Bson filter, Document newdoc) {
return updateDocument(findCollection(dbName, collName), filter, newdoc);
}
/**
* 根据文档Id修改文档
* @param coll 集合文档
* @param filter 查询条件
* @param newdoc 新文档
* @return
*/
public static Document updateDocument(MongoCollection<Document> coll, Bson filter, Document newdoc) {
// coll.replaceOne(filter, newdoc); // 完全替代
coll.updateOne(filter, new Document("$set", newdoc));
return newdoc;
}
/**
* 通过ID删除文档
* @param dbName 库名
* @param collName 集合名
* @param id id
* @return
*/
public static int deleteDocumentById(String dbName, String collName, String id) {
return deleteDocumentById(findCollection(dbName, collName), id);
}
/**
* 通过ID删除文档
* @param coll 集合
* @param id id
* @return
*/
public static int deleteDocumentById(MongoCollection<Document> coll, String id) {
ObjectId _id = null;
try {
_id = new ObjectId(id);
} catch (Exception e) {
return 0;
}
Bson filter = Filters.eq("_id", _id);
return deleteDocument(coll, filter);
}
/**
* 通过ID删除文档
* @param dbName 库名
* @param collName 集合名
* @param filter 查询条件
* @return
*/
public static int deleteDocument(String dbName, String collName, Bson filter) {
return deleteDocument(findCollection(dbName, collName), filter);
}
/**
* 通过ID删除文档
* @param coll 集合
* @param filter 查询条件
* @return
*/
public static int deleteDocument(MongoCollection<Document> coll, Bson filter) {
int count = 0;
DeleteResult deleteResult = coll.deleteOne(filter);
count = (int) deleteResult.getDeletedCount();
return count;
}
/**
* 查找对象 - 根据主键_id
* @param dbName 库名
* @param collName 集合名
* @param id
* @return
*/
public static Document findDocumentById(String dbName, String collName, String id) {
return findDocumentById(findCollection(dbName, collName), id);
}
/**
* 查找对象 - 根据主键_id
* @param collection 集合
* @param id
* @return
*/
public static Document findDocumentById(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;
}
/**
* 查找所有文档
* @param dbName 库名
* @param collName 集合名
* @return
*/
public static List<Document> findAllDocument(String dbName, String collName) {
return findAllDocument(findCollection(dbName, collName));
}
/**
* 查找所有文档
* @param coll 集合文档
* @return
*/
public static List<Document> findAllDocument(MongoCollection<Document> coll) {
Bson orderBy = new BasicDBObject("_id", -1);
MongoCursor<Document> mongoCursor = coll.find().sort(orderBy).iterator();
List<Document> result = new ArrayList<Document>();
while(mongoCursor.hasNext()){
result.add(mongoCursor.next());
}
return result;
}
/**
* 查找所有文档
* @param dbName 库名
* @param collName 集合名
* @param orderBy 排序条件
* @return
*/
public static List<Document> findAllDocument(String dbName, String collName, Bson orderBy) {
return findAllDocument(findCollection(dbName, collName),orderBy);
}
/**
* 查找所有文档
* @param coll 集合文档
* @param orderBy 排序条件
* @return
*/
public static List<Document> findAllDocument(MongoCollection<Document> coll, Bson orderBy) {
MongoCursor<Document> mongoCursor = coll.find().sort(orderBy).iterator();
List<Document> result = new ArrayList<Document>();
while(mongoCursor.hasNext()){
result.add(mongoCursor.next());
}
return result;
}
/**
* 根据条件查找文档
* @param dbName 库名
* @param collName 集合名
* @param filter 查询条件
* @return
*/
public static List<Document> findDocument(String dbName, String collName, Bson filter) {
return findDocument(findCollection(dbName, collName), filter);
}
/**
* 根据条件查找文档
* @param coll 集合文档
* @param filter 查询条件
* @return
*/
public static List<Document> findDocument(MongoCollection<Document> coll, Bson filter) {
Bson orderBy = new BasicDBObject("_id", -1);
MongoCursor<Document> mongoCursor = coll.find(filter).sort(orderBy).iterator();
List<Document> result = new ArrayList<Document>();
while(mongoCursor.hasNext()){
result.add(mongoCursor.next());
}
return result;
}
/**
* 根据条件查找文档
* @param dbName 库名
* @param collName 集合名
* @param filter 查询条件
* @param orderBy 排序条件
* @return
*/
public static List<Document> findDocument(String dbName, String collName, Bson filter, Bson orderBy) {
return findDocument(findCollection(dbName, collName), filter, orderBy);
}
/**
* 根据条件查找文档
* @param coll 集合文档
* @param filter 查询条件
* @param orderBy 排序条件
* @return
*/
public static List<Document> findDocument(MongoCollection<Document> coll, Bson filter, Bson orderBy) {
MongoCursor<Document> mongoCursor = coll.find(filter).sort(orderBy).iterator();
List<Document> result = new ArrayList<Document>();
while(mongoCursor.hasNext()){
result.add(mongoCursor.next());
}
return result;
}
/**
* 分页查询文档
* @param dbName 库名
* @param collName 集合名
* @param filter 条件查询
* @param orderBy 排序查询
* @param pageNo 页数
* @param pageSize 每页数量
* @return
*/
public static List<Document> findDocumentByPage(String dbName, String collName, Bson filter, Bson orderBy, int pageNo, int pageSize) {
return findDocumentByPage(findCollection(dbName, collName), filter, orderBy, pageNo, pageSize);
}
/**
* 分页查询文档
* @param coll 集合文档
* @param filter 条件查询
* @param orderBy 排序查询
* @param pageNo 页数
* @param pageSize 每页数量
* @return
*/
public static List<Document> findDocumentByPage(MongoCollection<Document> coll, Bson filter, Bson orderBy, int pageNo, int pageSize) {
if(orderBy == null) orderBy = new BasicDBObject("_id", -1);
MongoCursor<Document> mongoCursor = coll.find(filter).sort(orderBy).skip((pageNo - 1) * pageSize).limit(pageSize).iterator();
List<Document> result = new ArrayList<Document>();
while(mongoCursor.hasNext()){
result.add(mongoCursor.next());
}
return result;
}
}
文件
@SuppressWarnings("deprecation")
public class MonogoGridFSUtil extends MongoDBUtil {
GridFS gridFS = null;
public MonogoGridFSUtil(String dbName) {
DB db = MongoDBUtil.getMongoClient().getDB(dbName);
gridFS = new GridFS(db);
}
/**
* 将文件保存在MongoDB中
* @param file 文件
* @return 是否成功
*/
public boolean write(File file){
return write(file.getAbsolutePath(), file.getName());
}
/**
* 将文件保存在MongoDB中
* @param filePath 文件地址
* @param fileName 文件名
* @return 是否成功
*/
public boolean write(String filePath, String fileName){
File file =new File(filePath+"/"+fileName);
if(!file.exists()) return false;
try {
Object id = System.currentTimeMillis();
DBObject query = new BasicDBObject("_id", id);
GridFSDBFile gridFSDBFile = gridFS.findOne(query);
if(gridFSDBFile == null){
GridFSInputFile gridFSInputFile = gridFS.createFile(file);
gridFSInputFile.setId(id);
gridFSInputFile.setFilename(fileName);
gridFSInputFile.save();
}
} catch(Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 将保存在MongoDB中的文件输出到指定地址
* @param filePath 文件地址
* @param fileName 文件名
* @return 是否成功
*/
public boolean read(String filePath, String fileName){
GridFSDBFile gridFSDBFile = getByFileName(fileName);
return read(gridFSDBFile, filePath, fileName);
}
/**
* 将保存在MongoDB中的文件输出到指定地址
* @param gridFSDBFile DB文件
* @param filePath 文件地址
* @param fileName 文件名
* @return 是否成功
*/
public boolean read(GridFSDBFile gridFSDBFile, String filePath, String fileName){
if(gridFSDBFile != null){
try {
gridFSDBFile.writeTo(new FileOutputStream(filePath+"/"+fileName));
} catch(Exception e) {
e.printStackTrace();
return false;
}
return true;
}
return false;
}
/**
* 据id返回文件
* @param id
* @return
*/
public GridFSDBFile getById(Object id){
DBObject query = new BasicDBObject("_id", id);
GridFSDBFile gridFSDBFile = gridFS.findOne(query);
return gridFSDBFile;
}
/**
* 据文件名返回文件,只返回第一个
* @param fileName
* @return
*/
public GridFSDBFile getByFileName(String fileName){
DBObject query = new BasicDBObject("filename", fileName);
GridFSDBFile gridFSDBFile = gridFS.findOne(query);
return gridFSDBFile;
}
/**
* 根据文件名删除文件
* @param fileName 文件名
* @return
*/
public void deleteByFileName(String fileName){
gridFS.remove(fileName);
}
/**
* 根据文件Id删除文件
* @param id 文件Id
* @return
*/
public void deleteByFileId(String id){
gridFS.remove(id);
}
}
测试添加
public class TestAdd {
String dbName = "Demo_NoSql";
String collName = "hqTest";
// @Test
public void addCollection() {
MongoDocumentUtil.createCollection(dbName, collName);
}
@Test
public void addDocument() {
Document document = new Document("name", "heqing").
append("age", 27).
append("e_mail", "975656343@qq.com").
append("address", "安徽/安庆");
MongoDocumentUtil.addDocument(dbName, collName, document);
List<Document> documents = new ArrayList<>();
Document document1 = new Document("name", "heqing1").
append("age", 26).
append("e_mail", "975656343@qq.com").
append("address", "安徽/安庆");
Document document2 = new Document("name", "heqing2").
append("age", 27).
append("e_mail", "975656343@qq.com").
append("address", "安徽/安庆");
documents.add(document1);documents.add(document2);
MongoCollection<Document> colls = MongoDocumentUtil.findCollection(dbName, collName);
MongoDocumentUtil.addDocument(colls, documents);
}
}