对oracle中BLOB字段读写的总结

oracleBLOB字段读写的总结

 

最近两天,阿堂在处理将页面中的文件上传和下载时,要将页面上,客户选择的任意类型上传的文件,写入到oracle中的BLOB类型的字段中,同时,客户也能下载上传的多个任意类型的文件,遇到了一些问题,也到网上查了不少资料,感觉网上的资料都或多或少有些错务,最后通过自己的反复测试总算解决了,解决的过程中,还真有不少收获,这里还是写下来,和朋友们分享一下!

以下是本人的几点总结,当然,上面的两个方法(上传和下载)中,本身已经加了注解了
1.
个人感觉对于mysqlblob类型的字段,sql server中的image类型的字段,oracle中的blob类型的字段读写操作的方式是有区别的,既有相同点,也有不同点
2.mysql
中的BLOB类型字段的读写,sql serverimage类型的字段读写,oracle中的BLOB类型的字段的读写的比较(写对应的上传文件,读对应的下载文件)
对于mysql中的blob类型的字段和sql server中的image字段类型的写(文件上传),在插入insert操作时,
pst.setBinaryStream(1, fis, int(f.length()))这种类似的写法,基本上就可以将数据插入到其BLOB类型的字段中去了。
对于mysql中的blob类型的字段和sql serverimage字段的读(文件下载)
mysql BLOB orderfile=rs.getBlob("order");得到输入流,再用输出流输出这些二进制就可以下载文件
sqlserver中用rs.getBinaryStream("orderfile");得到输入流,再用输出流输出这些二进制就可以下载文件

对于oracle中的写(上传文件)
第一步 先向BLOB字段中先插入一个空的BLOB,EMPTY_BLOB()
insert into Webfiles(PATH,FILENAME,USERNAME,JOB_NO,ORDERFILE) values(?,?,?,?,EMPTY_BLOB())
第二步再用select ...for update这种形式的语句来更新数据库中blob字段对应的值
select orderfile from Webfiles where Webfiles.job_no=? and Webfiles.filename=? for update
(更多细节请参照我上面贴的我项目中的源代码)

对于oracle中的读(下载文件)
第一步。得到数据库中的BLOB类型的字段
oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("orderfile");
第二步。将blob作为输入流,再通过输出流输出即可

in = new BufferedInputStream(blob.getBinaryStream());   
byte[] buf = new byte[1024]; 
int hasRead=0;
while((hasRead=in.read(buf))>0)
{      
 sos.write(buf, 0, hasRead);
 

 //上传文件
 public synchronized  boolean insert_Wfiles(WebfilesBean wb) throws IOException, SQLException
 {  
   
  boolean flag=false;
  //
得到文件输入流
  String filePath = wb.getPath() + "//" + wb.getFilename();
  File f = new File(filePath);
  InputStream fis = new FileInputStream(f);
  //
定义输入流和输出流
  BufferedOutputStream out=null;
  BufferedInputStream in=null ;
  //
插入一个空的Blob
  String str1 = "insert into Webfiles(PATH,FILENAME,USERNAME,JOB_NO,ORDERFILE) values(?,?,?,?,EMPTY_BLOB())";  
  ResultSet rs=null;
  PreparedStatement pst = null;  
  try {

 

   //这里一定要手工设置控制事务

   conn.setAutoCommit(false);
   pst = conn.prepareStatement(str1);
   pst.setString(1,ConvertString.converString1(filePath));
   pst.setString(2, ConvertString.converString1(wb.getFilename()));
   pst.setString(3, ConvertString.converString1(wb.getUsername()));
   pst.setString(4, wb.getJobno());     
   pst.executeUpdate();
   
   
   String str2="select orderfile from Webfiles where Webfiles.job_no=? and Webfiles.filename=? for update";
   pst=conn.prepareStatement(str2);
   pst.setString(1, wb.getJobno()); 
   pst.setString(2, wb.getFilename());   
   rs=pst.executeQuery();
   while (rs.next())
   {     
    
    oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("orderfile");       
    
    out = new BufferedOutputStream(blob.getBinaryOutputStream());
    
    in = new BufferedInputStream(fis);
    int c;
    //
将实际文件中的内容以二进制的形式来输出到BLOB对象对应的输出流中
    while ((c=in.read())!=-1)
    {     
     out.write(c);
    }
    in.close();
    out.close();
   }   
    conn.commit();  
   if (f.exists())
    f.delete();   
   flag=true;
   return flag;
  } catch (SQLException e)
  {   
   conn.rollback();
   e.printStackTrace();
   System.out.println("
插入数据不成功");
   return false;
  } finally {
   pst.close();   
   fis.close();   
  }
 }
 
 
//下载文件
 public  void getdownFile1(String jobno,String filename,ServletOutputStream sos) throws Exception
 {  
  ResultSet rs=null;
  PreparedStatement pst = null;
  BufferedInputStream in=null;
  try
  {  
   //
这里一定要手工设置控制事务
   conn.setAutoCommit(false);
   String str="SELECT orderfile from Webfiles wf where wf.job_no=? and wf.filename=?";
   pst = conn.prepareStatement(str);
   pst.setString(1, jobno);
   pst.setString(2, filename);
   rs=pst.executeQuery();   
   while (rs.next())
   {   
    oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("orderfile");
    
    in = new BufferedInputStream(blob.getBinaryStream());   
    byte[] buf = new byte[1024]; 
    int hasRead=0;
    while((hasRead=in.read(buf))>0)
    {      
     sos.write(buf, 0, hasRead);
    }    
    in.close();
    sos.close();
   }
   conn.commit();
   conn.setAutoCommit(true);   
  }
  catch(Exception e)
  {
   conn.rollback();
   e.printStackTrace();
  }
  finally
  { 
   if (pst != null)
   {
    pst.close();
   } 
   if (rs != null)
   {
    rs.close();
   }   
  }  
 }
 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值