`

oracle存取二进制文件(图片)

阅读更多
package cn.com.songjy.test.db;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class OracleLob {

	private static final Log log = LogFactory.getLog(OracleLob.class);

	private static final String id = "3";

	private static final BufferedInputStream bufferedInputStream = new BufferedInputStream(
			OracleLob.class.getClassLoader().getResourceAsStream(
					"cn/com/songjy/test/db/oracle.properties"));

	private static final Properties props = new Properties();

	static {
		try {
			props.load(bufferedInputStream);
			Class.forName(props.getProperty("driver"));
		} catch (IOException e) {
			log.error(e.getMessage(), e);
		} catch (ClassNotFoundException e) {
			log.error(e.getMessage(), e);
		} finally {
			try {
				if (null != bufferedInputStream)
					bufferedInputStream.close();
			} catch (IOException e) {
				log.error(e.getMessage(), e);
			}
		}
	}

	public Connection getConnection() throws SQLException {
		return DriverManager.getConnection(props.getProperty("url"),
				props.getProperty("user"), props.getProperty("password"));
	}

	/**
	 * 保存图片到oracle库中
	 * 
	 * @throws SQLException
	 * @throws IOException
	 */
	public void save_blob() throws SQLException, IOException {
		PreparedStatement preparedStatement = null;
		Connection connection = null;
		ResultSet resultSet = null;
		try {

			/* 先保存空blob */
			connection = getConnection();
			connection.setAutoCommit(false);// 必须设置为false,即开启事务!

			preparedStatement = connection
					.prepareStatement("INSERT INTO testblob(id,image) VALUES(?,?)");

			preparedStatement.setString(1, id);
			// preparedStatement.setBlob(2, oracle.sql.BLOB.empty_lob());//empty_lob()已过期
			preparedStatement.setBlob(2, oracle.sql.BLOB.getEmptyBLOB());// 先存一个空blob,此方法在驱动jar包中

			// log.info(preparedStatement.executeUpdate() > 0 ? "保存空blob成功" : "保存空blob失败");

			if (preparedStatement.executeUpdate() > 0) {
				log.info("保存空blob成功,方法继续!");
			} else {
				log.info("保存空blob失败,方法返回!");
				connection.rollback();
				return;
			}

			/* 正式保存文件 */
			preparedStatement = connection.prepareStatement("SELECT image FROM testblob WHERE id = ? FOR UPDATE");// 须加for update,锁定该行,直至该行被修改完毕,保证不产生并发冲突
			preparedStatement.setString(1, id);

			resultSet = preparedStatement.executeQuery();

			while (true == resultSet.next()) {
				BufferedInputStream bufferedInputStream = null;
				try {
					bufferedInputStream = new BufferedInputStream(
							new FileInputStream(
									"src/main/java/cn/com/songjy/test/db/Jellyfish.jpg"));// 需要保存的文件路径

					Blob image = resultSet.getBlob("image");

					byte[] buffer = new byte[1024];// 每次读取/写入1k

					for (int len = 0; (len = bufferedInputStream.read(buffer)) > 0;) {
						image.setBytes(image.length() + 1, buffer, 0, len);// Blob第一个字节(byte)的位置是从1开始,所以需要+1
					}
				} finally {
					if (null != bufferedInputStream)
						bufferedInputStream.close();
				}

			}

			connection.commit();// 开启了事物,必须手动提交

		} finally {

			if (null != preparedStatement)
				preparedStatement.close();

			if (null != connection)
				connection.close();
		}
	}

	/**
	 * 从oracle库中获取图片
	 * 
	 * @throws SQLException
	 * @throws IOException
	 */
	public void query_blog() throws SQLException, IOException {
		PreparedStatement preparedStatement = null;
		Connection connection = null;
		ResultSet resultSet = null;

		try {
			connection = getConnection();
			preparedStatement = connection
					.prepareStatement("SELECT image FROM testblob WHERE id = ?");

			preparedStatement.setString(1, id);

			resultSet = preparedStatement.executeQuery();

			while (true == resultSet.next()) {
				BufferedInputStream bufferedInputStream = null;
				BufferedOutputStream bufferedOutputStream = null;
				try {
					bufferedInputStream = new BufferedInputStream(
							resultSet.getBinaryStream("image"));

					bufferedOutputStream = new BufferedOutputStream(
							new FileOutputStream(
									"src/main/java/cn/com/songjy/test/db/1.jpg"));// 读取后的保存图片路径

					byte[] buffer = new byte[1024];

					for (int len = 0; (len = bufferedInputStream.read(buffer)) > 0;) {
						bufferedOutputStream.write(buffer, 0, len);
						// bufferedOutputStream.flush();//关闭流时会自动刷新
					}
				} finally {
					if (null != bufferedOutputStream)
						bufferedOutputStream.close();
					if (null != bufferedInputStream)
						bufferedInputStream.close();
				}
			}
		} finally {

			if (null != resultSet)
				resultSet.close();

			if (null != preparedStatement)
				preparedStatement.close();

			if (null != connection)
				connection.close();

		}
	}

	public static void main(String[] args) throws SQLException, IOException {
		// new OracleLob().save_blob();
		new OracleLob().query_blog();
	}
}

/*
 * 本次示例oracle版本是Oracle Database 11g Enterprise Edition Release
 * 11.2.0.1.0,上传的附件是oracle的驱动jar包
 */


相关阅读:

MySQL存取大文本及二进制文件(图片)
分享到:
评论

相关推荐

    Oracle,SQL2000,MYSQL存取图片或二进制数据的功能文件

    1. **Oracle存取图片或二进制数据** Oracle数据库使用BLOB(Binary Large Object)数据类型来存储图片或任何其他二进制数据。BLOB类型可以存储最大4GB的数据,足以容纳大多数图像文件。`OracleUploader.java`可能是...

    PB存取超过32k的二进制文件的实例 pb 10以上

    ### PB存取超过32k的二进制文件的实例详解 #### 一、引言 在PowerBuilder(简称PB)开发中,处理大文件尤其是超过32KB大小的二进制文件时,经常会遇到一些挑战。这是因为PB默认对二进制数据的处理有一定的限制。...

    Delphi将图片以二进制方式存储在数据库BLOB字段中.rar

    在"Delphi将图片以二进制方式存储在数据库BLOB字段中"的示例代码中,位于"useBlob"目录下的文件应该包含了以上所述的完整过程。通过分析和学习这段代码,你可以了解到如何在实际项目中应用这些技术。这不仅涉及到...

    图片以二进制存取数据库

    1. **读取图片文件**:使用编程语言(如Java、Python、C#)的内置函数读取图片文件,将其转换为二进制数据流。 2. **连接数据库**:建立与数据库的连接,这通常需要数据库驱动程序(如JDBC、ODBC)和正确的连接参数...

    Struts2,Hibernate3,Spring2实现oracle存取blob字段(图片等二进制文件)(原来2分的,现在免费了!!给评分哦!!)

    Struts2,Hibernate3,Spring2实现oracle存取blob字段(图片等二进制文件) Myeclipse6.0下开发 哈哈,原来2分的,现在免费了!!!!!!!!!!!!!!!!!!!!!!!!给评分哦!!!!!!!!!!!!!!!!

    Oracle存取文件

    ### Oracle存取文件知识点 #### 一、Oracle Blob数据类型简介 在Oracle数据库中,Blob(Binary Large Object)是一种专门用于存储二进制大数据的对象类型,它可以有效地存储诸如图像、音频文件、视频文件以及任何其他...

    用ASP.NET 2.0在Oracle中存取图片(文件)的操作

    尽管通常建议将大型文件存储在文件系统中以提高性能,但在某些情况下,如需增强安全性或简化数据管理,将图片或文件作为二进制数据存储在数据库中可能是更优的选择。 #### 创建数据库表 首先,我们需要在Oracle...

    图片存入Oracle中,用clob和blob两种方式

    - **保存图片**:将二进制流写入文件,生成图片。 5. **使用工具**: 提供的"**ClobAndBlob**"可能是一个实现上述功能的小工具,它简化了图片存取的过程,提供了对两种方式的接口。用户可以通过这个工具方便地将...

    C#在oracle中存取图片(web版)

    标签"oracle存取图片"和"C#"进一步强调了主要的技术点。使用C#访问Oracle数据库时,需要引用Oracle的数据提供者,配置连接字符串,然后使用ADO.NET对象,如OracleCommand和OracleDataReader,来执行SQL命令和处理...

    网页在Oracle中存取图片

    1. 文件上传:用户通过网页上传图片,文件会被转化为二进制流或者Base64编码。 2. JDBC操作:使用Java的JDBC驱动程序,将图片数据插入到Oracle数据库的BLOB字段中。涉及SQL语句执行,以及PreparedStatement的...

    vc 存取数据库中的图片实例

    5. **读取图片**:首先,从本地文件系统加载图片,可以使用CFile类读取图片文件内容到内存缓冲区。然后,将这个缓冲区的数据插入到`ImageData`字段。 6. **存储图片**:使用SQL INSERT语句将二进制数据写入数据库。...

    从oracle数据库中存取图片

    1. **加载图片文件**:首先通过`FileInputStream`类读取本地磁盘上的图片文件。 2. **注册Oracle驱动**:使用`Class.forName()`方法注册Oracle JDBC驱动。 3. **建立数据库连接**:通过`DriverManager.getConnection...

    在Oracle中存取BLOB对象实现文件的上传和下载.txt

    ### 在Oracle中存取BLOB对象实现文件的上传和下载 #### 核心知识点解析: **一、BLOB数据类型简介** BLOB(Binary Large Object)是数据库中的二进制大对象类型,主要用于存储大量二进制数据,如图像、音频、视频等...

    Oracle数据库图像存取技术.pdf

    4. Bfile(Binary File,二进制文件):允许对Oracle数据库之外存储的大型二进制文件进行只读形式的访问。与前三种lob类型不同,Bfile存储的数据在一个单独的文件系统文件中,该文件不由Oracle数据库维护。 在...

    oracle 资料--图片存取

    Oracle提供了多种方式来处理这样的二进制大数据,使得我们能够有效地管理图片和其他非结构化数据。以下是一些关于在Oracle中处理图片存取的关键知识点: 1. **BLOB类型**: Oracle数据库支持BINARY LARGE OBJECT...

    使用JDBC存取ORACLE数据库中的图片数据.pdf

    在Oracle中,LONG RAW类型用于存储原始二进制数据,而BLOB(Binary Large Object)用于存储可变长度的二进制数据,如图像、音频或视频文件。这两种数据类型使得Oracle能够管理和处理多媒体数据。 JDBC是Java中用于...

    Excel文件在Oracle上的存取技术.pdf

    Oracle数据库提供了对大对象的存储支持,如CLOB、NCLOB用于存储文本数据,而BLOB和BFILE则用于存储二进制数据,如Excel文件。 文章作者赵鲁东指出,在开发油田作业设备综合评价系统时,面临的问题是Excel文件的存储...

    Word文件在Oracle中存取技术的设计与实现.pdf

    由于Word文件通常包含文本、图片、表格等复杂元素,因此它们属于二进制数据,应使用BLOB类型存储。在Oracle中定义BLOB字段后,可以通过特定的API和方法来读写这些字段中的数据。 在VB6中,可以利用ADO(ActiveX ...

    Visual Basic 2005文件IO与数据存取秘诀(数据库连接)

    2. **二进制文件操作**:`FileStream`类用于处理二进制文件,可以读取或写入任何类型的数据。`BinaryReader`和`BinaryWriter`是其配套的读写工具。 3. **文件流操作**:`FileStream`不仅用于二进制文件,还可以与...

Global site tag (gtag.js) - Google Analytics