hibernate spring 读存取 blob 86字节

数据库:oracle11g

JDK版本:JDK1.5

框架:Struts2、Hibernate、Spring



开发过程中遇到了一个问题,数据库的BLOB字段该与POJO类字段的什么类型映射?Hibernate可以像操作其他对象一样操作BLOB字段对应的Java数据类型。



初次的映射方法为:数据库BLOB与java.sql.Blob类型映射(大家都知道Oracle9i和其他数据库存取BLOB的方式不一样,而且Oracle9i和Oracle10g都不兼容),如果使用这种映射方式,用Hibernate的saveOrUpdate()是没有办法将图片存到数据库中的。

于是在网上搜索解决方法,经过大量的筛选,终于找到了方法,具体做法如下:

(1)数据库类型:BLOB

配置hibernate的持久类文件中对应的字段为byte[]类型

配置hibernate的类映射文件中对应的字段type为 org.springframework.orm.hibernate3.support.BlobByteArrayType
-----------------------------------------

数据库类型:CLOB

配置hibernate的持久类文件中对应的字段为String类型

配置hibernate的类映射文件中对应的字段type为 org.springframework.orm.hibernate3.support.CloBStringType



(2)在sessionFactory中加入lobHandler的注射:

<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="lobHandler" ref="lobHandler"/>
<property name="mappingResources">
<value>xxx.hbm.xml</value>
.....
</property>
</bean>

(3)定义这个lobHandler,值得注意的是这里有Oracle的版本区别:

<bean id="lobHandler" lazy-init="true" class="org.springframework.jdbc.support.lob.OracleLobHandler">
<property name="nativeJdbcExtractor">
<ref bean="nativeJdbcExtractor"/>
</property>
</bean>

<bean id="nativeJdbcExtractor" lazy-init="true" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"/>

spring有几个实现类,根据不同的连接池类型,选择不同的实现类:

因为Oracle9i处理Blob和Clob的方式和别的数据库很不一样,甚至与Oracle10g都不兼容,所以这里要用spring提供的SimpleNativeJdbcExtractor.如果使用Oracle10g或Oracle11g的话,可以直接使用:

<bean id="lobHandler" lazy-init="true" class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>



这里需要说明的是:如果使用Oracle10g或Oracle11g,用上述定义的bean就不需要在定义nativeJdbcExtractor这个bean了,我第一次用的时候,犯了一个错误,在Oracle9i中用的bean的基础上就直接把bean中的class改了改,结果报了一大堆的异常,就是因为Oracle10g或Oracle11g中读存BLOB的lobHandler的bean的已经不需要nativeJdbcExtractor这个属性了,希望大家不要弄错了。



经过上述的步骤,我可以将图片资源存入到Oracle11g中了,但是读取的时候byte[]长度不管在数据库存的图片的真实字节数是多少,它读出来的长度都是86,很是郁闷,后来去网上搜资料,百度就不用说了,就没有相关的信息,在谷歌里还有点相关的信息,不过也都是说Oracle10g或Oracle9i的,关于Oracle11g根本没有呀,hibernate <wbr>spring <wbr>读存取 <wbr>blob <wbr>86字节,Oracle11g都出这么长时间了,怎么没有与Oracle11g相关的信息呢?



摘一段关于其他Oracle版本的信息吧:

The 86 bytes is the Blob Locator perhaps?

I believe that when using Hibernate with a byte[] mapped to a Blob you can save it ok with the right driver. But when you retrieve it you'll just get the Blob Locator back in to the byte[] not the actual bytes in the Blob.



在这篇文章的评论中看到这样的信息:

One solution to get around this problem is to use the Oracle 10.1.0.4 JDBC thin driver, instead of the Oracle 9.2.0.x thin driver, to work against the Oracle 9.2.0.x database. Apparently it's related a bug in the 9.2.0.x JDBC driver.

所以我想会不会是我用的驱动也有这样的bug呢?于是我去我安装的oracle11.1.0.6下的jdbc/lib目录中把ojdbc5.jar,大小为1.79M(因为我用的jdk是1.5的),放到项目中也不行,于是去网上搜最新的驱动,最后
下载了Oracle 11g 第 2 版 (11.2.0.1.0) JDBC的ojdbc5.jar大小为1.90M,虽然版本不同但是驱动名称是一样的,所以要注意一下呀,看一下大小区分吧!
驱动下载网址也贴出来吧http://ajava.org/tool/drivers/14632.html
换上上述的驱动后,问题终于解决了,现在可以存到数据库中也能从数据库中读取取来了,不容易呀!

最后把例子中的主要代码贴出来一下:
(1)hibernate的映射文件Result.hbm.xml
<property name="resimg" type="org.springframework.orm.hibernate3.support.BlobByteArrayType" lazy="true">
<column name="RESIMG" />
</property>
(2)把图片存到数据库中的代码:
String fileName = "E:\\oracle01.jpg";
// E盘下有个oracle01.jpg的图像文件
File f = new File(fileName);
FileInputStream fin = new FileInputStream(f);
byte[] data = new byte[(int) fin.available()];
fin.read(data);
fin.close();

Result rs = new Result();
rs.setResimg(data); // POJO类中byte[] Resimg = null;
rs.setFname("1700");
resultDao.saveOrUpdate(rs);

(3)从数据库读出来并生成文件的代码:
Result r = (Result)resultDao.getByIdx(53);
byte[] b = r.getResimg();
File file = new File("D:\\test10.gif");

OutputStream fos = new FileOutputStream("D:\\test10.gif");
fos.write(b);
fos.close();
转:http://blog.sina.com.cn/s/blog_5fa32a510100i2nc.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue中使用Blob进行字节流下载非常简单。首先,我们需要获取要下载的字节流数据。然后,使用Blob对象将数据封装为二进制文件。最后,创建一个URL对象,并将其绑定到下载链接上,使用户能够下载该文件。 以下是一个简单的示例: ```javascript // 获取字节流数据 axios.get('https://example.com/api/download', { responseType: 'blob' }) .then(response => { // 创建Blob对象 const blob = new Blob([response.data], { type: 'application/octet-stream' }); // 创建URL对象 const url = window.URL.createObjectURL(blob); // 创建下载链接,让用户能够下载文件 const link = document.createElement('a'); link.href = url; link.download = 'file.txt'; link.click(); // 清理URL对象 window.URL.revokeObjectURL(url); }) .catch(error => { console.error(error); }); ``` 在上述示例中,我们使用axios库发送GET请求获取字节流数据。在请求中,我们将`responseType`设置为`blob`,以确保返回的数据以Blob格式返回。 获取数据后,我们将其封装在一个Blob对象中,并指定文件的MIME类型(在此示例中,我们使用了`application/octet-stream`作为示例类型)。然后,我们使用`URL.createObjectURL()`方法创建一个URL对象,并将其绑定到将要下载的文件上。 接下来,我们创建一个`<a>`元素作为下载链接。将URL对象的URL属性赋值给`href`属性,并为`download`属性设置文件名。最后,使用`click()`方法模拟用户点击该链接,触发文件下载。 最后,我们调用`window.URL.revokeObjectURL()`方法清理URL对象,以确保资源被正确释放。 这就是使用Vue进行Blob字节流下载的简单示例。您可以根据您的具体需求进行相应的修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值