java操作mongodb工具類
阿新 • • 發佈:2018-12-23
新建maven專案
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gm.mongoDB</groupId> <artifactId>mongoDB</artifactId> <version>0.0.1-SNAPSHOT</version> <build /> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.7</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.7</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.2</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver</artifactId> <version>3.6.3</version> </dependency> </dependencies> </project>
log4j.properties
### set log levels ### log4j.rootLogger = debug , stdout, D , E ### 輸出到控制檯 ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout ###log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n ### 輸出到日誌檔案 ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = logs/log.log log4j.appender.D.Append = true ## 輸出DEBUG級別以上的日誌 log4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n ### 儲存Debug資訊到單獨檔案 ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender ## 異常日誌檔名 log4j.appender.D.File = logs/error.log log4j.appender.D.Append = true ## 只輸出ERROR級別以上的日誌!!! log4j.appender.D.Threshold = ERROR log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n ### 儲存異常資訊到單獨檔案 ### log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File = logs/error.log log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [%p] - %m%n
MongoHelper
package com; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mongodb.MongoClient; import com.mongodb.client.MongoDatabase; public class MongoHelper { private static final Logger logger = LoggerFactory .getLogger(MongoHelper.class); static final String DBName = "mydbs"; static final String ServerAddress = "192.168.174.200"; static final int PORT = 29017; public MongoHelper() { } public MongoClient getMongoClient() { MongoClient mongoClient = null; try { // 連線到 mongodb 服務 mongoClient = new MongoClient(ServerAddress, PORT); logger.debug("Connect to mongodb successfully"); } catch (Exception e) { System.err.println(e.getClass().getName() + ": " + e.getMessage()); } return mongoClient; } public MongoDatabase getMongoDataBase(MongoClient mongoClient) { MongoDatabase mongoDataBase = null; try { if (mongoClient != null) { // 連線到資料庫 mongoDataBase = mongoClient.getDatabase(DBName); logger.debug("Connect to DataBase successfully"); } else { throw new RuntimeException("MongoClient不能夠為空"); } } catch (Exception e) { e.printStackTrace(); } return mongoDataBase; } public MongoDatabase getMongoDataBase() { MongoDatabase mongoDataBase = null; try { // 連線到資料庫 mongoDataBase = getMongoDataBase(getMongoClient()); } catch (Exception e) { e.printStackTrace(); } return mongoDataBase; } public void closeMongoClient(MongoDatabase mongoDataBase, MongoClient mongoClient) { if (mongoDataBase != null) { mongoDataBase = null; } if (mongoClient != null) { mongoClient.close(); } logger.debug("CloseMongoClient successfully"); } }
MongoDao
package com;
import java.util.List;
import java.util.Map;
import org.bson.Document;
import com.mongodb.BasicDBObject;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoDatabase;
/**
* MongoDB資料操作介面
*
*/
public interface MongoDao {
/**
* 根據id檢索文件
*
* @param db
* @param table
* @param id
* @return
* @throws Exception
*/
public Map<String, Object> queryByID(MongoDatabase db, String table,
Object id) throws Exception;
/**
* 根據doc檢索文件集合,當doc是空的時候檢索全部
*
* @param db
* @param table
* @param doc
* @return
* @throws Exception
*/
public List<Map<String, Object>> queryByDoc(MongoDatabase db, String table,
BasicDBObject doc) throws Exception;
/**
* 檢索全部返回集合
*
* @param db
* @param table
* @return
* @throws Exception
*/
public List<Map<String, Object>> queryAll(MongoDatabase db, String table)
throws Exception;
/**
* 遍歷迭代器返回文件集合
*
* @param iterable
* @return
* @throws Exception
*/
public List<Document> findIterable(FindIterable<Document> iterable)
throws Exception;
/**
* 插入文件
*
* @param db
* @param table
* @param doc
* @return
* @throws Exception
*/
public boolean insert(MongoDatabase db, String table, Document doc)
throws Exception;
/**
* 插入多條文件
*
* @param db
* @param table
* @param doc
* @return
* @throws Exception
*/
public boolean insertMany(MongoDatabase db, String table, List<Document> doc)
throws Exception;
/**
* 刪除文件
*
* @param db
* @param table
* @param doc
* @return
* @throws Exception
*/
public boolean delete(MongoDatabase db, String table, BasicDBObject doc)
throws Exception;
/**
* 刪除單條文件
*
* @param db
* @param table
* @param doc
* @return
* @throws Exception
*/
public boolean deleteOne(MongoDatabase db, String table, BasicDBObject doc)
throws Exception;
/**
* 修改文件
*
* @param db
* @param table
* @param oldDoc
* @param newDoc
* @return
* @throws Exception
*/
public boolean update(MongoDatabase db, String table, BasicDBObject oldDoc,
BasicDBObject newDoc) throws Exception;
/**
* 修改單條文件
*
* @param db
* @param table
* @param whereDoc
* @param updateDoc
* @return
* @throws Exception
*/
public boolean updateOne(MongoDatabase db, String table,
BasicDBObject whereDoc, BasicDBObject updateDoc) throws Exception;
/**
* 建立集合
*
* @param db
* @param table
* @throws Exception
*/
public void createCol(MongoDatabase db, String table) throws Exception;
/**
* 刪除集合
*
* @param db
* @param table
* @throws Exception
*/
public void dropCol(MongoDatabase db, String table) throws Exception;
}
MongoDaoImpl
package com;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.bson.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mongodb.BasicDBObject;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
/**
* MongoDB資料操作實現類
*
*/
public class MongoDaoImpl implements MongoDao {
private static final Logger logger = LoggerFactory
.getLogger(MongoDaoImpl.class);
public Map<String, Object> queryByID(MongoDatabase db, String table,
Object id) throws Exception {
MongoCollection<Document> collection = db.getCollection(table);
BasicDBObject query = new BasicDBObject("_id", id);
// DBObject介面和BasicDBObject物件:表示一個具體的記錄,BasicDBObject實現了DBObject,是key-value的資料結構,用起來和HashMap是基本一致的。
FindIterable<Document> iterable = collection.find(query);
Map<String, Object> jsonStrToMap = null;
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()) {
Document user = cursor.next();
String jsonString = user.toJson();
jsonStrToMap = JsonStrToMap.jsonStrToMap(jsonString);// 這裡用到我自己寫的方法,主要是包json字串轉換成map格式,為後面做準備,方法放在後面
}
logger.debug("檢索ID完畢,db:{},table:{},id:{} ", db.getName(), table, id);
return jsonStrToMap;
}
public List<Map<String, Object>> queryByDoc(MongoDatabase db, String table,
BasicDBObject doc) throws Exception {
MongoCollection<Document> collection = db.getCollection(table);
FindIterable<Document> iterable = collection.find(doc);
/**
* 1. 獲取迭代器FindIterable<Document> 2. 獲取遊標MongoCursor<Document>
* 3.通過遊標遍歷檢索出的文件集合
* */
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()) {
Document user = cursor.next();
String jsonString = user.toJson();
Map<String, Object> jsonStrToMap = JsonStrToMap
.jsonStrToMap(jsonString);
list.add(jsonStrToMap);
}
logger.debug("檢索doc完畢,db:{},table:{},doc:{} ", db.getName(), table,
doc.toJson());
return list;
}
public List<Map<String, Object>> queryAll(MongoDatabase db, String table) throws Exception {
MongoCollection<Document> collection = db.getCollection(table);
FindIterable<Document> iterable = collection.find();
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()) {
Document user = cursor.next();
String jsonString = user.toJson();
Map<String, Object> jsonStrToMap = JsonStrToMap
.jsonStrToMap(jsonString);
list.add(jsonStrToMap);
}
logger.debug("檢索全部完畢,db:{},table:{}", db.getName(), table);
return list;
}
public List<Document> findIterable(FindIterable<Document> iterable) throws Exception {
List<Document> list = new ArrayList<Document>();
MongoCursor<Document> cursor = iterable.iterator();
while (cursor.hasNext()) {
Document doc = cursor.next();
list.add(doc);
}
cursor.close();
return list;
}
public boolean insert(MongoDatabase db, String table, Document doc) throws Exception {
MongoCollection<Document> collection = db.getCollection(table);
collection.insertOne(doc);
long count = collection.count(doc);
if (count >= 1) {
logger.debug("文件插入成功,影響條數:{},db:{},table:{},doc:{} ", count,
db.getName(), table, doc.toJson());
return true;
} else {
logger.debug("文件插入失敗,影響條數:{},db:{},table:{},doc:{} ", count,
db.getName(), table, doc.toJson());
return false;
}
}
public boolean insertMany(MongoDatabase db, String table, List<Document> doc) throws Exception {
MongoCollection<Document> collection = db.getCollection(table);
long preCount = collection.count();
collection.insertMany(doc);
long nowCount = collection.count();
if ((nowCount - preCount) == doc.size()) {
logger.debug("文件插入成功,影響條數:{},db:{},table:{}", doc.size(),
db.getName(), table);
return true;
} else {
logger.debug("文件插入失敗,影響條數:{},db:{},table:{}",
(nowCount - preCount), db.getName(), table);
return false;
}
}
public boolean delete(MongoDatabase db, String table, BasicDBObject doc) throws Exception {
MongoCollection<Document> collection = db.getCollection(table);
DeleteResult deleteManyResult = collection.deleteMany(doc);
long deletedCount = deleteManyResult.getDeletedCount();
if (deletedCount > 0) {
logger.debug("文件刪除成功,影響條數:{},db:{},table:{},doc:{} ", deletedCount,
db.getName(), table, doc.toJson());
return true;
} else {
logger.debug("文件刪除失敗,影響條數:{},db:{},table:{},doc:{} ", 0,
db.getName(), table, doc.toJson());
return false;
}
}
public boolean deleteOne(MongoDatabase db, String table, BasicDBObject doc) throws Exception {
MongoCollection<Document> collection = db.getCollection(table);
DeleteResult deleteOneResult = collection.deleteOne(doc);
long deletedCount = deleteOneResult.getDeletedCount();
System.out.println("刪除的數量: " + deletedCount);
if (deletedCount == 1) {
logger.debug("文件刪除成功,影響條數:{},db:{},table:{},doc:{} ", deletedCount,
db.getName(), table, doc.toJson());
return true;
} else {
logger.debug("文件刪除失敗,影響條數:{},db:{},table:{},doc:{} ", 0,
db.getName(), table, doc.toJson());
return false;
}
}
public boolean update(MongoDatabase db, String table,
BasicDBObject whereDoc, BasicDBObject updateDoc) throws Exception {
MongoCollection<Document> collection = db.getCollection(table);
UpdateResult updateManyResult = collection.updateMany(whereDoc,
new Document("$set", updateDoc));
long modifiedCount = updateManyResult.getModifiedCount();
System.out.println("修改的數量: " + modifiedCount);
if (modifiedCount > 0) {
logger.debug(
"文件更新成功,影響條數:{},db:{},table:{},whereDoc:{},updateDoc:{} ",
modifiedCount, db.getName(), table, whereDoc.toJson(),
updateDoc.toJson());
return true;
} else {
logger.debug(
"文件更新成功,影響條數:{},db:{},table:{},whereDoc:{},updateDoc:{} ",
0, db.getName(), table, whereDoc.toJson(),
updateDoc.toJson());
return false;
}
}
public boolean updateOne(MongoDatabase db, String table,
BasicDBObject whereDoc, BasicDBObject updateDoc) throws Exception {
MongoCollection<Document> collection = db.getCollection(table);
UpdateResult updateOneResult = collection.updateOne(whereDoc,
new Document("$set", updateDoc));
long modifiedCount = updateOneResult.getModifiedCount();
System.out.println("修改的數量: " + modifiedCount);
if (modifiedCount == 1) {
logger.debug(
"文件更新成功,影響條數:{},db:{},table:{},whereDoc:{},updateDoc:{} ",
1, db.getName(), table, whereDoc.toJson(),
updateDoc.toJson());
return true;
} else {
logger.debug(
"文件更新成功,影響條數:{},db:{},table:{},whereDoc:{},updateDoc:{} ",
0, db.getName(), table, whereDoc.toJson(),
updateDoc.toJson());
return false;
}
}
public void createCol(MongoDatabase db, String table) throws Exception {
db.createCollection(table);
logger.debug("集合建立成功,db:{},table:{}", db.getName(), table);
}
public void dropCol(MongoDatabase db, String table) throws Exception {
db.getCollection(table).drop();
logger.debug("集合刪除成功,db:{},table:{}", db.getName(), table);
}
}
JsonStrToMap
package com;
import java.util.HashMap;
import java.util.Map;
import com.mongodb.util.JSON;
public class JsonStrToMap {
/**
* json 字串轉化為map格式
*
* @param jsonString
* @return
*/
public static Map<String, Object> jsonStrToMap(String jsonString) {
Object parseObj = JSON.parse(jsonString); // 反序列化 把json 轉化為物件
Map<String, Object> map = (HashMap<String, Object>) parseObj; // 把物件轉化為map
return map;
}
}