JDBC--處理Blob


1、LOB(Large Objects)大對象,是用來存儲大量的二進制和文本數據的一種數據類型(一個LOB字段可存儲多達4GB的數據)

--LOB分類兩種類型:1)內部LOB; 2)外部LOB:

  --內部LOB將數據已字節流的形式存儲在數據庫的內部。因而,內部LOB的許多操作都可以參與事務,也可以像處理普通數據一樣對其進行備份和恢復操作;

    --Oracle支持三種類型的內部LOB:1)BLOB(二進制數據);2)CLOB(單字節字符數據);3)NCLOB(多字節字符數據);

    --CLOB和NCLOB類型適用於存儲超長的文本數據,BLOB字段適用於存儲大量的二進制數據,如圖像、視頻、文件等。

  --外部LOB:目前只支持一種外部LOB類型,即BFILE類型,該類型僅存儲數據在操作系統中的位置信息,而數據的實體以外部文件的形式存在於文件系統中。

    --BFILE類型所表示的數據都是只讀的,不參與事務。該類型可幫助用戶管理大量的由外部程序訪問的文件。

2、使用JDBC向數據庫插入BLOB類型的數據時必須使用PreparedStatement。

3、向Oracle數據庫插入Blob類型數據

public void insertBlobData(){
    Connection conn = null;
    PreparedStatement ps = null;
    String sql = "INSERT INTO customers(id, name, picture) VALUES(?,?,?)";
    try{
        conn = JDBCUtils.getConnection();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, 12345);
        ps.setString(2, "Alice");
        
        InputStream in = new FileInputStream("test.jpg");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] b = new byte[1024]; 
        int len;
        while((len = in.read(b)) != -1){
            baos.write(b, 0, len);
        }
        ps.setBytes(3, baos.toByteArray());
        
        ps.executeUpdate();
        in.close();
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        JDBCUtils.release(conn, ps, null);
    }
}

4、從Oracle數據庫中讀取Blob類型的數據並通過IO流寫入文件中:

public void readBlobData(){
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    String sql = "SELECT id, name, picture FROM customers WHERE id = ?";
    try{
        conn = JDBCUtils.getConnection();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, 12345);
        rs = ps.executeQuery();
        if(rs.next()){
            Blob blob = rs.getBlob(3);
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("out.jpg"));
            InputStream in = blob.getBinaryStream();
            byte[] b = new byte[1024];
            int len;
            while((len = in.read(b)) != -1){
                bos.write(b,0, len);
                bos.flush();
            }
            bos.close();
            in.close();
        }
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        JDBCUtils.release(conn, ps, rs);
    }
}

 


免責聲明!

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



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