视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
jdbc中如何处理Oracle BLOB字段
2025-10-02 15:40:36 责编:小OO
文档
jdbc中如何处理Oracle BLOB字段.txt一个人    一盒烟    一台电脑过一天一个人    一瓶酒    一盘蚕豆过一宿。永远扛不住女人的小脾气,女人    永远抵不住男人的花言巧语。                            要转成2进制 

jdbc中如何处理Oracle   BLOB字段 

为什么我要写这篇文章? 

在前段时间我所在的项目中,就碰到了这个问题,我花了2天的时间才将BLOB的问题搞定。我也尝试过网上所介绍的各种方法,那些方法所 

使用的原理都一致,但都写得不完整,我也按照网上介绍的方法做了,但都因为其中一些没有提到的小的细节而失败。希望看到这篇文章的人 

都不再走弯路。 

一般人会走哪些弯路? 

1.使用jdk中的方法进行传输。在ResultSet   中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多数人都会尝试setBlob 

(),getBlob()   进行读写,或者两个数据库之间BLOB的传输。这种方法实际上是行不通的,据网上的一些资料介绍,说sun官方的文档有些方法 

都是错误的。 

2.使用ResultSet.getBinaryStream   和PreparedStatement.setBinaryStream对BLOB进行读写或两个数据库间的传输。这种方法我自己尝试过, 

发现,如果BLOB中存储的是文本文件的话,就没问题,如果是二进制文件,传输就会有问题。 

根据自己的经验,以及查阅了Oracle的官方文档,都是使用如下处理方法: 

1.新建记录,插入BLOB数据 

 1.1首先新建记录的时候,使用oracle的函数插入一个空的BLOB,假设字段A是BLOB类型的: 

   insert   xxxtable(A,B,C)   values(empty_blob(), 'xxx ', 'yyyy ') 

 1.2后面再查询刚才插入的记录,然后更新BLOB,在查询前,注意设置Connection的一个属性: 

   conn.setAutoCommit(false);如果缺少这一步,可能导致fetch   out   of   sequence等异常. 

 1.3   查询刚才插入的记录,后面要加“   for   update   ”,如下: 

   select   A   from   xxxtable   where   xxx=999   for   update   ,如果缺少for   update,可能出现row   containing   the   LOB   value   is   not   locked 

的异常 

 1.4   从查询到的   BLOB字段中,获取blob并进行更新,代码如下: 

   BLOB   blob   =   (BLOB)   rs.getBlob( "A "); 

   OutputStream   os   =   blob.getBinaryOutputStream(); 

   BufferedOutputStream   output   =   new   BufferedOutputStream(os); 

   后面再使用output.write方法将需要写入的内容写到output中就可以了。例如我们将一个文件写入这个字段中: 

   BufferedInputStream   input   =   new   BufferedInputStream(new   File( "c:\\\\hpWave.log ").toURL().openStream()); 

   byte[]   buff   =   new   byte[2048];     //用做文件写入的缓冲 

   int   bytesRead; 

   while(-1   !=   (bytesRead   =   input.read(buff,   0,   buff.length)))   { 

     output.write(buff,   0,   bytesRead); 

     System.out.println(bytesRead); 

   } 

   上面的代码就是从input里2k地读取,然后写入到output中。 

 1.5上面执行完毕后,记得关闭output,input,以及关闭查询到的ResultSet 

 1.6最后执行conn.commit();将更新的内容提交,以及执行conn.setAutoCommit(true);   改回Connction的属性 

2.修改记录,方法与上面的方法类似, 

 2.1首先更新BLOB以外的其他字段 

 2.2   使用1.3中类似的方法获取记录 

 2.3   修改的过程中,注意以下:a   需要更新的记录中,BLOB有可能为NULL,这样在执行blob.getBinaryOutputStream()获取的值可能为 

null,那么就关闭刚才select的记录,再执行一次update   xxxtable   set   A   =   empty_blob()   where   xxx,   这样就先写入了一个空的BLOB(不是null),然后再 

使用1.3,1.4中的方法执行更新记录.b   注意别忘了先执行setAutoCommit(false),以及 "for   update 以及后面的conn.commit();等。 

3.读取BLOB字段中的数据. 

 3.1   读取记录不需要setAutoCommit(),以及   select   ....for   update. 

 3.2   使用普通的select   方法查询出记录 

 3.3   从ResultSet中获取BLOB并读取,如下: 

   BLOB   b_to   =   (BLOB)   rs.getBlob( "A "); 

   InputStream   is   =   b_from.getBinaryStream(); 

   BufferedInputStream   input   =   new   BufferedInputStream(is); 

   byte[]   buff   =   new   byte[2048]; 

   while(-1   !=   (bytesRead   =   input.read(buff,   0,   buff.length)))   { 

     //在这里执行写入,如写入到文件的BufferedOutputStream里 

     System.out.println(bytesRead); 

   } 

   通过循环取出blob中的数据,写到buff里,再将buff的内容写入到需要的地方 

4.两个数据库间blob字段的传输 

类似上面1和3的方法,一边获取BufferedOutputStream,另外一边获取BufferedInputStream,然后读出写入,需要注意的是写入所用的 

Connection要执行conn.setAutoCommit(false);以及获取记录时添加“   for   update   ”以及最后的commit(); 

总结以上方法,其根本就是先创建空的BLOB,再获取其BufferedOutputStream进行写入,或获取BufferedInputStream进行读取 

- 珑琉璃 2009-03-11 01:02

我是新手,有些措辞可能不太专业~ 

首先,如果你是用jndi获取连接的话,驱动支持不支持blob操作 

因为,我就遇到过,根本没有实现blob操作,害我查了半天 

一、增加 

 1、先用   insert   into   person   (name,picture)   values   ( 'picname ',empty_blob()) 

 2、再   select   *   from   person   where   name= 'picname '   for   update 

 oracle.sql.BLOB   blob   =   (oracle.sql.BLOB)   rs.getBlob( "picture ");   //   得到BLOB对象 

 File   file   =   new   File( "C:\\\\...... ");//   得到file对象 

 if(file.exists()&&file.isFile()){//如果文件存在,并且文件为file 

     OutputStream   out   =   blob.getBinaryOutputStream();   //   建立输出流 

     InputStream   in   =   new   FileInputStream(file);   //   建立输入流 

     int   size   =   blob.getBufferSize(); 

     byte[]   buffer   =   new   byte[size];   //   建立缓冲区 

     int   len; 

     while   ((len   =   in.read(buffer))   !=   -1)   { 

       out.write(buffer,   0,   len); 

     } 

     in.close(); 

     out.close(); 

 } 

 file.delete(); 

二、修改 

和新增里面的方法一样 

三、查看 

看二楼的方法,因为查看的方法很多,不知道你要哪种?   下载?预览? 下载本文

显示全文
专题