JDBC:數據庫操作:BLOB數據處理


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會比較簡單一些,但是從實際角度,把大文件存在數據庫中是很不明智行為。往往采用映射路徑方式完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM