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

Hibernate 3 學習筆記(十四):Blob 與 Clob 大物件映射實戰

     編輯:Java 相關知識

資料庫準備

CREATE TABLE user (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL DEFAULT '',
    age INT,
    photo BLOB,          -- 二進位資料:圖片、檔案
    resume TEXT          -- 大量文字:履歷、文章(MySQL 用 TEXT 對應 Clob)
);
-- 大檔案建議用 MEDIUMBLOB / LONGBLOB

實體類別:直接使用 java.sql.Blob / Clob

public class User {
    private Integer id;
    private String name;
    private Integer age;
    private Blob photo;
    private Clob resume;
    // getter/setter ...
}

映射檔

<property name="photo" column="photo" type="java.sql.Blob"/>
<property name="resume" column="resume" type="java.sql.Clob"/>

核心操作:Hibernate 工具類建立 Blob/Clob

儲存:

FileInputStream fis = new FileInputStream("c:\\sunset.jpg");
Blob photo = Hibernate.createBlob(fis);        // 從 InputStream 建立 Blob
Clob resume = Hibernate.createClob("履歷文字內容..."); // 從 String 建立 Clob

User user = new User();
user.setName("shenbin");
user.setAge(28);
user.setPhoto(photo);
user.setResume(resume);
session.save(user);

讀取:

User user = (User) session.load(User.class, 1);

// Clob 讀取
String text = user.getResume().getSubString(1, (int) user.getResume().length());

// Blob 讀取並存檔
InputStream is = user.getPhoto().getBinaryStream();
FileOutputStream fos = new FileOutputStream("c:\\sunset_save.jpg");
byte[] buf = new byte[1024];
int len;
while ((len = is.read(buf)) != -1) {
    fos.write(buf, 0, len);
}
is.close(); fos.close();

資料庫差異提醒

  • MySQL:BLOB/TEXT 直接支援,上述代碼即可運作。
  • Oracle:BLOB/CLOB 操作較複雜,需透過 oracle.sql.BLOB、DBMS_LOB 套件,且常需在交易中處理。建議參考專門的 Oracle 大物件處理文件。
  • PostgreSQL:使用 BYTEA / TEXT,Hibernate 映射類型為 binary / text 或 materialized_blob / materialized_clob。

最佳實踐建議

  1. **大檔案勿直接存資料庫**,建議存檔案系統/物件儲存,資料庫只存路徑/URL。
  2. 若必須存 DB,確保連線池、JVM Heap 足夠大,避免 OOM。
  3. 使用 @Lob 註解(JPA)可簡化映射,Hibernate 自動對應 Blob/Clob。
  4. 讀取大物件時採用流式處理,切勿一次性載入記憶體。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved