"这篇资源主要介绍了如何在Struts框架下使用JDBC操作Oracle数据库的Blob字段,用于存储和检索大对象数据。提供了实用的方法,并且包含详细的注释。" 在Java Web开发中,Struts是一个常用的MVC框架,而Oracle数据库则常常用于存储大量数据,包括大对象(LOB)如图片、视频等。Blob类型用于存储二进制大数据。这篇内容详细阐述了如何在Struts中通过JDBC与Oracle数据库交互,处理Blob字段。 首先,创建Oracle数据库表`cbh`,包含两个字段:`name`(varchar2类型,为主键且不允许为空)和`context`(Blob类型,用于存储大对象)。创建表的SQL语句如下: ```sql CREATE TABLE cbh ( name VARCHAR2(20) PRIMARY KEY NOT NULL, context BLOB ); ``` 为了在Struts应用中操作这个表,我们需要编写一个工具类,包含两个核心方法:`addFile`用于保存文件到Blob字段,`restoreFile`用于从Blob字段读取文件并输出到OutputStream。 `addFile`方法接收文件名(fileName)和文件输入流(InputStream),步骤如下: 1. 获取数据库连接(ConnectionFactory.getConnection())。 2. 关闭自动提交,以进行事务控制(con.setAutoCommit(false))。 3. 创建预编译的SQL语句(PreparedStatement),用于插入文件名和一个空的Blob值("insert into cbh(filename, contexts) VALUES (?, empty_blob())")。 4. 执行插入操作,关闭PreparedStatement。 5. 预编译一个新的SQL语句,用于选择刚插入的记录并锁定它("select contexts from cbh WHERE filename=? for update")。 6. 执行查询,获取结果集,如果存在记录,则获取Blob对象。 7. 使用Blob对象的`setBinaryStream`方法获取OutputStream,然后通过BufferedInputStream和BufferedOutputStream将输入流的数据写入Blob。 `restoreFile`方法接收文件名和OutputStream,用于读取Blob内容并写入OutputStream。大致流程是: 1. 获取数据库连接,创建PreparedStatement,选择对应文件名的Blob记录。 2. 执行查询,获取结果集,如果存在记录,获取Blob对象。 3. 使用Blob对象的`getBinaryStream`方法获取InputStream,通过BufferedInputStream和BufferedOutputStream将Blob内容读取出来并写入指定的OutputStream。 通过这种方式,Struts应用可以方便地在Oracle数据库中存储和检索大文件,确保了数据的完整性和一致性。这个方法对于处理如用户上传的文件等大数据量的场景非常实用。由于有详细的注释,开发者可以更容易地理解和应用这些代码。
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页未读,继续阅读
- 粉丝: 1
- 资源: 38
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Unity UGUI性能优化实战:UGUI_BatchDemo示例
- Java实现小游戏飞翔的小鸟教程分享
- Ant Design 4.16.8:企业级React组件库的最新更新
- Windows下MongoDB的安装教程与步骤
- 婚庆公司响应式网站模板源码下载
- 高端旅行推荐:官网模板及移动响应式网页设计
- Java基础教程:类与接口的实现与应用
- 高级版照片排版软件功能介绍与操作指南
- 精品黑色插画设计师作品展示网页模板
- 蓝色互联网科技企业Bootstrap网站模板下载
- MQTTFX 1.7.1版:Windows平台最强Mqtt客户端体验
- 黑色摄影主题响应式网站模板设计案例
- 扁平化风格商业旅游网站模板设计
- 绿色留学H5模板:科研教育机构官网解决方案
- Linux环境下EMQX安装全流程指导
- 可爱卡通儿童APP官网模板_复古绿色动画设计