`

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存取图片或二进制数据的功能文件

    Oracle,SQL2000,MYSQL存取图片或二进制数据的功能文件,请配合相关的驱动包使用。

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

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

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    二进制数据类型 row 1~2000字节 可变长二进制数据,在具体定义字段的时候必须指明最大长度n long raw 1~2GB 可变长二进制数据 LOB数据类型 clob 1~4GB 只能存储字符数据 nclob 1~4GB 保存本地语言字符集数据 blob...

    经典SQL脚本大全

    │ │ 9.5.1 二进制文件存取示例(VB&VBA).vbs │ │ a.txt │ │ Schema.ini │ │ │ └─其他 │ bcp-数据导入导出(全).sql │ bcp-数据导入导出-二进制文件.sql │ bcp-数据导出为文件.sql │ bcp表数据存为XML....

    Sqlserver2000经典脚本

    -格式化.sql │ 得到一个字符串在另一个字符串中出现的次数.sql │ 数字转换成十六进制.sql │ 比较第一与第二个字符串,是否有连续的5个字符相同.sql │ 生成查询的模糊匹配字符串.sql │ 简繁...

    C#编程经验技巧宝典

    98 <br>0153 如何自定义数字小数点左边分组位数 98 <br>0154 格式化输入数据为货币格式 99 <br>0155 如何计算两个整数的乘积 99 <br>0156 如何将二进制数转换为十进制数 100 <br>0157 如何...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例223 以二进制形式上传文件到数据库 285 实例224 上传文件到服务器 287 实例225 限制上传文件的大小 288 实例226 限制上传文件的类型 291 实例227 上传多个文件到服务器 292 4.2 文件下载 294 实例228 通过链接...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例223 以二进制形式上传文件到数据库 285 实例224 上传文件到服务器 287 实例225 限制上传文件的大小 288 实例226 限制上传文件的类型 291 实例227 上传多个文件到服务器 292 4.2 文件下载 294 实例228 通过链接...

    计算机应用基础知识点总结.doc

    8、计算机指令定义 指令是对计算机进行程序控制的最小单元,是一种采用二进制表示的命令语言。一条指令 通常由两个部分组成,即操作码和操作数。 9、指令的执行过程。 10、什么是计算机软件 计算机软件是计算机系统中...

    JDBC 3.0数据库开发与设计

    目录 第1章 JDBC概述 1.1 JDBC简介 1.2 JDBC3.0规范 1.3 JDBC3.0 API的新特点 1.3.1 JDBC 3.0 API的一致性 ...9.3.2 将数据库的图象二进制数据显示成图片 9.4 Java开发中的其他技术 9.5 本章小结

    PHP基础教程 是一个比较有价值的PHP新手教程!

    你还可以自己编写外围的函数取间接存取数据库。通过这样的途径当你更换使用的数据库时,可以轻松的更改编码以适应这样的变化。PHPLIB就是最常用的可以提供一般事务需要的一系列基库。 - 可扩展性 就像前面说的那样...

    整理后java开发全套达内学习笔记(含练习)

    二进制是无法精确的表示 0.1 的。 进行高精度运算可以用java.math包中BigDecimal类中的方法。 自动类型提升又称作隐式类型转换。 强制类型转换:int ti; (byte) ti ; 强制转换,丢弃高位 宣告变量名称的同时...

Global site tag (gtag.js) - Google Analytics