周建儒
(四川信息職業技術學院信息工程系,廣元,628040)
圖片存儲有兩種方式:一種是將圖片單獨存放在固定文件夾里,數據庫表中對應的字段僅保存該圖片的路徑和名字;這種方式實現簡單,數據表中無大數據,訪問速度快,但是不安全,數據維護不方便。另一種是先對圖片進行編碼,再將編碼后的數據寫到數據庫表中,需要時再從數據庫表中讀出,然后解碼生成圖片文件;這種方式比較安全,數據維護方便靈活。本文針對這兩種方式,用程序實例進行分析和比較。
MySQL是一個小型關系型數據庫管理系統,體積小,速度快,開放源碼。Mysql支持存儲二進制文件的BLOB字段類型;BLOB是個類型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,它們可容納的最大字節數分別是255B,65K,16M,4G。
預編譯語句PreparedStatement是java.sql的一個接口,也是Statement的子接口。通過Statement對象執行SQL語句時,需要將SQL語句發送給DBMS進行編譯后再執行。而預編譯語句是在創建PreparedStatement 對象時就指定了SQL語句,并發送給DBMS進行編譯,當該編譯語句被執行時,DBMS直接運行編譯后的SQL語句,而不需要像其它SQL語句那樣先進行編譯。
預編譯語句可以提高訪問數據庫的性能,數據庫在處理SQL語句時都有一個預編譯的過程,而預編譯對象就是把一些格式固定的SQL語句編譯后存放在數據庫緩沖池中。當需要再次執行相同的SQL語句時就不再進行編譯了,直接由DBMS運行SQL語句。所以當需要多次執行Statement對象的時候,使用PreparedStatement對象可以大大降低運行時間,特別是大型數據庫,它可以有效地提高訪問數據庫的速度。
3.1.1 以二進制格式將圖片寫入photo表中


3.1.2 從photo表中讀出圖片數據,并生成圖片文件

Base64是一種基于64個可打印字符來表示二進制數據的表示方法。Base64編碼的基本原理是:將字符串按每3個8位(3*8=24bit)字節分為一組,把每個字符的ASCII碼轉換成8位二進制數,就是一組24位的字節,再把這24位分為4個6位(4*6=24bit)字節,并在每個6位的高位添加兩個0,得到4個8位的字節,然后將這4個8位的字節轉換成十進制數,然后對照Base64編碼表得到對應的編碼字符。
3.2.1 先對圖片進行Base64編碼,再將其寫入photo表中

3.2.2 從photo表中讀出圖片文件的base64編碼,解碼后重新生成圖片文件

用以上兩種方法在Mysql數據庫表中存儲同一個jpg格式的圖片,以二進制數據格式存儲占用了2562個字節,以Base64編碼格式存儲占用了3504個字節。可見,Base64編碼后的圖片數據增大,這是因為Base64編碼的數據冗余比較多,編碼后的數據長度是編碼前長度的三分之四倍。把圖片文件用base64編碼后再存入數據庫,會增大存儲空間,延長圖片訪問時間,減慢系統的響應速度。Base64編碼可用于HTTP環境下傳遞較長的標識信息。例如:在Hibernate中就把UUID編碼為一個字符串,用作HTTP表單和HTTPGETURL中的參數。
[1]Y.Daniel Liang,Java語言程序設計基礎篇[M].北京:機械工業出版社,2009.
[2]Paul DuBois,MySQL技術內幕(第4版)[M].北京:人民郵電出版社,2011.
[3]尹繼平,Java范例大全[M].北京:機械工業出版社,2009.[4]劉書倫,Java程序設計[M].北京:國防科技大學出版社,2011.