| 資料庫 | CLOB 類型 | BLOB 類型 |
|---|---|---|
| MySQL | TEXT | BLOB |
| DB2 / Oracle | CLOB | BLOB |
String 或 java.sql.Clobbyte[] 或 java.sql.Blob<property name="clobField" type="clob"/>
<property name="blobField" type="binary"/>
也可直接使用資料庫專屬類型,如 oracle.sql.Clob、oracle.sql.Blob。
操作 CLOB/BLOB 需兩步驟:先插入空值鎖定行,再更新大物件內容。
conn.setAutoCommit(false);
// 1. 插入空 CLOB
String sql = "INSERT INTO file(name, file_content) VALUES('jack', EMPTY_CLOB())";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.executeUpdate();
// 2. 鎖定該行並取得 Clob 物件
sql = "SELECT file_content FROM file WHERE name='jack' FOR UPDATE";
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
oracle.sql.Clob clob = (oracle.sql.Clob) rs.getClob(1);
java.io.OutputStream writer = clob.getAsciiOutputStream();
byte[] data = newFileContent.getBytes();
writer.write(data);
writer.flush();
writer.close();
}
pstmt.close();
oracle.sql.Clob clob = rs.getClob("file_content");
if (clob != null) {
Reader is = clob.getCharacterStream();
BufferedReader br = new BufferedReader(is);
String line;
while ((line = br.readLine()) != null) {
content += line + "<br>";
}
}
conn.setAutoCommit(false);
String sql = "INSERT INTO photo(name, photo) VALUES('jack', EMPTY_BLOB())";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.executeUpdate();
sql = "SELECT photo FROM photo WHERE name='jack' FOR UPDATE";
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
oracle.sql.Blob blob = (oracle.sql.Blob) rs.getBlob(1);
File file = new File("c:\\test.rar");
FileInputStream fin = new FileInputStream(file);
OutputStream out = blob.getBinaryOutputStream();
byte[] buffer = new byte[blob.getBufferSize()];
int count;
while ((count = fin.read(buffer)) != -1) {
out.write(buffer, 0, count);
}
fin.close();
out.close();
}
MyFile file = new MyFile();
file.setName("jack");
file.setContent(session.getLobHelper().createClob("")); // 建立空 CLOB
session.save(file);
session.flush();
session.refresh(file, LockMode.UPGRADE); // 鎖定
oracle.sql.Clob clob = (oracle.sql.Clob) file.getContent();
Writer pw = clob.getCharacterOutputStream();
pw.write(longText); // 寫入長文本
pw.close();
session.close();
Photo photo = new Photo();
photo.setName("jack");
photo.setPhoto(session.getLobHelper().createBlob(new byte[0])); // 空 BLOB
session.save(photo);
session.flush();
session.refresh(photo, LockMode.UPGRADE);
oracle.sql.Blob blob = (oracle.sql.Blob) photo.getPhoto();
OutputStream out = blob.getBinaryOutputStream();
File f = new File("c:\\test.rar");
FileInputStream fin = new FileInputStream(f);
byte[] data = new byte[(int) fin.available()];
fin.read(data);
out.write(data);
fin.close();
out.close();
session.flush();
setAutoCommit(false))以支援大物件操作。EMPTY_CLOB()/EMPTY_BLOB() 初始化,並以 FOR UPDATE 鎖定行。LobHelper 建立空大物件,再透過 refresh(..., LockMode.UPGRADE) 取得實體鎖定。flush()。