使用JAVA读取ORACLE_BLOB字段实现上传下载

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

大对象类型BLOB全称为Binary Large Objects,即二进制大对象。可以把BLOB区别为三种形式:声像数据、二进制数据和大文本数据。因此,最常见的应用就是存储图形、声音等对象,此外大二进制对象、OLE对象也可以通过BLOB类型存入数据库,如果文本对象过大,超出了文本类型的规定长度,则必须用BLOB字段进行存储。我们在经常使用的编程环境中并不能直接支持BLOB字段,因此需要调用相应的函

数完成BLOB的使用。

二实际Struts项目的处理流程

1 插入BLOB字段的流程

表示层:

上传使用struts的标签,提交给指定处理的Action,在ActionForm中

使用struts自带的FormFile

来保存文件。

核心代码:

....省略

控制层:

在Action中将传入的ActionForm中的文件字段赋给VO值对象,并调用业务代理类的上传方法。

核心代码:

//新增

if(actionType.equals("insert")) {

//得到文件类型

int iFileType = this.getFileType(drawingInputForm.getFileExtendName());

if(iFileType == 0) {

//不支持文件类型

this.addError(request, "drawing.errors.upload.UnSupportedFileType");

} else {

DrawingVO objDrawingVO = new DrawingVO();

//图纸基本属性

objDrawingVO.setDrawingName(drawingInputForm.getDrawingName());

...省略其他set方法

//执行新增(上传)

int iRt = objDrawingMan.insertDrawing(objDrawingVO);

...省略

}

Facade门面:

通过业务代理类调用DAO中的上传方法,对客户端完全透明。

public int insertDrawing(DrawingVO 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 int 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(false);

//插入空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.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";

//读出记录以增加图片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.getBinaryOutputStream();

InputStream fin = drawingFile.getInputStream();

logger.debug("开始分配缓存");

byte[] b = new byte[blob.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.close();

mit();

} catch(Exception ex) {

...省略

}finally {

DBUtil.destroyDB(rs, pstmt, conn);

}

return iKey;

}

2 读取BLOB字段的流程

从数据库中读出BLOB数据没有上述由于连接池的不同带来的差异,程序流程同插入BLOB字段,但是读BLOB就不用那么复杂了,只需要J2SE的标准类java.sql.Blob就可以取得输出流。

相关文档
最新文档