程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase教程 >> MongoDB對圖片進行CRUD操作——與JAVA結合

MongoDB對圖片進行CRUD操作——與JAVA結合

編輯:SyBase教程

MongoDB對圖片進行CRUD操作——與JAVA結合


上幾篇博客簡單對MongoDB進行了簡單介紹和如何安裝,以及在dos下是如何操作MongoDB和在安裝MongoDB中,出現了什麼錯誤,是如何解決的。當然這些都還不夠,我們還要用到實際當中去。我用MyEclipse+JDK1.7做了一個簡單的demo,來展示下MongoDB怎麼運用到實際中去。

MongoDB作為一個NoSql數據庫的代表,存取多媒體數據,應該是強項吧?那麼,在MongoDB中是如何對圖片進行CRUD操作的。

上幾篇博客中已經提到,MongoDB的文檔結構是BSON格式,BSON格式本身支持保存二進制格式的數據,所以可以把文件的二進制格式的數據直接保存到MongoDB的文檔結構中。但是一個BSON的最大長度不能超過4M,所以限制了單個文檔中能存入的最大文件不能超過4M。為了解決這個問題,MongoDB提供了“GridFS”方式,“GridFS”方式對文件操作需要引入相關jar包——mongo-java-driver-2.9.3.jar。

不多說,看實例:

 

package com.zd.mongodb.common;

import java.io.File;
import java.io.IOException;
import java.net.UnknownHostException;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;

public class MongoDBCommon {

	// 連接mongodb
	public DB MongoDbConnection() {
		Mongo m = null;
		try {
			m = new Mongo("localhost", 27017);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		DB db = m.getDB("test");
		return db;
	}

	// 保存圖片信息
	public void saveFile(String connection, String id, String file) {
		DB db = MongoDbConnection();  //獲取MongoDB的數據庫
		File imageFile = new File(file);
		GridFS gfsPhoto = new GridFS(db, connection); //connection為集合名詞
		GridFSInputFile gfsFile = null;
		try {
			gfsFile = gfsPhoto.createFile(imageFile);
		} catch (IOException e) {
			e.printStackTrace();
		}
		gfsFile.setId(id);
		gfsFile.setContentType("image/jpeg");
		gfsFile.save();

	}

	// 讀取文件
	public void readFile(String connection, String fileName) {
		DB db = MongoDbConnection();  //獲取連接
		DBCollection collection = db.getCollection(connection);  //connection為集合名稱
		String newFileName = fileName;
		GridFS gfsPhoto = new GridFS(db, connection);
		GridFSDBFile imageForOutput = gfsPhoto.findOne(newFileName);
		System.out.println(imageForOutput);  //返回數據以BSON格式體現
	}

	//根據id查詢相應文件
	public void findByObjectId(String connection, String id) {
		DB db = MongoDbConnection();
		DBCollection collection = db.getCollection(connection);
		DBObject dbObj = collection.findOne(id);
		System.out.println(dbObj);  //返回數據以BSON格式體現

	}

	// 刪除文件
	public void deleteFile(String connection,String id) {
		DB db = MongoDbConnection();
		DBCollection collection = db.getCollection(connection);
		DBObject o=collection.findOne(id);
		collection.remove(o);
	}

}

客戶端:

 

package com.zd.mongodb.common;

public class ZhudanTest {
	
	 public static void main(String[] args) throws Exception {
		 MongoDBCommon dbCommon=new MongoDBCommon();
		 String newFileName="zhudan.jpg";
	     String imageFile="D:/生活/照片/me/zhudan.jpg";
//	     String connection="photo.files";
	     String connection="photo";
	     
	     //根據id保存數據
	     String id="1111";
	     dbCommon.saveFile( connection, id, imageFile);
	     
	     //根據名稱獲取數據
//		 dbCommon.readFile(connection, newFileName);
	     
	     //根據id刪除數據
//	     String id="1111";
//	     dbCommon.deleteFile(connection,id);
		 
	     //根據id查詢數據
//		 String id="1111";
//		 dbCommon.findByObjectId(connection, id);
		 
	 }
}


 

\

再分析下原理:

 

創建photo時,驅動首先會在當前數據庫創建兩個集合:一個是"photo.files"集合,另一個是"photo.chunks"集合,前者記錄了文件名,文件創建時間,文件類型等基本信息;後者分塊存儲了文件的二進制數據(並支持加密這些二進制數據)。

一個trunk有一個默認的大小,當文件超過這個默認大小後,會把文件分割成多個chunk,再把這些chunk保存到photo.chunks中,最後再把文件信息存入到photo.files中。

在讀取文件的時候,先根據查詢條件,在photo.files中找到一個合適的記錄,得到“_id”的值,再據這個值到photo.chunks中查找所有“files_id”為“_id”的chunk,並按“n”排序,最後依次讀取chunk中“data”對象的內容,還原成原來的文件。

說到原理,我在測試的過程中,在保存圖片的時候,我需要用的集合名稱是photo,在讀取和刪除圖片的時候,我需要用的完整集合名稱是photo.files。如果此時我用集合名未photo時,查找不到相關數據。

總結:

MongoDB作為一個NoSql數據庫的代表,其實它裡面包含的東西還有很多,我所接觸到的也只是冰山一角,為以後的MongoDB的學習做一個小小的准備。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved