### Struts 使用 JDBC 的 Blob 字段保存和读取 Oracle 数据库 #### 背景介绍 在企业级应用开发中,经常会遇到需要处理文件上传下载的情况。这些文件可能包括图片、文档等各种类型的数据。传统的做法是将文件保存到服务器的文件系统上,然后通过路径或者URL来引用这些文件。然而,在某些情况下,比如需要跨服务器同步数据时,将文件存储在数据库中就显得非常必要了。这种做法可以简化系统架构,并且方便进行数据备份和恢复。 #### 技术选型与原理 在Java EE开发中,Struts框架是常用的MVC框架之一,而JDBC则是访问关系数据库的标准API。Oracle数据库因其强大的功能和稳定性被广泛应用于企业级应用。Blob(Binary Large Object)是一种用于存储大量二进制数据的数据库字段类型,非常适合用来存储文件数据。本文将详细介绍如何使用Struts结合JDBC操作Oracle数据库中的Blob字段实现文件的保存和读取。 #### 代码分析 根据提供的部分代码示例,我们可以将其分为两个主要部分:文件保存和文件读取。 ##### 文件保存 文件保存的主要逻辑如下: 1. **获取数据库连接**:使用`ConnectionFactory.getConnection()`方法获得数据库连接。 2. **插入记录**: - 准备SQL语句,将文件名和一个空的Blob对象插入到数据库表中。 - 执行SQL语句并提交事务。 3. **更新Blob数据**: - 通过`SELECT contexts FROM cbh WHERE filename = ? FOR UPDATE`语句获取待更新的Blob字段。 - 将输入流中的数据写入Blob对应的二进制流中。 - 提交事务。 ```java public void addFile(String fileName, InputStream is) throws SQLException { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con = ConnectionFactory.getConnection(); con.setAutoCommit(false); String sql = "INSERT INTO cbh (filename, contexts) VALUES (?, empty_blob())"; ps = con.prepareStatement(sql); ps.setString(1, fileName); ps.executeUpdate(); ps.close(); ps = con.prepareStatement("SELECT contexts FROM cbh WHERE filename = ? FOR UPDATE"); ps.setString(1, fileName); rs = ps.executeQuery(); if (rs.next()) { Blob image = rs.getBlob(1); OutputStream out = image.setBinaryStream(0); BufferedOutputStream bufferedOut = new BufferedOutputStream(out); BufferedInputStream bufferedIn = new BufferedInputStream(is); int c; while ((c = bufferedIn.read()) != -1) { bufferedOut.write(c); } bufferedIn.close(); bufferedOut.close(); } con.commit(); } catch (Exception e) { // 处理异常... } finally { JdbcUtil.close(rs, ps, con); } } ``` ##### 文件读取 文件读取的主要逻辑如下: 1. **获取数据库连接**:同样使用`ConnectionFactory.getConnection()`方法获得数据库连接。 2. **查询Blob数据**: - 通过`SELECT contexts FROM cbh WHERE filename = ?`语句获取指定文件名的Blob数据。 - 从Blob对象中读取数据并写入输出流。 ```java public void restoreFile(String fileName, OutputStream os) throws SQLException { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con = ConnectionFactory.getConnection(); ps = con.prepareStatement("SELECT contexts FROM cbh WHERE filename = ?"); ps.setString(1, fileName); rs = ps.executeQuery(); while (rs.next()) { Blob image = rs.getBlob(1); BufferedOutputStream out = new BufferedOutputStream(os); BufferedInputStream in = new BufferedInputStream(image.getBinaryStream()); int c = 0; while ((c = in.read()) != -1) { out.write(c); } in.close(); out.close(); } } catch (Exception e) { throw new SQLException(e.getMessage()); } finally { JdbcUtil.close(rs, ps, con); } } ``` #### 总结 通过以上代码的解析,我们可以看到使用Struts结合JDBC操作Oracle数据库中的Blob字段来保存和读取文件是一种实用且有效的解决方案。这种方法不仅简化了文件管理流程,还提高了系统的灵活性和可维护性。开发者可以根据具体需求调整代码细节,以适应不同的应用场景。


















create table cbh(name varchar2(20) primary key not null,contexts blob);
其中用到了及个Utile 解释:
JdbcUtile 是用来关闭ResultSet ,Statement , Connection 资源。
ConnectionFactory这个类是用获得数据库连接的。
其中BlobService中有2个方法分别是addFile(String fileName,InputStream is)和
restoreFile(Stringfilename,OutputStream os)
分别介绍如下:
//把上传的文件的保存到数据库中:filename上传的文件名,is是用Struts的FormFile来获得一个输入流。
public void addFile(String fileName,InputStream is) throws SQLException
{
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try
{
con = ConnectionFactory.getConnection();
//事务管理
con.setAutoCommit(false);
String sql = "insert into cbh(filename, contexts)";
sql += " VALUES(?, empty_blob())";
ps = con.prepareStatement(sql);
ps.setString(1, fileName);
ps.executeUpdate();
ps.close();
//使用for update来锁定此字段
ps = con.prepareStatement("select contexts from cbh WHERE filename= ? for update ");
ps.setString(1, fileName);
rs = ps.executeQuery();
if (rs.next())
{
//获得第一个字段
Blob image = rs.getBlob(1);
//获得一个输出流
OutputStream out = image.setBinaryStream(0);
BufferedOutputStream bufferedOut = new BufferedOutputStream(out);
BufferedInputStream bufferedIn = new BufferedInputStream(is);
int c;
while ((c = bufferedIn.read()) != -1)
{
bufferedOut.write(c);
}
bufferedIn.close();
bufferedOut.close();
剩余7页未读,继续阅读

- youqiang032012-04-16内容写得比较详细,按照文档设置,成功下载
- 愤怒的咕噜噜2013-05-25挺实用的 开发中试试吧
- wh080836232013-01-21挺好的,有帮助到,谢谢了
- 绝版男子2013-07-02步骤挺详细的,不过我用这种方式没成功,可能跟我的ibatis版本有关,后来通过JDBC方式做了。
- herramadeus2013-03-13挺好的 有帮助

- 粉丝: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 电子商务项目采购管理.ppt
- 网络信息员培训.ppt
- 某厂房综合布线系统改造设计方案.doc
- 碳膜印制电路板数字扫描图像阈值分割算法研究.doc
- 计算机网络基础学习知识考试试题(最终).doc
- 通信工程概预算练习题模板.doc
- 如何利用PS软件对添减篡改图像进行鉴别.docx
- 微信小程序项目实施计划书.pdf
- 网络安全宣传标语.docx
- 分组密码算法和流密码算法的安全性分析.doc
- 语音模式识别与声控智能家居设想.doc
- (源码)基于Python和Arduino的面部识别考勤系统.zip
- 税务系统网络与信息安全技术培训班.pptx
- 高校信息化解决方案PPT课件.ppt
- 如何做好油田地面建设工程施工项目管理.docx
- 一页纸项目管理PPT课件.ppt


