`
jayyanzhang2010
  • 浏览: 377835 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

hibernate spring 读存取 blob

 
阅读更多

(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根本没有呀,,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();

分享到:
评论

相关推荐

    Struts2 Hibernate存取Oracle数据库中的BLOB数据.pdf

    - BLOB(二进制大对象):用于存储大型二进制数据,如影像、图片等,其长度可达4GB,支持随机存取。 - BFILE:虽然用于存储大型二进制数据,但数据实际存储在文件系统中,数据库中仅存储指向文件的指针,Oracle对...

    struts+hibernate+spring+blob

    struts+hibernate+spring+blob 三个框架集成了一下,主要包括利用struts的上传附件功能,并把上传的图片存储到oracle的blob字段。并提供显示。 没做过多的限制,还有很多bug别见怪,功能跑得通!

    spring mvc+hibernate 图片存储至blob

    总结起来,"spring mvc+hibernate 图片存储至blob"这个主题涉及到Spring MVC处理文件上传、Hibernate将图片数据存入数据库BLOB字段、以及前后端交互等多个技术点。通过理解这些知识点,开发者可以构建一个完整的图片...

    struts2.1 + hibernate3.2 + spring 2.5 实现blob数据上传、下载

    - 使用Spring的DAO或Service层接口,通过Hibernate的Session对象将Blob对象插入到数据库对应的表中。这通常涉及到一个带有Blob参数的SQL语句,如`INSERT INTO table (id, blob_column) VALUES (?, ?)`,然后使用`...

    jdbc+hibernate存取blob字段

    本篇将详细介绍如何使用JDBC(Java Database Connectivity)与Hibernate框架来操作Oracle数据库中的BLOB字段。 首先,Oracle数据库的BLOB字段提供了对大对象的高效存储,它的性能优于LONG字段,尤其适合存储大容量...

    使用hibernate对oracle读取blob

    Hibernate作为一款流行的ORM(对象关系映射)框架,提供了与Oracle数据库交互的简便方式,包括处理Blob数据。本文将详细介绍如何使用Hibernate和JDBC读取和存储Oracle数据库中的Blob对象。 ### 1. Hibernate Blob...

    spring+mybatis下BLOB字段的图片存取代码

    spring+mybatis下BLOB字段的图片存取代码,仅整理了Controller层的代码,service和dao的代码很简单,所以没有整理

    Struts2,Hibernate3,Spring2实现oracle存取blob字段(图片等二进制文件)(原来2分的,现在免费了!!给评分哦!!)

    Struts2,Hibernate3,Spring2实现oracle存取blob字段(图片等二进制文件) Myeclipse6.0下开发 哈哈,原来2分的,现在免费了!!!!!!!!!!!!!!!!!!!!!!!!给评分哦!!!!!!!!!!!!!!!!

    Oracle在PB中用OLE存取blob类型数据[归类].pdf

    "Oracle在PB中用OLE存取blob类型数据" Oracle是在PowerBuilder(PB)中使用OLE存取Blob类型数据的解决方案。该解决方案主要涉及到PB中使用OLE存取Blob类型数据的方法,包括建立数据库表、创建PB库、设置数据库连接...

    Hibernate对BLOB CLOB操作

    在Java的持久化框架Hibernate中,BLOB和CLOB是用来处理大数据对象(Binary Large Object和Character Large Object)的。这两个类型常用于存储图像、视频、大文本等数据,因为它们可以容纳超过数据库标准列大小限制的...

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

    ### Hibernate 对 Blob 类型字段进行数据添加 #### 知识点概述 在处理数据库操作时,经常需要存储二进制大对象(Binary Large Object,简称 BLOB),例如图像、视频等非文本数据。BLOB 类型是数据库系统中用于存储...

    关于在SQL Server数据库系统中存取BLOB数据的探讨.pdf

    关于在SQL Server数据库系统中存取BLOB数据的探讨 在SQL Server数据库系统中,存取BLOB(Binary Large OBject)数据是一种复杂的问题。BLOB数据是指非结构化的大型二进制数据,例如图片、音频、视频等。这种数据...

    JDBC+Hibernate将Blob数据写入Oracle

    在Oracle数据库中,BLOB类型的字段具有特殊的处理方式,尤其在使用JDBC(Java Database Connectivity)和Hibernate框架时,需要特别注意其写入过程。以下是对“JDBC+Hibernate将Blob数据写入Oracle”这一主题的深入...

    spring blob相关

    当涉及到数据库操作,特别是处理大型二进制对象(Binary Large Object,简称BLOB)时,Spring提供了灵活且强大的支持。Oracle数据库是企业级应用广泛采用的关系型数据库系统,它也支持BLOB类型来存储大量的二进制...

    Hibernate读取blob字段

    在Java的持久化框架Hibernate中,Blob类型常用于存储大对象(Large Object),如图片、音频、视频或大型文本文件等。本篇文章将深入探讨如何使用Hibernate读取数据库中的Blob字段,以及涉及到的相关知识点。 首先,...

    VC ADO技术存取BLOB二进制大数据.rar

    这个实例可以帮助开发者了解如何在VC中使用ADO处理BLOB数据,包括如何将图像文件存入数据库,以及如何从数据库中读取出图像数据并显示。 **5. 实践注意事项** - 处理大对象时,为了提高效率,通常会使用`GetChunk`...

    利用spring的jdbcTemplate处理blob、clob

    spring 中对大数据的处理,包括clob,blob的数据。比之jdbc下简便很多。

    计算机软件-商业源码-实例123-存取Blob字段.zip

    这个"计算机软件-商业源码-实例123-存取Blob字段.zip"的压缩包文件很可能是包含了一套具体的示例代码,用于演示如何在商业应用中读取和写入Blob字段。 源码软件指的是公开的或者可获得源代码的软件,这使得用户可以...

Global site tag (gtag.js) - Google Analytics