Hibernate中的一些注意事项

    正在学习夏昕的<<深入浅出Hibernate>> 摘录的一些使用hibernate注意的事项.
    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数据更新到数据库

你可能感兴趣的:(oracle,sql,c,Hibernate,jdbc)