对oracle中BLOB字段读写的总结

对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();
}
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值