ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:23.35KB ,
资源ID:4768122      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4768122.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(使用JAVA读取ORACLE BLOB字段实现上传下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

使用JAVA读取ORACLE BLOB字段实现上传下载.docx

1、使用JAVA读取ORACLE BLOB字段实现上传下载使用JAVA读取ORACLE BLOB字段实现上传下载大对象类型BLOB全称为Binary Large Objects,即二进制大对象。可以把BLOB区别为三种形式:声像数据、二进制数据和大文本数据。因此,最常见的应用就是存储图形、声音等对象,此外大二进制对象、OLE对象也可以通过BLOB类型存入数据库,如果文本对象过大,超出了文本类型的规定长度,则必须用BLOB字段进行存储。我们在经常使用的编程环境中并不能直接支持BLOB字段,因此需要调用相应的函数完成BLOB的使用。二 实际Struts项目的处理流程1 插入BLOB字段的流程表示层:上

2、传使用struts的标签,提交给指定处理的Action,在ActionForm中使用struts自带的FormFile来保存文件。核心代码:.省略控制层:在Action中将传入的ActionForm中的文件字段赋给VO值对象,并调用业务代理类的上传方法。核心代码: /新增 if(actionType.equals(insert) /得到文件类型 int iFileType = this.getFileType(drawingInputForm.getFileExtendName(); if(iFileType = 0) /不支持文件类型 this.addError(request, drawi

3、ng.errors.upload.UnSupportedFileType); else DrawingVO objDrawingVO = new DrawingVO(); /图纸基本属性 objDrawingVO.setDrawingName(drawingInputForm.getDrawingName(); .省略其他set方法 /执行新增(上传) int iRt = objDrawingMan.insertDrawing(objDrawingVO); .省略 Facade门面:通过业务代理类调用DAO中的上传方法,对客户端完全透明。 public int insertDrawing(Dr

4、awingVO drawingVO) throws ComtopModuleException try DrawingDAO drawingDAO = new DrawingDAO(); return drawingDAO.insertDrawing(drawingVO); catch(DrawingException ex) throw new ComtopModuleException(drawing.errors.insert, ex); 持久层:DAO中实现和ORACLE数据库的底层交涉,完成真正的文件上传。需要先插入一个空BLOB对象,然后Update这个空对象。 public in

5、t insertDrawing(DrawingVO drawingVO) throws DrawingException PreparedStatement pstmt = null; Statement stmt = null; Connection conn = null; int iKey = 0; ResultSet rs = null; /定义SQL语句 String strSQLInsert = null; String strSQLUpdate = null; try conn = dataSource.getConnection(); conn.setAutoCommit(fa

6、lse); /插入空BLOB,empty_blob(),其中表中的Content是BLOC类型字段 strSQLInsert = insert into PROD_DRAWING (DRAWING_ID, DRAWING_NAME, 省略. + CONTENT) + values (?, ?, 省略., empty_blob(); /得到待处理文件 FormFile drawingFile = drawingVO.getDrawingFile(); /插入普通字段 pstmt = conn.prepareStatement(strSQLInsert); /得到主键 iKey = Toolkit

7、.getInstance().getNextKey(DrawingInfo.ID_STORE_KEY_DRAWING); pstmt.setInt(1, iKey); .省略其他set方法 pstmt.executeUpdate(); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); strSQLUpdate = SELECT CONTENT FROM PROD_DRAWING WHERE DRAWING_ID = + iKey + + FOR UPDATE;

8、/读出记录以增加图片Blob字段 rs = stmt.executeQuery(strSQLUpdate); if(rs.next() logger.debug(开始写入BLOB); /这里不能用oracle.sql.BLOB,会报ClassCast异常 weblogic.jdbc.vendor.oracle.OracleThinBlob blob = (weblogic.jdbc.vendor. oracle. OracleThinBlob)rs.getBlob(1); logger.debug(得到输出流); OutputStream outStream = blob.getBinaryO

9、utputStream(); InputStream fin = drawingFile.getInputStream(); logger.debug(开始分配缓存); byte b = new byteblob.getBufferSize(); int len = 0; while(len = fin.read(b) != -1) logger.debug(正在写入BLOB流); outStream.write(b, 0, len); logger.debug(关闭所有流); fin.close(); outStream.flush(); outStream.close(); rs.clos

10、e(); mit(); catch(Exception ex) .省略 finally DBUtil.destroyDB(rs, pstmt, conn); return iKey; 2 读取BLOB字段的流程从数据库中读出BLOB数据没有上述由于连接池的不同带来的差异,程序流程同插入BLOB字段,但是读BLOB就不用那么复杂了,只需要J2SE的标准类java.sql.Blob就可以取得输出流。DAO中的核心代码: public DrawingVO readDrawing(int drawingId) throws DrawingException PreparedStatement pstm

11、t = null; Connection conn = null; DrawingVO objDrawingVO = null; ResultSet rs = null; /定义SQL语句 String strSQL = SELECT * FROM PROD_DRAWING WHERE DRAWING_ID=?; try conn = dataSource.getConnection(); pstmt = conn.prepareStatement(strSQL); /设置参数 pstmt.setInt(1, drawingId); /执行查询 rs = pstmt.executeQuery(

12、); while(rs.next() objDrawingVO = new DrawingVO(); objDrawingVO.setDrawingId(rs.getInt(DRAWING_ID); objDrawingVO.setDrawingName(rs.getString(DRAWING_NAME); .省略其他set方法 /set BLOB到VO中 objDrawingVO.setContent(rs.getBlob(CONTENT); catch(Exception ex) .省略 finally DBUtil.destroyDB(rs, pstmt, conn); return

13、objDrawingVO; 这样,传到Action中VO对象就包含这个BLOB对象了,然后需要在Action中对该对象转为输入流,可以选择文件输出流或Servlet输出流,根据具体情况定,这里选择文件输出流。核心代码: private String getBlobToFile(Blob blob, DrawingVO objDrawingVO) throws Exception InputStream ins = blob.getBinaryStream(); /用文件模拟输出流 String strFileName = objDrawingVO.getDrawingName() + . +

14、objDrawingVO.getFileExtendName(); String strRootFilePath = this.getServlet().getServletContext().getRealPath(); String strFilePath = /temp/ + strFileName; String contextFilePath = strRootFilePath + strFilePath; /定义文件对象 File file = new File(this.getServlet().getServletContext().getRealPath() + /temp)

15、; if(!file.exists() file.mkdir(); /定义输出流 OutputStream fout = new FileOutputStream(contextFilePath, true); /下面将BLOB数据写入文件 byte b = new byte1024; int len = 0; while(len = ins.read(b) != -1) fout.write(b, 0, len); /依次关闭 fout.close(); ins.close(); return strFilePath; 最后,在Action中调用这个私有方法,完成读取操作。importjav

16、a.io.*;importjava.sql.*;publicclassBlobOperationpublicstaticvoidaddLob(longid,StringbinFile)throwsSQLExceptionConnectioncon=null;PreparedStatementps=null;ResultSetrs=null;trycon=ConnectionFactory.getConnection();/换成你自己取连接的方法con.setAutoCommit(false);Stringsql=INSERTINTOBlob_Tbl(id,binfile,bincontent)

17、;sql+=VALUES(?,?,?);ps=con.prepareStatement(sql);ps.setLong(1,id);ps.setString(2,binFile);ps.setBlob(3,oracle.sql.BLOB.empty_lob();ps.executeUpdate();/DatabaseUtils.closeObject(ps);ps=con.prepareStatement(SELECTbincontentFROMBlob_TblWHEREid=+id+forupdate);rs=ps.executeQuery();if(rs.next()oracle.sql.

18、BLOBbinContent=(oracle.sql.BLOB)rs.getBlob(1);/*writeblobcontent*/OutputStreambinOut=binContent.getBinaryOutputStream();BufferedOutputStreamout=newBufferedOutputStream(binOut);BufferedInputStreamin=newBufferedInputStream(newFileInputStream(binFile);intc;while(c=in.read()!=-1)out.write(c);in.close();

19、out.close();mit();catch(Exceptione)e.printStackTrace();trycon.rollback();catch(SQLExceptionse)thrownewSQLException(e.getMessage();finallyDatabaseUtils.closeObject(rs,ps,con);publicstaticvoidfetchLob(longid,Stringfilename)throwsSQLExceptionConnectioncon=null;Statementst=null;ResultSetrs=null;trycon=C

20、onnectionFactory.getConnection();Stringsql=SELECT*FromBlob_TblWhereid=+id;st=con.createStatement();rs=st.executeQuery(sql);while(rs.next()StringbinFile=rs.getString(binfile);oracle.sql.BLOBbinContent=(oracle.sql.BLOB)rs.getBlob(bincontent);/*readblobcontent*/BufferedOutputStreamout=newBufferedOutput

21、Stream(newFileOutputStream(filename);BufferedInputStreamin=newBufferedInputStream(binContent.getBinaryStream();intc;while(c=in.read()!=-1)out.write(c);in.close();out.close();catch(Exceptione)thrownewSQLException(e.getMessage();finallyDatabaseUtils.closeObject(rs,st,con);publicstaticvoidmain(Stringargs)throwsExceptionif(args.length=0)addLob(1,a.jpg);elsefetchLob(1,args0);package com.semovy.test;import java

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1