概述】
Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据。
写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对
blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢?
这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor
用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正地写入blob数据了。
【处理流程】
--Oracle中的Lob类型示例表
create table user_info
(
user_id number(10) primary key,
name varchar2(20),
image blob
);
--1. 插入空blob: (如果在数据库中采用默认值方式对Blob字段赋值, 此步可省略)
insert into user_info values (1, 'Jacky', empty_blob());
--2. 获得blob的cursor:
select image from user_info where user_id = ? for update;
--3. 用cursor往数据库写数据:
update user_info set image = ? where user_id = ?;
-
packagedemo;
-
-
importjava.sql.*;
-
importjava.io.*;
-
-
publicclassReadBlob
- {
-
static
- {
-
//读取Blob数据
package demo;
import java.sql.*;
import java.io.*;
public class ReadBlob
{
//加载驱动程序
static
{
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args)
{
try
{
//1. 建立连接
String url = "jdbc:oracle:thin:@localhost:1521:OracleDB";
Connection conn = DriverManager.getConnection(url,"scott","tiger");
conn.setAutoCommit(false);
//2. 查询数据
String sql = "select image from user_info where user_id = 1";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
//3. 读取Blob类型数据
Blob blob = null;
if(rs.next())
{
blob = rs.getBlob(1);
}
byte[] temp = new byte[(int)blob.length()];
InputStream in = blob.getBinaryStream();
in.read(temp)s
//保证文件名唯一,你可以用主键+时间啊等等方法
File file = new File("D:\\img.bmp");
FileOutputStream fout = new FileOutputStream(file);
fout.write(temp);
in.close();
fout.close();
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
-
packagedemo;
-
-
importjava.sql.*;
-
importoracle.sql.BLOB;
-
importjava.io.*;
-
-
publicclassWriteBlob
- {
-
static
- {
- try
- {
- Class.forName("oracle.jdbc.driver.OracleDriver");
- }
-
catch(Exceptione)
- {
- e.printStackTrace();
- }
- }
-
publicstaticvoidmain(String[]args)
- {
- try
- {
- Stringurl="jdbc:oracle:thin:@localhost:1521:OracleDB";
- Connectionconn=DriverManager.getConnection(url,"scott","tiger");
- conn.setAutoCommit(false);
-
- Stringsql="insertintouser_infovalues(?,?,empty_blob())";
- PreparedStatementps=conn.prepareStatement(sql);
- ps.setInt(1,1);
- ps.setString(2,"Lucy");
- ps.executeUpdate();
-
- sql="selectimagefromuser_infowhereuser_id=?";
- ps=conn.prepareStatement(sql);
- ps.setInt(1,1);
- ResultSetrs=ps.executeQuery();
- BLOBblob=null;
-
if(rs.next())
- {
- blob=(BLOB)rs.getBlob(1);
- }
-
- Filefile=newFile("D:\\iriver\\sample1.bmp");
- FileInputStreamfin=newFileInputStream(file);
-
byte[]temp=newbyte[fin.available()];
- fin.read(temp);
- OutputStreamout=blob.getBinaryOutputStream();
- out.write(temp);
- fin.close();
- out.close();
-
- sql="updateuser_infosetimage=?whereuser_id=?";
- ps=conn.prepareStatement(sql);
- ps.setBlob(1,blob);
- ps.setInt(2,1);
- ps.executeUpdate();
-
- conn.commit();
- }catch(Exceptione)
- {
- e.printStackTrace();
- }
- }
- }
分享到:
相关推荐
oracle 存读数据库的blob字段 .net有两种方式向Oracle的blob字段中存储图片:
标题提到的“基于.NET的Oracle BLOB数据高效存取方法”是一种针对Oracle数据库中BLOB类型数据存储和读取的优化策略。BLOB(Binary Large Object)是Oracle数据库中用于存储大量二进制数据的对象,常用于保存图像、...
首先需要在Oracle数据库中建立一个包含name和image blob两个字段的简单表结构,其中name字段用于保存图像的名称和路径,image字段则用于存储图像数据。建立相应的窗体和控件后,可以通过Delphi提供的数据访问和数据...
本篇将详细介绍如何使用JDBC(Java Database Connectivity)与Hibernate框架来操作Oracle数据库中的BLOB字段。 首先,Oracle数据库的BLOB字段提供了对大对象的高效存储,它的性能优于LONG字段,尤其适合存储大容量...
在实际操作中,可以通过Hibernate实现Oracle数据库中BLOB数据的存储和删除操作,然后利用Struts2框架展示这些BLOB数据。这样的结合,不仅可以提高开发效率,还能保证应用的性能和稳定性。 ### 实际操作步骤 在实际...
假设我们有一个包含BLOB字段的表`test_blob`: ```java String insertBlobSql = "INSERT INTO test_blob(id, blob_data) VALUES (?, ?)"; String selectBlobSql = "SELECT blob_data FROM test_blob WHERE id = ?";...
Struts2,Hibernate3,Spring2实现oracle存取blob字段(图片等二进制文件) Myeclipse6.0下开发 哈哈,原来2分的,现在免费了!!!!!!!!!!!!!!!!!!!!!!!!给评分哦!!!!!!!!!!!!!!!!
### Java存取Oracle Blob 字段详解 #### 一、Blob 和 BLOB 的区别 在处理 Oracle 数据库中的二进制大型对象(Binary Large Object,简称 Blob)时,开发者经常会遇到两个相似但不同的概念:`java.sql.Blob` 和 `...
Oracle 和 WebLogic 服务器在处理 BLOB(Binary Large Object)数据类型时,涉及的是数据库管理和Web应用程序中的数据存储与检索。BLOB 类型通常用于存储大量二进制数据,如图片、音频或视频文件。本篇文章将深入...
在数据库管理中,存储非结构化数据如图片、音频或视频文件时,通常会使用`CLOB`(Character Large Object)和`BLOB`(Binary Large Object)这两种数据类型。Oracle数据库系统支持这两种数据类型,用于存储大量文本...
在Oracle数据库中,BLOB字段可以用来存储不规则的大数据文件,比如文档和图像等,它能以二进制的形式存储大量字符型数据。 BLOB的存储优势主要体现在两个方面:便于管理和高可用性。因为BLOB数据与其它数据库表数据...
一是将图像文件存储在数据库内部,即直接将图像文件内容作为BLOB字段的值;二是存储图像的路径或URL,而不是实际的图像数据,这样图像文件可以存储在文件系统或其他云存储服务中,数据库只保存引用。 3. **数据库...
"Oracle在PB中用OLE存取blob类型数据" Oracle是在PowerBuilder(PB)中使用OLE存取Blob类型数据的解决方案。该解决方案主要涉及到PB中使用OLE存取Blob类型数据的方法,包括建立数据库表、创建PB库、设置数据库连接...
在Oracle中存储和读取图片数据时,可以使用PreparedStatement对象的`setBlob()`方法将图像数据写入BLOB字段,而`getBlob()`方法用于读取BLOB字段中的数据。此外,为了提高性能,可能需要关闭自动提交模式(`conn....
为了解决这些问题,他提出了将Excel文件直接存储在Oracle数据库的BLOB字段中的方案。 Oracle的BLOB类型允许存储高达4GB的二进制数据,适合Excel文件的存储需求。然而,由于BLOB数据的特殊性,不能像普通字段那样...
描述还提到了SQL文件,这可能是用来创建存储图片的Oracle表的脚本,通常包含创建表的语句,定义字段,尤其是BLOB字段,用于存储图片。 "两个页面"指的可能是一个Web应用程序,包括一个用于上传图片的界面和一个用于...
#### 二、文件上传至Oracle BLOB字段 **1. 直接操作数据库:** 对于直接与Oracle数据库交互的情况,可以采用以下步骤实现文件的上传功能: - **建立数据库连接:** - 导入必要的驱动程序。 - 使用`Class.for...
- CLOB字段可通过TField对象的AsWideString属性读取或设置,BLOB字段通过AsBlob属性。 - 读取大对象时,可以使用Stream对象,比如TMemoryStream,通过TField对象的LoadFromStream和SaveToStream方法实现数据的读写...
下面将详细阐述如何在Spring MVC的Controller层实现BLOB字段的图片存取。 首先,我们需要一个实体类,假设我们有一个`Picture`实体,包含一个BLOB类型的属性`imageData`来存储图片数据: ```java public class ...