Hibernate中的一些注意事项

正在学习夏昕的<<深入浅出Hibernate>> 摘录的一些使用hibernate注意的事项.
[list]1.Oracle Blob/Clob字段本身拥有一个游标,JDBC必须通过游标对Blob/Clob字段进行操作,在Blob/Clob被创建之前,我们无法获取其游标句柄,这也就意味着,我们必须首先创建一个空的Blob/Clob字段,再从这个空的字段获取Blob/Clob游标,写入我们所期望的保存的数据.
如果用JDBC代码来表示这个过程,则代码入下:(假设photo与resume分别对应Blob和Clob)
//插入的数据,BLOB与CLOB字段为空值.
...
dbConnection.setAutoCommit(false);
PreparedStatement preStmt=dbConnection.preparedStatement("insert into users(id,name,age,photo,resume) values(?,?,?,?)");
...
preStmt.setInt(1,5);
preStmt.setBlob(4,oracle.sql.BLOB.empty_lob());
preStmt.setClob(5,oracle.sql.CLOB.empty_lob());
preStmt.executeUpdate();
preStmt.close();
//再次从库表中读出,获得BLOB与CLOB
preStmt=dbConnection.preparedStatement("select photo,resume from
users where id=? for update");
preStmt.set(1,5);
ResultSet rs=preStmt.executeQuery();
rs.next();
oracle.sql.BLOB imgBlob=(oracle.sql.BLOB)rs.getBlob(1);
oracle.sql.CLOB resumClob=(oracle.sql.CLOB)rs.getClob(2);

//将二进制数据写入imgBlob
FileInputStream fis=new FileInputStream("c\xyz.img");
OutputStream ops=imgBlob.getBinaryOutputStream();
byte[] buffer=new byte[10240];
int len;
while((len=fis.read(buffer))>0){
ops.write(buffer);
}
fis.close;
ops.close;
//将字符串写入resumClob
resumClob.putString(1,"This is my clob");

//将BLOB/CLOB数据更新到数据库
preStmt=dbConnection.preparedStatement("update users set photo=? resume=? where id=?");
preStmt.setBlob(1,imgBlob);
preStmt.setClob(2,resumBlob);
preStem.setInt(3,5);
preStmt.executeUpdate();
preStmt.close();
dbConnection.commit();
dbConnection.close();
...
由于Hibernate的底层数据库访问机制依然是基于JDBC的实现;因此,在Hibernate对CLOB以及BLOB字段的处理方式与JDBC相似.
a.插入的数据,BLOB与CLOB字段为空值.
b.再次从库表中读出,获得BLOB与CLOB
c.将BLOB/CLOB数据更新到数据库
[/list]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值