CLOB(Character Large Object)用於存儲超長文本(>4000 字符)。本文提供完整的 JDBC 操作 CLOB 代碼,涵蓋連接構建、PreparedStatement 綁定、流式寫入/讀取、資源管理,可直接用於生產環境。
CREATE TABLE article_add (
id VARCHAR2(32) PRIMARY KEY,
content CLOB,
modify_date DATE DEFAULT SYSDATE
);
package com.example.lob;
import java.io.*;
import java.sql.*;
import oracle.sql.CLOB;
public class ClobDemo {
// 連接配置
private static final String URL = "jdbc:oracle:thin:@218.56.105.30:1521:myora";
private static final String USER = "skgl";
private static final String PWD = "skgl";
public void insertClob() {
String sql = "INSERT INTO article_add (id, content, modify_date) VALUES ('7', ?, SYSDATE)";
String bigText = "這是要插入到 CLOB 裡面的超長文本內容..."; // 可為超大字符串
try (Connection conn = DriverManager.getConnection(URL, USER, PWD);
PreparedStatement stmt = conn.prepareStatement(sql)) {
// 方式 1:直接 setString(適用於中小文本,驅動自動轉 CLOB)
stmt.setString(1, bigText);
stmt.executeUpdate();
// 方式 2:流式寫入(超大文本,避免內存 OOM)
/*
CLOB clob = CLOB.createTemporary(conn, true, CLOB.DURATION_SESSION);
try (Writer writer = clob.getCharacterOutputStream()) {
writer.write(bigText); // 或分塊讀取文件流寫入
}
stmt.setClob(1, clob);
stmt.executeUpdate();
clob.freeTemporary();
*/
} catch (SQLException e) {
e.printStackTrace();
}
}
public void readClob() {
String sql = "SELECT content FROM article_add WHERE id = '7'";
try (Connection conn = DriverManager.getConnection(URL, USER, PWD);
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
// 方式 1:getString(小文本)
String text = rs.getString("content");
System.out.println(text);
// 方式 2:流式讀取(大文本)
/*
Clob clob = rs.getClob("content");
try (Reader reader = clob.getCharacterStream();
BufferedReader br = new BufferedReader(reader)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
*/
}
} catch (SQLException | IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new ClobDemo().insertClob();
new ClobDemo().readClob();
}
}
| 場景 | 推薦 API | 說明 |
|---|---|---|
| 中小文本(< 1MB) | setString / getString | 驅動自動處理 CLOB 轉換,代碼最簡潔 |
| 大文本/文件導入 | CLOB.createTemporary + getCharacterOutputStream | 流式寫入,常駐內存小,支持分塊 |
| 大文本讀取 | getClob + getCharacterStream | 流式讀取,避免一次性載入內存 |
| 二進制大對象 | BLOB + getBinaryStream | 圖片/文件存儲,同理 |
jdbc:oracle:thin:@218.56.105.30:1521:myora
│ │ │ │ │
│ │ │ │ └─ Service Name (或 SID)
│ │ │ └─ Port (默認 1521)
│ │ └─ Host IP
│ └─ Thin 驅動(純 Java,無需 Client)
└─ JDBC 協議前綴
setClob(1, reader, length) 更簡潔。freeTemporary(),否則臨時段洩漏。