版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/79199871
前言
1.MongoDB,是一个基于分布式文件存储的数据库,是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富、最像关系数据库的,它的特点是高性能、易部署、易使用,存储数据非常方便。在实际的项目操作中,我们不仅能用来存储各种复杂的数据类型,而且在存储文件方面的性能也尤为方便;
2.那么,本片博客则不去关注MongoDB的database、collection和document等数据类型存储方面,将侧重于MongoDB的文件存储;
3.以下是总结的一些较为简洁实用的MongoDB的增删查该的方法:
实例
import java.io.File;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;
/*
* mongoDB文件增删查工具类
* @author hqc
*
*/
public class PhotoMongoDBUtils {
private static String MONGODB_IP = "192.168.1.1";
private static int MONGODB_PORT = 27017;
private static String MONGODB_DB = "filedb";
/**
* 存储文件,返回mongodb的图片访问路径
* @param filename 文件名
* @param file 文件
* @throws Exception
*/
public static String saveFile(String filename,File file) throws Exception {
// 连接服务器
Mongo mongo = new Mongo(MONGODB_IP, MONGODB_PORT);
// 连接数据库
DB db = mongo.getDB(MONGODB_DB);
// 文件操作是在DB的基础上实现的,与表和文档没有关系
GridFS gridFS = null;
gridFS = new GridFS(db);
GridFSInputFile mongofile = gridFS.createFile(file);
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
String datetime = DateUtils.formatDate(new Date(), "yyyyMMddHHmmss");
String fileName = datetime +"_"+ filename;
// 可以再添加属性
mongofile.put("uuid", uuid);
mongofile.put("filename",fileName);
mongofile.put("time",DateUtils.getDateTime());
// 保存
mongofile.save();
String fileUrlPath = "http://"+MONGODB_IP+"/"+MONGODB_DB+"/"+fileName;
System.out.println("图片访问路径:"+fileUrlPath);
return fileUrlPath;
}
/**
* 读文件,读到磁盘上
*/
public static void readFile() throws Exception {
// 链接服务器
Mongo mongo = new Mongo();
// 连接数据库
DB db = mongo.getDB(MONGODB_DB);
GridFS gridFs = null;
gridFs = new GridFS(db);
// 查找条件
DBObject query = new BasicDBObject();
// 查询的结果:
List<GridFSDBFile> listfiles = gridFs.find(query);
GridFSDBFile gridDBFile = listfiles.get(0);
// 获得其中的文件名
// 注意 : 不是fs中的表的列名,而是根据调试gridDBFile中的属性而来
String fileName = (String) gridDBFile.get("filename");
System.out.println("从Mongodb获得文件名为:" + fileName);
File writeFile = new File("d:/" + fileName);
if (!writeFile.exists()) {
writeFile.createNewFile();
}
// 把数据写入磁盘中
//gridDBFile.writeTo("d:/a.txt");
// 写入文件中
gridDBFile.writeTo(writeFile);
}
/**
* 存储文件
*/
public String saveFileToMongo(String mondb_ip,int mondb_port,String mongodb_db,String uploadLoclPath,String fuuid,Map<String,String> map) throws Exception {
// 连接服务器
Mongo mongo = new Mongo(mondb_ip, mondb_port);
// 连接数据库
DB db = mongo.getDB(mongodb_db);
System.out.println(mongo+":"+db);
// 文件操作是在DB的基础上实现的,与表和文档没有关系
GridFS gridFS = null;
gridFS = new GridFS(db);
File readFile = new File(uploadLoclPath);
GridFSInputFile mongofile = gridFS.createFile(readFile);
//获取原文件名
String oldFilename = uploadLoclPath.substring(uploadLoclPath.lastIndexOf("\\")+1, uploadLoclPath.length());
// 可以再添加属性
mongofile.put("filename",fuuid + "-" + oldFilename);//组合新的文件名存储文件
mongofile.put("name",map.get("name").toString());
mongofile.put("time",DateUtils.getDateTime());
// 保存
mongofile.save();
return "";
}
/**
* 根据文件名,查询获取文件
*/
public boolean findFileByFilename(String mondb_ip,int mondb_port,String mongodb_db,String filename) throws Exception{
boolean flag = false;
Mongo mongo = new Mongo(mondb_ip, mondb_port);
DB db = mongo.getDB(mongodb_db);
GridFS fs =new GridFS(db);
List<GridFSDBFile> list = fs.find(filename);
if(list.size()>0)
flag = true;
return flag;
}
/**
* 根据文件名删除文件
*/
public static void delFileByFilename(String filename) throws Exception{
Mongo mongo = new Mongo(MONGODB_IP, MONGODB_PORT);
DB db = mongo.getDB(MONGODB_DB);
GridFS fs =new GridFS(db);
fs.remove(filename);
}
/**
* 查询出一个db数据库里面的所有文件
*/
public static List<GridFSDBFile> query(String mondb_ip,int mondb_port,String mongodb_db,DBObject query) throws Exception{
Mongo mongo = new Mongo(mondb_ip, mondb_port);
DB db = mongo.getDB(mongodb_db);
GridFS fs =new GridFS(db);
List<GridFSDBFile> files = fs.find(query);
return files;
}
/**
* 根据查询条件删除对应文件
*/
public static void delFileByDBObject(String mondb_ip,int mondb_port,String mongodb_db,DBObject query) throws Exception{
Mongo mongo = new Mongo(mondb_ip, mondb_port);
DB db = mongo.getDB(mongodb_db);
GridFS fs =new GridFS(db);
fs.remove(query);
}
/**
* 删除对应db的所有文件
*/
public static void delAllFile(String mondb_ip,int mondb_port,String mongodb_db) throws Exception{
Mongo mongo = new Mongo(mondb_ip, mondb_port);
DB db = mongo.getDB(mongodb_db);
GridFS fs =new GridFS(db);
DBObject query = new BasicDBObject();
List<GridFSDBFile> findList = fs.find(query);
System.out.println(findList.size());
//删除全部
for (GridFSDBFile gridFSDBFile : findList) {
System.out.println(gridFSDBFile);
fs.remove(gridFSDBFile);
}
}
/**
* main方法测试
*/
public static void main(String[] args) throws Exception {
//删除
String filename1 = "20170112102054-fire.jpg";
delFileByFilename(filename1);
//删除所有
delAllFile(MONGODB_IP,MONGODB_PORT,MONGODB_DB);
}
总结
1.MongoDB作为菲关系型数据库中的一种最像关系型数据库的数据库,很多人都比较喜欢用它结合关系型数据库,以此来达到项目实践的最优效果;
2.实践出真知,每种方法都是一些小的工具类,有需要的可以直接复制这些方法,然后实用main方法逐一去测试;
3.方法都是经过实践的,都是一些基础的方法,程序猿可根据自己的项目需求去不断深化这些方法,封装形成对自己比较有效的MongoDB工具类;