正在学习夏昕的<<深入浅出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]
[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]