1. 程式人生 > >java操作mongodb工具類

java操作mongodb工具類

新建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;
	}

}