首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JDBC 操作 Blob/Clob 大對象完全指南:基於 Apache Derby 的讀寫實戰

     編輯:Java 相關知識

JDBC 處理 Blob(二進制大對象)與 Clob(字符大對象)並不複雜,關鍵在於「流的轉換與傳輸」。本文以嵌入式數據庫 Apache Derby 為例,演示建表、寫入、讀取全流程,兩種流獲取方式對比,適用於 MySQL、Oracle、PostgreSQL 等主流數據庫。

環境準備

  • 下載 Derby,將 derby.jar 加入 Classpath。
  • 驅動類:org.apache.derby.jdbc.EmbeddedDriver。
  • URL 格式:jdbc:derby:dbName;create=true(自動建庫)。

建表語法

CREATE TABLE documents (
    id INT,
    text CLOB(64K),   -- 64KB 字符大對象
    photo BLOB(1440K) -- 1.4MB 二進制大對象
)

寫入:PreparedStatement + setXxxStream

File srcCode = new File("BlobClobExample.java");
File image = new File("c:/11/1.JPG");

PreparedStatement ps = conn.prepareStatement("INSERT INTO documents VALUES (?, ?, ?)");
ps.setInt(1, 250);
ps.setAsciiStream(2, new FileInputStream(srcCode), (int) srcCode.length()); // Clob
ps.setBinaryStream(3, new FileInputStream(image), (int) image.length());    // Blob
ps.execute();
conn.commit();

要點: 必須使用 PreparedStatement,傳入 InputStream 與精確長度,JDBC 驅動分塊傳輸避免 OOM。

讀取:兩種流獲取方式

方式一:ResultSet 直接獲取流(推薦簡潔)

ResultSet rs = stmt.executeQuery("SELECT text, photo FROM documents WHERE id=250");
while (rs.next()) {
    // Clob 字符流
    InputStream is = rs.getAsciiStream("text");
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String line;
    while ((line = br.readLine()) != null) System.out.println(line);
    is.close();

    // Blob 二進制流
    InputStream bis = rs.getBinaryStream("photo");
    FileOutputStream os = new FileOutputStream("11.jpg");
    int b;
    while ((b = bis.read()) != -1) os.write(b);
    os.flush(); os.close(); bis.close();
}

方式二:先獲取 Blob/Clob 對象,再調用 getXxxStream()

Clob clob = rs.getClob("text");
InputStream is = clob.getAsciiStream(); // 等價於方式一

Blob blob = rs.getBlob("photo");
InputStream bis = blob.getBinaryStream(); // 等價於方式一
long len = blob.length(); // 額外獲得長度信息

方式二適合需要操作 Blob.length()、Clob.getSubString() 等高級 API 時。

跨數據庫注意事項

數據庫驅動類大對象類型名備註
MySQLcom.mysql.cj.jdbc.DriverBLOB/TEXT/LONGBLOB/LONGTEXT需 useStreamLengthsInPrepStmts=true
Oracleoracle.jdbc.OracleDriverBLOB/CLOB需 oracle.sql.BLOB 特定 API 處理大對象
PostgreSQLorg.postgresql.DriverBYTEA/TEXT大對象需 LargeObjectManager API
SQL Servercom.microsoft.sqlserver.jdbc.SQLServerDriverVARBINARY(MAX)/VARCHAR(MAX)標準 JDBC 4.0 完美支持

核心代碼(setBinaryStream/getBinaryStream)在 JDBC 4.0+ 驅動中通用,僅建表 DDL 與特定擴展 API 有差異。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved