简介
MongoDB作为一个常用的数据库,Spring对其也进行了很好的支持,但了解Java如何原生使用对应使用Spring Data封装后的API是很有帮助的
代码示例
本篇中就简单用一个单例示例进行展示,其中对常用的方法进行简单的封装
对常用的增删改查进行了简单的封装,大致如下
import com.mongodb.client.*;
import com.mongodb.client.result.UpdateResult;
import org.apache.log4j.Logger;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.bson.types.ObjectId;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static com.mongodb.client.model.Filters.eq;
/**
* MongoDB工具类,只存在一个,使用单例模式实现,其方法使用示例在测试文档中有 MongoDBUtilTest
*/
public class MongoDBUtil {
private static final Logger logger = Logger.getLogger(MongoDBUtil.class);
private MongoClient client = null;
private MongoDatabase database = null;
/**
* 静态内部类单例模式实现
*/
private static class MySingleHandler {
private static MongoDBUtil instance = new MongoDBUtil();
}
public static MongoDBUtil getInstance(){
return MySingleHandler.instance;
}
/**
* 初始化,从配置文件中读取MongoDB地址、端口、数据库进行连接
*/
private MongoDBUtil() {
try {
String host = (String) Holder.get("mongodb.host");
String port = (String) Holder.get("mongodb.port");
String url = "mongodb://" + host + ":" + port;
client = MongoClients.create(url);
database = client.getDatabase((String) Holder.get("mongodb.database"));
logger.info("MongoDB connect successful!");
}catch (Exception e) {
System.out.println(e.getClass().getName() + ": " + e.getMessage());
}
}
/**
* 单条数据插入
* @param data 数据
* @param collectionName collection名
*/
public void addOne(Map<String, Object> data, String collectionName) {
MongoCollection<Document> collection = database.getCollection(collectionName);
collection.insertOne(new Document(data));
}
/**
* 多条数据插入
* @param maps 数据列表
* @param collectionName 集合名
*/
public void addMany(List<Map<String, Object>> maps, String collectionName) {
List<Document> documents = new ArrayList<Document>();
for(Map<String, Object> map : maps) {
documents.add(new Document(map));
}
MongoCollection<Document> collection = database.getCollection(collectionName);
collection.insertMany(documents);
}
/**
* 单条数据替换(更新),不存在时可以强制插入
* @param key 需要替换数据的字典中的key(对应MySQL表的字段名)
* @param value key对应的值(对应MySQL表的字段值)
* @param newMap 完整的新的数据
* @param collectionName collection(表)名称
* @param isInsert 如果数据库中不存在此数据,是否插入当条数据到数据库中
*/
public void replaceOne(String key, Object value, Map<String, Object> newMap, String collectionName, boolean isInsert) {
Bson filter = eq(key, value);
String mongoIdKey = "_id";
if (key.equals(mongoIdKey)) {
filter = eq(key, new ObjectId((String) value));
}
MongoCollection<Document> collection = database.getCollection(collectionName);
UpdateResult result = collection.replaceOne(filter, new Document(newMap));
if(result.getMatchedCount() == 0 && isInsert) {
MongoDBUtil.getInstance().addOne