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

JDBC 處理 CLOB 大文本字段完整示例:寫入與讀取最佳實踐

     編輯:Java 程式設計入門

CLOB(Character Large Object)用於存儲超過 VARCHAR 上限的大文本。JDBC 操作 CLOB 需使用 java.sql.Clob 接口,而非直接 setString。

寫入 CLOB

Connection con = ...;
con.setAutoCommit(false);
String sql = "insert into docs(id, content) values(?, ?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1, 1001);

// 方式 1:JDBC 4.0+ createClob() + setString()
Clob clob = con.createClob();
clob.setString(1, largeTextContent); // 位置從 1 開始
ps.setClob(2, clob);

// 方式 2:setCharacterStream() 適合超大流式寫入
// ps.setCharacterStream(2, new StringReader(largeTextContent), largeTextContent.length());

ps.executeUpdate();
con.commit();

讀取 CLOB

String sql = "select content from docs where id = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1, 1001);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
    Clob clob = rs.getClob("content");
    // 方式 1:獲取輸入流逐塊讀取(推薦大文本)
    try (InputStream is = clob.getAsciiStream();
         BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
        StringBuilder sb = new StringBuilder();
        char[] buf = new char[4096];
        int len;
        while ((len = br.read(buf)) != -1) sb.append(buf, 0, len);
        String content = sb.toString();
    }
    // 方式 2:小文本可直接 getSubString()
    // String content = clob.getSubString(1, (int) clob.length());
}

關鍵注意點

  • 事務邊界:某些數據庫(Oracle)要求 CLOB 寫入在事務中完成,con.setAutoCommit(false) 必不可少。
  • 流關閉:讀取後務必關閉 InputStream/Reader,避免連接洩漏。
  • 編碼一致:寫入/讀取編碼保持一致(建議 UTF-8)。
  • MySQL:TEXT 類型可直接 setString/getString,但超過 64KB 建議用 LONGTEXT + Clob API。

工具類封裝建議

public final class ClobUtils {
    public static void setClob(PreparedStatement ps, int idx, String content) throws SQLException {
        Clob clob = ps.getConnection().createClob();
        clob.setString(1, content);
        ps.setClob(idx, clob);
    }
    public static String getClob(ResultSet rs, String col) throws SQLException, IOException {
        Clob clob = rs.getClob(col);
        if (clob == null) return null;
        try (Reader r = clob.getCharacterStream()) {
            return CharStreams.toString(r); // Guava 或自行實現
        }
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved