设为首页 收藏本站
查看: 700|回复: 0

[经验分享] 对oracle中BLOB字段读写的总结

[复制链接]

尚未签到

发表于 2016-8-5 14:03:51 | 显示全部楼层 |阅读模式
对oracle中BLOB字段读写的总结


  
  最近两天,阿堂在处理将页面中的文件上传和下载时,要将页面上,客户选择的任意类型上传的文件,写入到oracle中的BLOB类型的字段中,同时,客户也能下载上传的多个任意类型的文件,遇到了一些问题,也到网上查了不少资料,感觉网上的资料都或多或少有些错务,最后通过自己的反复测试总算解决了,解决的过程中,还真有不少收获,这里还是写下来,和朋友们分享一下!
  以下是本人的几点总结,当然,上面的两个方法(上传和下载)中,本身已经加了注解了
1.个人感觉对于mysql中blob类型的字段,sql server中的image类型的字段,oracle中的blob类型的字段读写操作的方式是有区别的,既有相同点,也有不同点
2.mysql中的BLOB类型字段的读写,sql server中image类型的字段读写,oracle中的BLOB类型的字段的读写的比较(写对应的上传文件,读对应的下载文件)
对于mysql中的blob类型的字段和sql server中的image字段类型的写(文件上传),在插入insert操作时,
用pst.setBinaryStream(1, fis, int(f.length()))这种类似的写法,基本上就可以将数据插入到其BLOB类型的字段中去了。
对于mysql中的blob类型的字段和sql server中image字段的读(文件下载)
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();
}
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-253312-1-1.html 上篇帖子: [转]oracle的复合索引两个知识点 下篇帖子: Oracle SQL 跟踪 --- dbms_system.set_sql_trace_in_session
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表