`
zhangguobin
  • 浏览: 4743 次
  • 性别: Icon_minigender_1
  • 来自: 安徽合肥
最近访客 更多访客>>
社区版块
存档分类
最新评论

blob操作(转Robbin)

阅读更多
使用JDBC和Hibernate来写入Blob型数据到Oracle中 
关键字: Hibernate       
Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据。

写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢?

这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正的写入blob数据了。

看下面的JDBC的demo,把oraclejdbc.jar这个二进制文件写入数据库表javatest的content字段(这是一个blob型字段)


代码
import java.sql.*;  
import java.io.*;  
import oracle.sql.*;  
public class WriteBlob {  
 
  public static void main(String[] args) {  
 
    try {  
      DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());  
      Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","fankai","fankai");  
      conn.setAutoCommit(false);  
 
      BLOB blob = null;  
 
      PreparedStatement pstmt = conn.prepareStatement("insert into javatest(name,content) values(?,empty_blob())");  
      pstmt.setString(1,"fankai");  
      pstmt.executeUpdate();  
      pstmt.close();  
 
      pstmt = conn.prepareStatement("select content from javatest where name= ? for update");  
      pstmt.setString(1,"fankai");  
      ResultSet rset = pstmt.executeQuery();  
      if (rset.next()) blob = (BLOB) rset.getBlob(1);  
 
      String fileName = "oraclejdbc.jar";  
      File f = new File(fileName);  
      FileInputStream fin = new FileInputStream(f);  
      System.out.println("file size = " + fin.available());  
 
      pstmt = conn.prepareStatement("update javatest set content=? where name=?");  
 
      OutputStream out = blob.getBinaryOutputStream();  
 
      int count = -1, total = 0;  
      byte[] data = new byte[(int)fin.available()];  
      fin.read(data);  
      out.write(data);  
      /* 
      byte[] data = new byte[blob.getBufferSize()];  另一种实现方法,节省内存 
      while ((count = fin.read(data)) != -1) { 
        total += count; 
        out.write(data, 0, count); 
      } 
      */ 
 
      fin.close();  
      out.close();  
 
      pstmt.setBlob(1,blob);  
      pstmt.setString(2,"fankai");  
 
      pstmt.executeUpdate();  
      pstmt.close();  
 
      conn.commit();  
      conn.close();  
    } catch (SQLException e) {  
      System.err.println(e.getMessage());  
      e.printStackTrace();  
    } catch (IOException e) {  
      System.err.println(e.getMessage());  
    }  
  }  
 



仔细看上例,分三步:

1、插入空blob
into javatest(name,content) values(?,empty_blob());

2、获得blob的cursor
select content from javatest where name= ? for update;

注意!!!必须加for update,这将锁定该行,直至该行被修改完毕,保证不产生并发冲突。

3、update javatest set content=? where name=

用cursor往数据库写数据

这里面还有一点要提醒大家:

JDK1.3带的JDBC2.0规范是不完善的,只有读Blob的接口,而没有写Blob的接口,JDK1.4带的JDBC3.0加入了写Blob的接口。你可以使用JDBC3.0的接口,也可以直接使用Oracle的JDBC的API,我在上例中使用了Oracle的JDBC的API。

另外要注意的是:

java.sql.Blob
oracle.sql.BLOB

注意看blob的大小写,是不一样的。写程序的时候不要搞混了。

下面看看用Hibernate怎么写,原理是一样的,也要分三步,但是代码简单很多

这是Cat对象定义


代码
package com.fankai;  
 
import java.sql.Blob;  
 
public class Cat {  
  private String id;  
  private String name;  
  private char sex;  
  private float weight;  
  private Blob image;  
  public Cat() { }  
 
  public String getId() { return id; }  
  public void setId(String id) { this.id = id; }  
 
  public String getName() { return name; }  
  public void setName(String name) { this.name = name; }  
 
  public char getSex() { return sex; }  
  public void setSex(char sex) { this.sex = sex; }  
 
  public float getWeight() { return weight; }  
  public void setWeight(float weight) { this.weight = weight; }  
    
  public Blob getImage() { return image; }  
  public void setImage(Blob image) { this.image = image;}  



这是Cat.hbm.xml


代码
<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> 
 
<hibernate-mapping> 
    <class name="com.fankai.Cat" table="cat"> 
        <!--jcs-cache usage="read-only"/--> 
        <id name="id" unsaved-value="null"> 
            <generator class="uuid.hex"/> 
        </id> 
        <property name="name" length="16" not-null="true"/> 
        <property name="sex" length="1" not-null="true"/> 
        <property name="weight" /> 
        <property name="image" /> 
    </class> 
</hibernate-mapping> 


下面是完整的用Hibernate写入Blob的例子,相比JDBC,已经简单轻松多了,也不用写那些Oracle特殊的sql了:


代码
package com.fankai;  
 
import java.sql.Blob;  
import net.sf.hibernate.*;  
import oracle.sql.*;  
import java.io.*;  
 
public class TestCatHibernate {    
  public static void testBlob() {  
    Session s = null;      
    byte[] buffer = new byte[1];  
    buffer[0] = 1;  
    try {  
      SessionFactory sf = HibernateSessionFactory.getSessionFactory();  
      s = sf.openSession();    
      Transaction tx = s.beginTransaction();  
      Cat c = new Cat();  
      c.setName("Robbin");  
      c.setImage(Hibernate.createBlob(buffer));  
      s.save(c);  
      s.flush();  
      s.refresh(c, LockMode.UPGRADE);      
      BLOB blob = (BLOB) c.getImage();        
      OutputStream out = blob.getBinaryOutputStream();     
      String fileName = "oraclejdbc.jar";  
      File f = new File(fileName);  
      FileInputStream fin = new FileInputStream(f);     
      int count = -1, total = 0;  
      byte[] data = new byte[(int)fin.available()];  
      fin.read(data);  
      out.write(data);        
      fin.close();  
      out.close();  
      s.flush();  
      tx.commit();  
     
    } catch (Exception e) {  
      System.out.println(e.getMessage());  
    } finally {  
      if (s != null)  
        try {  
          s.close();  
        } catch (Exception e) {}  
    }      
      
  }  


分享到:
评论

相关推荐

    oracle blob转文件读取

    4. **处理Blob数据**:将Blob数据转换为文件并进行相应的操作。 #### 三、示例代码解析 根据提供的部分代码片段,我们可以进一步了解如何在C#中操作Oracle数据库中的Blob数据。 ```csharp using System; using ...

    PB转换BLOB

    在提供的压缩包文件“blob”中,可能包含了示例代码、测试数据或详细教程,用于展示如何在PowerBuilder环境中执行上述转换操作。通过学习和实践这些内容,你可以深入理解PB转换BLOB的具体实现,并将其应用到自己的...

    mysql blob to 向 file转换

    "MySQL 中的 BLOB 到文件的转换" 在 MySQL 数据库中,BLOB(Binary Large OBject)是一种二进制大对象类型,常用于存储图像、音频、视频和其他类型的文件。然而,在实际应用中,我们经常需要将 BLOB 数据转换为文件...

    oracle(blob转换为clob)

    在Oracle数据库环境中,数据类型BLOB(Binary Large Object)用于存储大量的二进制数据,如图像、音频或视频文件,而CLOB(Character Large Object)则用于存储大量文本数据。在某些情况下,可能需要将BLOB类型的...

    PB12.5 ---关于BLOB转换和数据之间的转换,及各进制之间的转换

    1.转换BLOB BLOB转为Byte字节流 BLOB转为Char字节流 BLOB转为二进制字符 BLOB转为十六进制字符 2.生成BLOB Byte字节流转为BLOB Char字节流转为BLOB 二进制字符转为BLOB 十六进制字符转为BLOB 3.二进制 8位...

    PB PowerBuilder base64 blob 互转

    这个主题"PB PowerBuilder base64 blob 互转"涉及到的是如何在PowerBuilder应用程序中处理base64编码和BLOB(Binary Large Object)数据类型之间的转换。这两种数据类型在不同的场景下都有其独特的作用,而将它们...

    BLOB与String互转

    最近开发遇到blob类型转换为String,一时犯难。所以总结了一段代码与之分享。亲测

    PB ,PowerBuilder ,Hex blob , 16进制 blob ,互转

    标题"PB,PowerBuilder,Hex blob,16进制blob,互转"涉及到的是如何在PowerBuilder中将Blob数据转换为16进制字符串,以及反过来将16进制字符串转换回Blob数据。在处理Blob数据时,有时候我们需要将其转换成易于阅读...

    函数进行BLOB转换Varchar2.txt

    Oracle SQL 函数进行BLOB转换Varchar2

    java中Blob转String

    分享在JAVA中Blob转换成String实例

    oracle中的BLOB(照片)转换到mysql中

    在IT行业中,数据库管理系统(DBMS)如Oracle和MySQL在...在实际操作中,需要对数据库API有深入理解,并注意数据的兼容性和性能优化。通过以上方法,你可以顺利地在两个数据库系统之间迁移和管理BLOB类型的照片数据。

    C#,BLOB读取操作

    C# 中的 BLOB 读取操作 C# 中的 BLOB(Binary Large OBject)读取操作是指从数据库中读取二进制数据的过程。BLOB 是一种二进制数据类型,用于存储大规模的二进制数据,如图片、音频、视频等。在 C# 中,我们可以...

    oracle LongRaw 转 Blob

    在C#中,Oracle提供了Oracle.DataAccess.Client库来操作Oracle数据库,包括LongRaw和Blob字段的转换。以下是一个简单的步骤概述: 1. **连接数据库**:使用OracleConnection类建立到Oracle数据库的连接。需要提供...

    oracle Blob转换Clob

    ### Oracle Blob转换Clob #### 知识点一:Oracle Blob与Clob的基本概念 - **Blob (Binary Large Object)**:在Oracle数据库中,Blob类型用于存储大量的二进制数据,如图像、视频或文档等非结构化数据。 - **Clob ...

    java file upload BLOB

    - 如果查询成功并且存在结果,则获取 BLOB 对象,并通过 `getBinaryStream()` 方法将 BLOB 转换为 InputStream。 - 最后,将读取的数据写入到客户端输出流中,完成图片的显示。 - **`addSecurityChecks` 方法**...

    blob,将byte二进制转成pdf

    标题中的“blob,将byte二进制转成pdf”指的是在IT领域中处理二进制数据(Blob)并将其转换为PDF文档的过程。Blob在计算机科学中通常代表Binary Large Object,用于存储大块非结构化的数据,如图像、音频、视频或者在...

    java,Blob字段操作,将图片或者文件保存到数据库中.zip

    本教程将深入探讨如何使用Java进行Blob字段的操作,以实现将图片或文件保存到数据库中。 1. **Blob字段的理解** Blob是SQL标准定义的一种数据类型,它能够存储大量的二进制数据,如图像、音频文件、PDF文档等。在...

    在PowerBuilder中操作BLOB数据的技巧

    在 PowerBuilder 中操作 BLOB 数据的技巧 PowerBuilder 提供的 BLOB(Binary Large Object)数据类型可以用来处理大型数据,包括图像、大文本、Word 文档、二进制文件和多媒体等各种数据,它的长度可以是 0~2GB ...

    jdbc 操作oracle blob数据

    jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc ...

    BLOB转成CHAR Orcle Sql

    BLOB转成CHAR Orcle Sql 将Blob类型的列查询成Char类型

Global site tag (gtag.js) - Google Analytics