CLOB(Character Large Object)用於存儲超過 VARCHAR 上限的大文本。JDBC 操作 CLOB 需使用 java.sql.Clob 接口,而非直接 setString。
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();
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());
}
con.setAutoCommit(false) 必不可少。InputStream/Reader,避免連接洩漏。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 或自行實現
}
}
}