處理大型物件(LOB)

在 Java 中查詢 PostgreSQL 資料庫

Miller Trujillo

Staff Software Engineer

資料庫中的大型物件

  • BLOB:Binary Large Object(影像、影片、PDF)
  • CLOB:Character Large Object(長文字、XML、JSON)

BLOB 與 CLOB 示意

在 Java 中查詢 PostgreSQL 資料庫

為什麼用 BLOB 與 CLOB?

  • VARCHAR 適合小型資料
  • BLOB 與 CLOB 用於超大型內容
  • 支援串流:分段讀寫

類比——串流播放電影

在 Java 中查詢 PostgreSQL 資料庫

在 Java 中寫入 BLOB

String sql = "INSERT INTO covers (book_id, image) VALUES (?, ?)";


try (PreparedStatement pstmt = conn.prepareStatement(sql); FileInputStream fis = new FileInputStream("cover.png")) {
pstmt.setInt(1, 101);
pstmt.setBinaryStream(2, fis);
pstmt.executeUpdate();
}
  • INSERT-將新列加入資料表
  • setBinaryStream()-將位元資料串流寫入 BLOB 欄位
在 Java 中查詢 PostgreSQL 資料庫

在 Java 中寫入 CLOB

String sql = "INSERT INTO manuscripts (book_id, content) VALUES (?, ?)";

try (PreparedStatement pstmt = conn.prepareStatement(sql);

FileReader reader = new FileReader("manuscript.txt")) {
pstmt.setInt(1, 101);
pstmt.setCharacterStream(2, reader);
pstmt.executeUpdate();
}

setCharacterStream()-將文字資料串流寫入 CLOB 欄位

在 Java 中查詢 PostgreSQL 資料庫

在 Java 中讀取 LOB

  • InputStream 讀位元組;Reader 讀字元
  • BLOB:getBinaryStream() 會回傳 InputStream
  • CLOB:getCharacterStream() 會回傳 Reader
String sql = "SELECT image FROM covers WHERE book_id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
    pstmt.setInt(1, 101);
    try (ResultSet rs = pstmt.executeQuery()) {

if (rs.next()) {
try (InputStream is = rs.getBinaryStream("image");
FileOutputStream fos = new FileOutputStream("out.png")){
is.transferTo(fos);
} } } }
在 Java 中查詢 PostgreSQL 資料庫

用 Reader 讀取 CLOB

String sql = "SELECT content FROM manuscripts";
try (PreparedStatement pstmt = conn.prepareStatement(sql);
     ResultSet rs = pstmt.executeQuery()) {

while (rs.next()) {
try (Reader reader = rs.getCharacterStream("content")) {
char[] cb = new char[30];
reader.read(cb); // Chars from 0 to 29
reader.read(cb); // Chars from 30 to 59: } } }
在 Java 中查詢 PostgreSQL 資料庫

LOB 最佳實務

  • 📂 優先儲存參照(如 URL 或路徑)
  • ⏩ 使用串流 API(setBinaryStream()getBinaryStream()setCharacterStream()
  • 🚫 避免頻繁更新超大型物件

$$

$$

大型物件示意

在 Java 中查詢 PostgreSQL 資料庫

一起來練習吧!

在 Java 中查詢 PostgreSQL 資料庫

Preparing Video For Download...