1. Bolb類型字段說明:
這需要你先插入一個empty的blob,這將創建一個blob的cursor,然後你再把這個empty的blob的cursor用select查詢出來,這樣通過兩步操作,你就獲得了blob的cursor,可以真正的寫入blob數據了。
2. 獲取遊標存在的問題:
代碼示例:
//PO:CardSuitInfo
public class CardSuitInfo implements Serializable {
private java.sql.Blob cardFacePicFile;
public void setCardFacePicFile(Blob cardFacePicFile) {
this.cardFacePicFile = cardFacePicFile;
}
public java.sql.Blob getCardFacePicFile() {
return this.cardFacePicFile;
}
}
//1.首先插入空的blob
cardSuitInfo.setCardFacePicFile(net.sf.hibernate.Hibernate.createBlob(new byte[1]));
session.save(cardSuitInfo);
session.flush();
//2.寫入blob
session.refresh(cardSuitInfo, LockMode.UPGRADE);// 設置鎖定級別
weblogic.jdbc.wrapper.Blob weblogicBlob = (weblogic.jdbc.wrapper.Blob) cardSuitInfo.getCardFacePicFile();
oracle.sql.BLOB oracleBlob = (oracle.sql.BLOB) weblogicBlob.getVendorObj();
OutputStream out = oracleBlob.getBinaryOutputStream();
byte[] buffer = cardSuitInfoView.getCardFacePicFileBody();
out.write(buffer, 0, buffer.length);
out.close();
session.save(cardSuitInfo);
讀取blob字段:
......
weblogic.jdbc.wrapper.Blob weblogicBlob = (weblogic.jdbc.wrapper.Blob) cardSuitInfo.getCardBackPicFile();
oracle.sql.BLOB oracleBlob = (oracle.sql.BLOB) weblogicBlob.getVendorObj();
BufferedInputStream in = new BufferedInputStream(oracleBlob.getBinaryStream());
long picLong = cardSuitInfo.getCardBackPicFile().length();
byte[] bytes = new byte[Integer.parseInt(picLong + "")];//
int result = in.read(bytes);
if (result > 0) {
downloadFileView.setFileByteArray(bytes);
}
in.close();
......
......
3.總結:
weblogic進行的封裝,使我們必須加這步轉換,如果用jdbc操作就不會出現此問題,而直接可以轉化爲oracle.sql.BLOB的對象。
重點步驟:
weblogic.jdbc.wrapper.Blob weblogicBlob = (weblogic.jdbc.wrapper.Blob) cardSuitInfo.getCardBackPicFile();
oracle.sql.BLOB oracleBlob = (oracle.sql.BLOB) weblogicBlob.getVendorObj();