jdbc 如何處理Blob型別欄位的資料
阿新 • • 發佈:2018-11-28
jdbc處理大物件Blob
在貼程式碼之前先講一下什麼是LOB大物件資料
LOB 大物件 是用來儲存大量的二進位制和文字資料的一種資料型別(一個LOB欄位可儲存多達 4GB的資料)
LOB分類兩種型別:
- (1)內部,
- (2)外部
內部LOB將資料是已位元組流的形式儲存再資料庫的內部,因而LOB的許多操作都可以參與事務,也可以像處理普通資料一樣對其進行備份和恢復操作。
內部三種類型:
- (1)BLOB(二進位制資料,用於儲存影象,視訊,檔案等),
- (2)CLOB(單位元組字元資料,用於儲存超長的文字資料)
- (3)NCLOB(多位元組字元資料,用於儲存超長的文字資料)
注意: 使用jdbc 向資料庫插入BLOB型別的資料時必須使用 prepareStatement
強制分割線
列子1:是從一個數據庫中的表(帶有Blob型別)中資料匯入進另一張表(帶有Blob型別)
這裡的關鍵點就是位元組流。
public static void main(String[] args) throws SQLException, IOException { /** * 從一個庫移到另一個庫 * **/ String url = "XXXXXXXXX"; String driver = ""; String username = "XXXXXX"; String password = "XXXXXX"; Connection con = null; PreparedStatement ps = null; InputStream input = null; OutputStream osM = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } try { con = DriverManager.getConnection(url, username, password); con.setAutoCommit(false);//關閉自動提交 String MuSql = "select image from sys_image where user_id = 'icc'"; ps = con.prepareStatement(MuSql); ResultSet rs = ps.executeQuery(); BLOB blob = null; while (rs.next()) { blob = (BLOB)rs.getBlob("image"); } input = blob.getBinaryStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] b = new byte[1024]; int l = 0 ; while((l = input.read(b)) != -1) { baos.write(b, 0, l); } String updateSql = "insert into sys_image_test values('yzy',?,sysdate)"; ps = con.prepareStatement(updateSql); ps.setBytes(1, baos.toByteArray()); ps.executeUpdate(); input.close(); baos.close(); con.commit(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); con.rollback(); }finally { if (con != null) { con.close(); } if (ps != null) { ps.close(); } } }
例子2:下載圖片
public static void main(String[] args) throws SQLException { /** * 下載圖片 * **/ String url = "jdbc:oracle:thin:@192.168.0.25:1521:orcl"; String driver = ""; String username = "bjsc"; String password = "bjsc"; Connection con = null; PreparedStatement ps = null; InputStream input = null; OutputStream osM = null; int i = 0; try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } try { con = DriverManager.getConnection(url, username, password); String MuSql = "select image from sys_image"; ps = con.prepareStatement(MuSql); ResultSet rs = ps.executeQuery(); BLOB blob = null; while (rs.next()) { blob = (BLOB)rs.getBlob("image"); //下載路徑 String filePath = "F:/img/"+i+".jpg"; InputStream in = blob.getBinaryStream(); FileOutputStream out = new FileOutputStream(filePath); int l = (int)blob.length(); byte buffer[] = new byte[l]; while((l = in.read(buffer))!= -1) { out.write(buffer, 0, l); } out.close(); in.close(); i++; } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally { if (con != null) { con.close(); } if (ps != null) { ps.close(); } } }