`
jeasony
  • 浏览: 200032 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

使用hibernate保存文件等二进制大对象到oracle数据库中的解决方法

阅读更多
                                       

1.VO,PO准备

首先在数据库中定义要保存的字段为Blob类型,同时map的对应hbm文件中对应列应该为java.sql.Blob类型,所以生成的PO对应字段也应该为java.sql.Blob,(不是oracle.sql.BLOB)。

对于前台的值对象VO中,对应字段定义为byet[],当然也可以设置为InputStream,由后台进行处理,但是不应直接设置为blob类型,因为dao在写操作时需要用数据流进行写入。

2.前台处理

首先是页面的定义

<input type=”file” name=”upFile”/>

<html:file property=”upFile”>

然后是Action 对应Form的定义,应该存在一个FormFile类型的字段,以获取页面上传的文件对象,名称和页面上定义的文件控件对应,比如:upFile.

最后是Action中的实现:

首先通过form获取FormFile对象,通过FormFile对象获取对应文件的大小,和对应的输入流InputStream,利用com.westerasoft.common.util.FileUtil中的getByte方法,将InputStream转为byte[],设置在VO对象中,调用后台方法进行保存.前台处理完成。下面是示例代码:

                       FileUpForm fileform = (FileUpForm)form;           //           FormFile file = fileform.getFile();           //           int size = file.getFileSize();           //           InputStream stream = file.getInputStream();           //           String fileName = file.getFileName();           //           PictureFileVO vo = new PictureFileVO();           vo.setPictureName(fileName);           //           vo.setContent(FileUtil.getBytes(stream,size));           //        SingleWellManageService.addPictureFile(vo);3.由于oracle的Blob字段的保存,比较特殊,首先必须先初始化对应的Blob字段,既第一次保存时,应该保存空的Blob对象到数据库(empty_blob()),然后再进行更新,在更新的过程中必须对当前记录进行锁定,更新时需要使用输出流的方式。对于使用Hibernate来说,比JDBC简单一些,保存时不能简单使用hibernate的save方法,那样会造成保存只能保存4K以下的文件,有的说是因为oracle9i之前的驱动问题,使用10g可解决问题,未进行尝试。下面是实现的简单示例:  

 

dao = new SwWellPictureFileDAO();

//获取session

        Session s = null;

        try

        {

            //获取实例

            s = dao.getSession();

           

//初始化设置空的Blob       

            po.setContent(BLOB.empty_lob());

            //第一次保存,初始化blob

            s.save(po);

            s.flush();

            s.refresh(po, LockMode.UPGRADE); //Blob更新之前必须锁定

            //将当前PO的blob字段与OutputStream关联

            weblogic.jdbc.vendor.oracle.OracleThinBlob tempBlob =

        (weblogic.jdbc.vendor.oracle.OracleThinBlob)po.getContent();

            OutputStream out = tempBlob.getBinaryOutputStream();

            //将前台的byte[]写入流

            out.write(content);

            out.close();

            //数据持久

            s.flush();

            return po.getPkPicturefile().intValue();

        }

        catch (Exception e)

        {

            throw new HibernateException("提交文件信息出错");

        }

        finally

        {

            //关闭session

            if (s != null)

            {

                s.close();

            }

     }

 

 

如果你想做移动GIS并使用java+mapxTreme模式那么其中一个问题很是让人郁闷,那就是如何将Mapxrender出来的Image返回给客户端。为了这个问题我查找了很多类似的文章但最终还是没有成功。后来一个脑海中一闪而过的念头一下子让我激动起来,原来J2ME接收数据的时候就是将InputStream转换成Byte然后再进行处理的,既然J2me能够这么做那么我想java也应该没问题了所以便有了一下成果。你可以将mapxtremeRender出来的图片现保存到硬盘然后通过
InputStream iStrm = new FileInputStream(curpath+"
\\h.gif"); 
方法将其转化为InputStream然后再转化为Byte下面是具体代码希望对大家有帮助,如果对你有帮助请回个贴顶一下哦。

    public byte[] InputStreamToByte(InputStream iStrm) throws IOException {
    ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
    int ch;
    while ((ch = iStrm.read()) != -1)
    {
       bytestream.write(ch);
    }
    byte imgdata[]=bytestream.toByteArray();
    bytestream.close();
    return imgdata;
  }

分享到:
评论

相关推荐

    图片以二进制保存到Oracle,取出并显示到页面示例

    综上所述,将图片以二进制格式存储在Oracle数据库中并从数据库中取出显示到页面,涉及到文件读取、二进制数据处理、数据库操作以及HTTP响应的设置。通过理解这些概念和技巧,开发者能够更好地管理和展示数据库中的非...

    springMvc+Oracle的图片转二进制流

    4. **创建数据表**:在Oracle数据库中创建一个专门用来存储图片二进制流的表,通常包含一个字段用于存储二进制数据,比如`BLOB`类型。 5. **持久化到数据库**:使用Hibernate或JDBC API将二进制流写入数据库。在...

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

    在实际操作中,可以通过Hibernate实现Oracle数据库中BLOB数据的存储和删除操作,然后利用Struts2框架展示这些BLOB数据。这样的结合,不仅可以提高开发效率,还能保证应用的性能和稳定性。 ### 实际操作步骤 在实际...

    SSH3+Oracle数据库实现文件上传下载的项目

    - **文件上传**:用户通过表单提交包含文件的数据到服务器,Struts2框架接收到请求后,将文件保存到服务器的特定目录,并将相关信息(如文件名、大小等)存储到数据库中。 - **文件下载**:用户请求下载时,服务器...

    使用JDBC和Hibernate来写入Blob型数据到Oracle中

    在Java开发中,有时我们需要存储二进制大数据,如图片、视频或文档,这时Oracle数据库中的Blob类型就显得尤为重要。Blob(Binary Large Object)是Oracle用来存储大对象数据的类型,它可以高效地处理大量的二进制...

    JDBC+Hibernate将Blob数据写入Oracle

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

    oracle+hibernate 处理blob +uploadify实例

    综上所述,这个实例展示了如何在Oracle数据库中使用Hibernate处理Blob数据,结合Uploadify实现文件上传。这种解决方案不仅适用于Oracle,理论上也适用于其他支持Blob类型的数据库,如MySQL和MSSQLServer。了解这些...

    Hibernate操作数据库大字段的示例(附源码及详细开发使用方法)。

    在Java Web开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它极大地简化了数据库操作。当处理大数据字段,如长文本、图片或视频等时,Hibernate提供了有效的方法来存储和检索这些数据。本示例将详细...

    hibernate保存blob,clob对象

    例如,Oracle和MySQL在处理大对象时有各自的API和策略。 总结,Hibernate通过`@Lob`注解支持BLOB和CLOB的持久化,开发者需要适当地将数据转换为对应的对象类型,然后使用Hibernate的CRUD操作进行保存和检索。同时,...

    Hibernate-Oracle-MySQL-image.rar_oracle

    这篇文档“Hibernate-Oracle-MySQL-image.rar_oracle”聚焦于使用Hibernate处理Oracle和MySQL数据库中的二进制大对象(Blob),特别关注如何存储和检索图片文件。Blob类型常用于存储大型数据,如图像、音频或视频...

    hibernate向oracle插入图片

    Oracle数据库支持BLOB(Binary Large Object)类型,用于存储大容量的二进制数据,如图片、音频或视频文件。在Hibernate中,我们可以通过定义一个BLOB类型的字段来映射图片数据。 【三】准备环境 1. 首先,确保已...

    将图片以字节流存到数据库再从数据库获取显示

    通常,我们会选择支持二进制大对象(BLOB)的数据库,如MySQL、PostgreSQL或Oracle等,用于存储字节流数据。创建一个表,包含一个BLOB类型的字段,用于存放图片数据。然后,通过SQL语句或者ORM框架(如Hibernate或...

    maven搭建spring4+struts2+hibernate4项目demo含数据库

    Hibernate通过配置文件(如hibernate.cfg.xml)与数据库建立连接,定义实体类并映射到对应的表,使得数据库操作可以通过对象的方式来实现,提高代码的可读性和可维护性。 在实际项目中,开发者需要配置Maven的pom....

    Java swing+Jtree+Hibernate+Oracle企业人事管理系统

    它支持多种数据类型,包括关系型数据、XML、二进制大对象等,并具有高可用性、可伸缩性和安全性。Oracle数据库还提供了强大的性能优化工具和高级特性,如分区、索引、物质化视图等,以满足大规模数据存储和复杂查询...

    SSH+Oracle上传图片

    在Oracle数据库中,我们首先需要创建一个包含图片数据的表。例如,创建名为`admin`的表,包含ID(主键)、Name(名称)和Img(图片)三列,Img列的数据类型为Blob,用于存储二进制大对象。 ```sql CREATE TABLE ...

    spring+hibernate操作oracle的clob字段

    在J2EE开发中,处理大数据对象(如大文本或二进制数据)时,Oracle数据库的CLOB字段常被用来存储超过4000字节的信息。Spring和Hibernate框架结合使用可以有效地进行CLOB字段的操作。以下是实现这一功能的关键步骤和...

    关于在Hibernate中对于Clob,Blob字段的处理方法

    在Oracle数据库中,Hibernate提供了与这些数据类型的交互方式。本篇将详细介绍在Hibernate中如何处理Clob和Blob字段,以及使用特定Oracle JDBC驱动程序的优势。 首先,Hibernate通过`org.hibernate.type`包中的`...

    java将图片写入数据库,并读出来(blob clob)

    在Java编程中,有时我们需要将图像数据存储到数据库中,然后能够从数据库中读取出来。这个过程通常涉及到Blob和Clob数据类型,它们是Java中的两种特殊对象,用于存储大对象(LOB)。Blob用于存储二进制数据,如图片...

    hibernate需要的10个jar

    在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。当涉及到Hibernate项目时,为了使其正常运行,通常需要一系列的JAR(Java ...

Global site tag (gtag.js) - Google Analytics