知识大全 JDBC+Hibernate将Blob数据写入Oracle

Posted

篇首语:总有一些人路过你的人生,微不足道又无比重要。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JDBC+Hibernate将Blob数据写入Oracle相关的知识,希望对你有一定的参考价值。

JDBC+Hibernate将Blob数据写入Oracle  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Oracle的Blob字段比较特殊 他比long字段的性能要好很多 可以用来保存例如图片之类的二进制数据

  写入Blob字段和写入其它类型字段的方式非常不同 因为Blob自身有一个cursor 你必须使用cursor对blob进行操作 因而你在写入Blob之前 必须获得cursor才能进行写入 那么如何获得Blob的cursor呢?

  这需要你先插入一个empty的blob 这将创建一个blob的cursor 然后你再把这个empty的blob的cursor用select查询出来 这样通过两步操作 你就获得了blob的cursor 可以真正的写入blob数据了

  看下面的JDBC的demo 把oraclejdbc jar这个二进制文慈胧菘獗韏avatest的content字段(这是一个blob型字段)

  import java sql *;import java io *;import oracle sql *;public class WriteBlob

  public static void main(String[] args)

  try   DriverManager registerDriver(new oracle jdbc driver OracleDriver());  Connection conn = DriverManager getConnection( jdbc:oracle:thin:@localhost: :orcl fankai fankai );  conn setAutoCommit(false);

  BLOB blob = null;

  PreparedStatement pstmt = conn prepareStatement( insert into javatest(name content) values(? empty_blob()) );  pstmt setString( fankai );  pstmt executeUpdate();  pstmt close();

  pstmt = conn prepareStatement( select content from javatest where name= ? for update );  pstmt setString( fankai );  ResultSet rset = pstmt executeQuery();  if (rset next()) blob = (BLOB) rset getBlob( );

  String fileName = oraclejdbc jar ;  File f = new File(fileName);  FileInputStream fin = new FileInputStream(f);  System out println( file size = + fin available());

  pstmt = conn prepareStatement( update javatest set content=? where name=? );

  OutputStream out = blob getBinaryOutputStream();

  int count = total = ;  byte[] data = new byte[(int)fin available()];  fin read(data);  out write(data);  /*  byte[] data = new byte[blob getBufferSize()]; 另一种实现方法 节省内存  while ((count = fin read(data)) != )    total += count;   out write(data count);    */

  fin close();  out close();

  pstmt setBlob( blob);  pstmt setString( fankai );

  pstmt executeUpdate();  pstmt close();

  mit();  conn close();  catch (SQLException e)    System err println(e getMessage());  e printStackTrace();  catch (IOException e)   System err println(e getMessage()); 

  

  仔细看上例 分三步

   插入空blob

  into javatest(name content) values(? empty_blob());

   获得blob的cursor

  select content from javatest where name= ? for update;

  注意!!!必须加for update 这将锁定该行 直至该行被修改完毕 保证不产生并发冲突

   update javatest set content=? where name=

  用cursor往数据库写数据

  这里面还有一点要提醒大家

  JDK 带的JDBC 规范是不完善的 只有读Blob的接口 而没有写Blob的接口 JDK 带的JDBC 加入了写Blob的接口 你可以使用JDBC 的接口 也可以直接使用Oracle的JDBC的API 我在上例中使用了Oracle的JDBC的API

  另外要注意的是

  java sql Blob

  oracle sql BLOB

  注意看blob的大小写 是不一样的 写程序的时候不要搞混了

  下面看看用Hibernate怎么写 原理是一样的 也要分三步 但是代码简单很多

  这是Cat对象定义

  package fankai;

  import java sql Blob;

  public class Cat  private String id; private String name; private char sex; private float weight; private Blob image; public Cat()

  public String getId() return id;  public void setId(String id) this id = id;

  public String getName() return name;  public void setName(String name) this name = name;

  public char getSex() return sex;  public void setSex(char sex) this sex = sex;

  public float getWeight() return weight;  public void setWeight(float weight) this weight = weight;

  public Blob getImage() return image;  public void setImage(Blob image) this image = image; 

  这是Cat hbm xml

  <?xml version= ?><!DOCTYPE hibernate mapping SYSTEM >

  <hibernate mapping><class name= fankai Cat table= cat ><! jcs cache usage= read only / ><id name= id unsaved value= null ><generator class= uuid hex /></id><property name= name length= not null= true /><property name= sex length= not null= true /><property name= weight /><property name= image /></class></hibernate mapping>

  下面是完整的用Hibernate写入Blob的例子 相比JDBC 已经简单轻松多了 也不用写那些Oracle特殊的sql了

  package fankai;

  import java sql Blob;import net sf hibernate *;import oracle sql *;import java io *;

  public class TestCatHibernate  public static void testBlob()   Session s = null;   byte[] buffer = new byte[ ];  buffer[ ] = ;  try    SessionFactory sf = HibernateSessionFactory getSessionFactory();   s = sf openSession();    Transaction tx = s beginTransaction();   Cat c = new Cat();   c setName( Robbin );   c setImage(Hibernate createBlob(buffer));   s save(c);   s flush();   s refresh(c LockMode UPGRADE);    BLOB blob = (BLOB) c getImage();    OutputStream out = blob getBinaryOutputStream();    String fileName = oraclejdbc jar ;   File f = new File(fileName);   FileInputStream fin = new FileInputStream(f);    int count = total = ;   byte[] data = new byte[(int)fin available()];   fin read(data);   out write(data);    fin close();   out close();   s flush();   mit();

cha138/Article/program/Oracle/201311/17139

相关参考

知识大全 hibernate的性能优化

  Hibernate是对JDBC的轻量级封装因此在很多情况下Hibernate的性能比直接使用JDBC存取数据库要低然而通过正确的方法和策略在使用Hibernate的时候还是可以非常接近直接使用JD

知识大全 hibernate 经验谈2

  hibernate虽然对多种数据库进行了适应以达到前台感受不到后台的数据库类型但是在Blob和Clob这两种类型的存取方面不同的数据库有不同的实现方法这方面hibernate  

知识大全 使用Struts+Hibernate上传大对象(BLOB)

使用Struts+Hibernate上传大对象(BLOB)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 Hibernate+Spring搞定Clob、Blob的存取

Hibernate+Spring搞定Clob、Blob的存取  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 Hibernate Annotation中BLOB、CLOB注解写法

HibernateAnnotation中BLOB、CLOB注解写法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一

知识大全 Hibernate 基于JDBC的事务

Hibernate基于JDBC的事务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hibern

知识大全 Hibernate 基于JDBC的事务[1]

Hibernate基于JDBC的事务[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hib

知识大全 Hibernate 基于JDBC的事务[4]

Hibernate基于JDBC的事务[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Jav

知识大全 Hibernate 基于JDBC的事务[3]

Hibernate基于JDBC的事务[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Jav

知识大全 Hibernate 基于JDBC的事务[2]

Hibernate基于JDBC的事务[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这也就