处理大型对象(LOB)

在 Java 中查询 PostgreSQL 数据库

Miller Trujillo

Staff Software Engineer

数据库中的大型对象

  • BLOB:二进制大型对象(图像、视频、PDF)
  • CLOB:字符大型对象(长文本、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...