最近,要做个数据抓取和备份。因为抓回来的数据都是json串,而且json串还有很多层,层里面还有数组,要拆成架构化数据并持久化是非常烦的(数据表设计,各个表之间的关联复杂,拆多层的json串,写各种POJO来接收.......)。对于我这种懒人来说,最简单的就是拿到的是什么我就存什么。所以想到了用MongoDB来存抓取回来的数据。
但装个MongoDB已经把我弄得身心疲惫,怎么装我就不说了,度娘教程很多,坑也很多。装好后就是结合Java存抓取回来的数据。
我是用maven来管理依赖的,要加两个依赖:
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-mongodb -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.9.6.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.3.0</version>
</dependency>
然后就是连接MongoDB的Java代码:
public static MongoDatabase getMongoDBSession(String hostId, Integer port, String Database){
// 连接到 mongodb 服务
MongoClient mongoClient = new MongoClient( hostId , port );
// 连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase(Database);
return mongoDatabase;
}
我把它封装成一个工具类。
下面就是入库操作:
package com.xxxx.crm.Util;
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.gosuncn.crm.Controller.BaseController;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import net.sf.json.JSONObject;
public class MongoDBOps {
private static final Logger logger = LoggerFactory.getLogger(BaseController.class);
/**
*
* @param maps Map集合
* @param mongoDatabase 数据库名字
* @param collectionName 文档集合名字
*/
public static void saveHashMap(Map<String, String> maps, MongoDatabase mongoDatabase, String collectionName){
List<Document> documents = new ArrayList<Document>();//Mongo文档数据集
MongoCollection<org.bson.Document> collection = null;
// 循环存入Mongo
for (Map.Entry<String, String> entry : maps.entrySet()) { //由于拿到是数据是Map来的,我只需要值,所以循环取值放到文档List里面。
Document document = new Document(JSONObject.fromObject(entry.getValue()));//这才是重点
documents.add(document);
}
collection = mongoDatabase.getCollection(collectionName);//通过集合名获取集合,没有就自动创建一个
collection.insertMany(documents);//一次性插入多条数据,该函数无返回值。所以我不知道怎么判断是否插入成功。望大神指教
logger.info(collection+"@模块名称:"+collectionName+",总备份记录数:"+documents.size());
}
}
重点:
Document document = new Document(param);
这里的参数是要接json串的,但也可以接收JSONObject,这就方便多了。