CLOB主要保存海量文字,而BLOB是專門保存二進制數據:包括,圖片,音樂,影片。等。
在MYSQL中,BLOB類型使用LONGBLOB聲明,最高可存儲4G內容。
創建一個表:
create table userblob ( id int(4) primary key not null auto_increment, name varchar(30), photo longblob );
代碼:
package 類集; import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import java.sql.PreparedStatement ; import java.io.File ; import java.io.FileInputStream ; import java.io.InputStream ; public class BlobDemo01{ // 定義MySQL的數據庫驅動程序 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; // 定義MySQL數據庫的連接地址 public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ; // MySQL數據庫的連接用戶名 public static final String DBUSER = "root" ; // MySQL數據庫的連接密碼 public static final String DBPASS = "aaaaaa" ; public static void main(String args[]) throws Exception{ // 所有異常拋出 Connection conn = null ; // 數據庫連接 PreparedStatement pstmt = null ; String name = "小華" ; String sql = "INSERT INTO userblob(name,photo) VALUES (?,?) " ; Class.forName(DBDRIVER) ; // 加載驅動程序 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ; pstmt = conn.prepareStatement(sql) ; File f = new File("d:" + File.separator + "圖片1.JPG") ; // 圖片文件 InputStream input = null ; input = new FileInputStream(f) ; pstmt.setString(1,name) ; // 設置第一個“?”的內容 pstmt.setBinaryStream(2,input,(int)f.length()) ; // 設置輸入流 pstmt.executeUpdate() ; // 更新數據庫 pstmt.close() ; conn.close() ; // 數據庫關閉 } };
查詢執行結果:
圖片肯定是無法查詢出來的,所以應該將圖片讀取出來,另存一個其他文件。
package 類集; import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.PreparedStatement ; import java.io.File ; import java.io.FileOutputStream ; import java.sql.ResultSet ; import java.io.InputStream ; import java.io.OutputStream ; public class BlobDemo01{ // 定義MySQL的數據庫驅動程序 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; // 定義MySQL數據庫的連接地址 public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ; // MySQL數據庫的連接用戶名 public static final String DBUSER = "root" ; // MySQL數據庫的連接密碼 public static final String DBPASS = "aaaaaa" ; public static void main(String args[]) throws Exception{ // 所有異常拋出 Connection conn = null ; // 數據庫連接 PreparedStatement pstmt = null ; ResultSet rs = null ; int id = 1 ; String sql = "SELECT name,photo FROM userblob WHERE id=?" ; Class.forName(DBDRIVER) ; // 加載驅動程序 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ; pstmt = conn.prepareStatement(sql) ; pstmt.setInt(1,id) ; rs = pstmt.executeQuery() ; // 執行查詢 if(rs.next()){ String name = rs.getString(1) ; System.out.println("姓名:" + name) ; InputStream input = rs.getBinaryStream(2) ; File f = new File("d:" + File.separator + "load圖片1.gif") ; // 圖片文件 OutputStream out = null ; out = new FileOutputStream(f) ; int temp = 0 ; while((temp=input.read())!=-1){ // 邊讀邊寫 out.write(temp) ; } input.close() ; out.close() ; } pstmt.close() ; conn.close() ; // 數據庫關閉 } };
處理后,在D文件夾中發現文件,表示,讀取成功。
以上程序是通過IO的操作流讀取的
為了方便讀取,JAVA專門的提供了BLOB類進行二進制文件的讀取操作。
BLOB類
BLOB類提供了以下方法:
操作范例代碼如下:
package 類集; import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import java.sql.PreparedStatement ; import java.sql.Blob ; import java.sql.ResultSet ; import java.io.File ; import java.io.FileOutputStream ; import java.io.InputStream ; import java.io.OutputStream ; public class BlobDemo01{ // 定義MySQL的數據庫驅動程序 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; // 定義MySQL數據庫的連接地址 public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ; // MySQL數據庫的連接用戶名 public static final String DBUSER = "root" ; // MySQL數據庫的連接密碼 public static final String DBPASS = "aaaaaa" ; public static void main(String args[]) throws Exception{ // 所有異常拋出 Connection conn = null ; // 數據庫連接 PreparedStatement pstmt = null ; ResultSet rs = null ; int id = 1 ; String sql = "SELECT name,photo FROM userblob WHERE id=?" ; Class.forName(DBDRIVER) ; // 加載驅動程序 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ; pstmt = conn.prepareStatement(sql) ; pstmt.setInt(1,id) ; rs = pstmt.executeQuery() ; // 執行查詢 if(rs.next()){ String name = rs.getString(1) ; System.out.println("姓名:" + name) ; Blob b = rs.getBlob(2) ; File f = new File("d:" + File.separator + "load圖片2.gif") ; // 圖片文件 OutputStream out = null ; out = new FileOutputStream(f) ; out.write(b.getBytes(1,(int)b.length())) ; out.close() ; } pstmt.close() ; conn.close() ; // 數據庫關閉 } };
操作結果:
發現成功讀取並創建了文件。
使用BLOB會比較簡單一些,但是從實際角度,把大文件存在數據庫中是很不明智行為。往往采用映射路徑方式完成。