### JDBC中如何处理Oracle BLOB字段 在Java开发过程中,特别是在使用JDBC(Java Database Connectivity)与Oracle数据库交互时,处理BLOB(Binary Large Object)类型的数据是一项常见的需求。BLOB通常用于存储大量的二进制数据,如图像、音频或视频文件等。本文将详细介绍在Java JDBC环境下处理Oracle BLOB字段的方法。 #### 一、使用JDK自带方法处理BLOB 在处理Oracle BLOB数据时,可以利用JDK提供的`ResultSet`类中的`getBlob()`方法和`PreparedStatement`类中的`setBlob()`方法来实现对BLOB类型的读取和写入操作。具体步骤如下: 1. **读取BLOB数据**:通过`ResultSet.getBlob()`方法获取BLOB对象。 2. **写入BLOB数据**:使用`PreparedStatement.setBlob()`方法设置BLOB参数。 这些方法在不同的JDK版本中可能会有所不同,例如,在Sun公司的JDK中可能会有特定的实现方式。 #### 二、使用流(Stream)处理BLOB 另一种处理BLOB的方式是通过使用`ResultSet.getBinaryStream()`和`PreparedStatement.setBinaryStream()`方法,这两种方法提供了更灵活的方式来读取和写入BLOB数据。 1. **读取BLOB数据**:可以通过`ResultSet.getBinaryStream()`方法获取输入流(InputStream),然后使用该流来读取BLOB数据。 2. **写入BLOB数据**:使用`PreparedStatement.setBinaryStream()`方法设置输出流(OutputStream),将数据写入到数据库中。 这种方式适用于需要处理大文件的情况,因为它避免了一次性将所有数据加载到内存中。 #### 三、插入BLOB数据 当需要向Oracle数据库中插入包含BLOB数据的记录时,可以采用以下步骤: 1. **插入空BLOB**:创建一个空的BLOB对象,然后将其插入到数据库表中。 ```sql INSERT INTO xxx_table (A, B, C) VALUES (empty_blob(), 'xxx', 'yyyy'); ``` 2. **更新BLOB数据**: - 设置`Connection`的自动提交为`false`,避免出现`fetch out of sequence`异常。 - 在查询BLOB数据之前加上`FOR UPDATE`子句,确保锁定包含LOB值的行。 - 获取BLOB对象,并通过`getBinaryOutputStream()`方法获取输出流。 - 使用`BufferedInputStream`和`BufferedOutputStream`分别从文件中读取数据并写入到输出流中。 - 关闭输出流、输入流以及释放其他资源。 - 提交事务,并恢复`Connection`的自动提交状态。 #### 四、更新BLOB数据 更新已存在的BLOB数据时,可以遵循类似的步骤: 1. **获取BLOB对象**:首先查询出需要更新的BLOB数据。 2. **更新BLOB数据**: - 如果需要覆盖原有BLOB数据,则先清空原有数据。 - 使用`getBinaryOutputStream()`获取输出流,并将新数据写入到输出流中。 - 提交事务。 #### 五、获取BLOB数据 如果需要从数据库中获取BLOB数据,可以按照以下步骤进行: 1. **设置Connection**:设置`Connection`的自动提交为`false`。 2. **查询BLOB数据**:执行SQL查询语句,并加上`FOR UPDATE`子句。 3. **读取BLOB数据**:通过`ResultSet.getBlob()`获取BLOB对象,再通过`getBinaryStream()`获取输入流。 #### 六、注意事项 在处理BLOB数据时需要注意以下几点: 1. **Connection的自动提交设置**:在进行BLOB数据的读取或写入操作前,应将`Connection`的自动提交设为`false`,并在操作完成后提交事务。 2. **锁定问题**:为了防止并发访问引起的问题,查询BLOB数据时应使用`FOR UPDATE`子句。 3. **资源管理**:确保正确关闭所有的输入流、输出流以及释放其他资源。 #### 结论 在Java JDBC环境中处理Oracle BLOB字段时,可以通过多种方式进行,包括使用JDK自带的API、使用流技术等。选择哪种方式取决于具体的应用场景和个人偏好。无论采用何种方法,都需要关注事务管理、资源管理和并发控制等方面,以确保数据的一致性和安全性。
jdbc中如何处理Oracle BLOB字段
为什么我要写这篇文章?
在前段时间我所在的项目中,就碰到了这个问题,我花了2天的时间才将BLOB的问题搞定。我也尝试过网上所介绍的各种方法,那些方法所
使用的原理都一致,但都写得不完整,我也按照网上介绍的方法做了,但都因为其中一些没有提到的小的细节而失败。希望看到这篇文章的人
都不再走弯路。
一般人会走哪些弯路?
1.使用jdk中的方法进行传输。在ResultSet 中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多数人都会尝试setBlob
(),getBlob() 进行读写,或者两个数据库之间BLOB的传输。这种方法实际上是行不通的,据网上的一些资料介绍,说sun官方的文档有些方法
都是错误的。
2.使用ResultSet.getBinaryStream 和PreparedStatement.setBinaryStream对BLOB进行读写或两个数据库间的传输。这种方法我自己尝试过,
发现,如果BLOB中存储的是文本文件的话,就没问题,如果是二进制文件,传输就会有问题。
根据自己的经验,以及查阅了Oracle的官方文档,都是使用如下处理方法:
1.新建记录,插入BLOB数据
1.1首先新建记录的时候,使用oracle的函数插入一个空的BLOB,假设字段A是BLOB类型的:
insert xxxtable(A,B,C) values(empty_blob(), 'xxx ', 'yyyy ')
1.2后面再查询刚才插入的记录,然后更新BLOB,在查询前,注意设置Connection的一个属性:
conn.setAutoCommit(false);如果缺少这一步,可能导致fetch out of sequence等异常.
1.3 查询刚才插入的记录,后面要加“ for update ”,如下:
select A from xxxtable where xxx=999 for update ,如果缺少for update,可能出现row containing the LOB value is not locked
- 粉丝: 12
- 资源: 31
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Java开发的日程管理FlexTime应用设计源码
- SM2258XT-BGA144-4BGA180-6L-R1019 三星KLUCG4J1CB B0B1颗粒开盘工具 , EC, 3A, 94, 43, A4, CA 七彩虹SL300这个固件有用
- GJB 5236-2004 军用软件质量度量
- 30天开发操作系统 第 8 天 - 鼠标控制与切换32模式
- spice vd interface接口
- 安装Git时遇到找不到`/dev/null`的问题
- 标量(scalar)、向量(vector)、矩阵(matrix)、数组(array)等概念的深入理解与运用
- 数值计算复习内容,涵盖多种方法,内容为gpt生成
- 标量(scalar)、向量(vector)、矩阵(matrix)、数组(array)等概念的深入理解与运用
- 网络综合项目实验12.19