hibernate对Blob类型字段进行数据添加

对于MS SQL和MYSQL数据库,操作Blob字段很简单,而对于oracle数据进行操作,则要复杂些,这是因为oracle访问Blob和Clob有它独特的方式,oracle Blob/Clob字段本身有一个游标(cursor),必须要通过这个游标对Blob/Clob进行操作,在Blob/Clob未创建前,我们无法获得它们的游标句柄,因此,我们必须先得创建一个空的Blob/Clob字段值,然后再从这个空的字段值取得游标句柄,再来进行我们的操作.前面那篇文章的操作方式就是这样的,不是很清楚的,可以结合以前的那篇来看,Blob和Clob的操作方式大体上相同.

hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="hibernate.Blobtest" table="blobtest" catalog="hbtplis">
        <id name="id" type="java.lang.Long">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="images" type="java.sql.Blob">
            <column name="images" />
        </property>
        <property name="name" type="java.lang.String">
            <column name="name" />
        </property>
    </class>
</hibernate-mapping>

pojo:

package hibernate;

import java.sql.Blob;

/**
*
* @author coffee
*/

public class Blobtest implements java.io.Serializable {

private Long id;
private Blob images;
private String name;

public Blobtest() {
}

public Blobtest(Blob images, String name) {
   this.images = images;
   this.name = name;
}

public Long getId() {
   return this.id;
}

public void setId(Long id) {
   this.id = id;
}

public Blob getImages() {
   return this.images;
}

public void setImages(Blob images) {
   this.images = images;
}

public String getName() {
   return this.name;
}

public void setName(String name) {
   this.name = name;
}

}

DAO:

package hibernate;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Blob;
import org.hibernate.Hibernate;
import org.hibernate.LockMode;
import org.hibernate.Transaction;

/**
*
* @author coffee
*/

public class BlobtestDAO extends BaseHibernateDAO {

public void save(Blobtest blobtest) throws Exception {
   try {
    /*
    * 第一种方式,可用于ms sql和mysql数据库
    Transaction tran=getSession().beginTransaction();
    FileInputStream img = new FileInputStream("d://movie//linux4.jpg");
    Blob images = (Blob) Hibernate.createBlob(img);
    blobtest.setImages(images);
    getSession().save(blobtest);
    tran.commit();
    */
    //对于oracle这样的数据库不能以第一种方式那样,必须向下面这样操作
    Transaction tran=getSession().beginTransaction();
    blobtest.setImages(Hibernate.createBlob(new byte[1]));
    getSession().save(blobtest);
    getSession().flush();
    getSession().refresh(blobtest,LockMode.UPGRADE);
    Blob blob=blobtest.getImages();
    InputStream is=blob.getBinaryStream();
    FileOutputStream fos=new FileOutputStream("d://pic//linux4.jpg");
    byte[] buf=new byte[102400];
    int len;
    while((len=is.read(buf))!=-1){
     fos.write(buf,0,len);
    }
    fos.close();
    is.close();
    getSession().save(blobtest);
     tran.commit();
   } catch (RuntimeException re) {
    throw re;
   }
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值