MongoDB工具類:java操作對檔案的增刪查改

塵光掠影發表於2018-01-29
版權宣告:本文為博主原創文章,如需轉載,請標明出處。 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工具類;


相關文章