hibernate如何对Blob类型字段进行数据添加
2013-03-28 17:59
751 查看
以前写过操作oracle Clob字段的方法,在的其它文章里有,现在介绍操作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 />
</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;
}
}
}
对于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 />
</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;
}
}
}
相关文章推荐
- hibernate对Blob类型字段进行数据添加
- 不同类型的数据层如何进行属性字段的连接?
- [随记]在Hibernate中如何使用Blob数据类型
- [随记]在Hibernate中如何使用Blob数据类型
- 一个表的两个字段具有相同的类型。如何仅用SQL语句交换这两列的数据?
- 使用Spring+Hibernate实现Oracle数据库BlOB数据类型的读写
- 用Sum函数对DateTime数据类型字段进行求和统计
- 【PLSQL】如何对BLOB字段进行like操作
- hibernate查询数据表char类型字段只返回一个字符
- hibernate查询数据表char类型字段只返回一个字符
- Oracle数据库中字段定义为Char类型,Hibernate用该字段进行动态绑定参数查询,获取不到结果的问题
- 处理Blob类型数据,例如将对象保存到blob字段中
- java的UUID类型字段,如何通过jdbc进行数据库的CRUD
- List添加Item时, 如何去判断某个字段, 并且保证字段数据不重复性
- Visio 2007中进行数据库建模时如何显示字段类型以及概念名称
- 如何对const TDesC&数据类型进行Trim
- 使用Spring+Hibernate实现Oracle数据库BlOB数据类型的读写
- 使用 hibernate 存取大对象数据类型(clob和blob)
- 关于在VISIO中进行数据库建模时如何显示字段类型,以及注释的