`

MySQL存取大文本及二进制文件(图片)

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

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
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 MySQLText {

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

	private static final String id = "2";

	private static final BufferedInputStream bufferedInputStream = new BufferedInputStream(
			MySQLText.class.getClassLoader().getResourceAsStream(
					"cn/com/songjy/test/db/mysql.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 {
		log.info(props.getProperty("url"));
		return DriverManager.getConnection(props.getProperty("url"),
				props.getProperty("user"), props.getProperty("password"));
	}

	// 使用JDBC保存大文本
	public void save_text() throws SQLException, IOException {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		BufferedReader bufferedReader = null;
		try {
			connection = getConnection();

			preparedStatement = connection
					.prepareStatement("INSERT INTO testclob(id,resume) VALUES(?,?)");

			preparedStatement.setString(1, id);

			File txt = new File(
					"src/main/java/cn/com/songjy/test/db/MySQLText.java");

			bufferedReader = new BufferedReader(new FileReader(txt));

			// preparedStatement.setCharacterStream(2, reader, txt.length());
			preparedStatement.setCharacterStream(2, bufferedReader);

			log.info(preparedStatement.executeUpdate() > 0 ? "保存文本成功"
					: "保存文本失败");
		} finally {
			if (null != bufferedReader)
				bufferedReader.close();
			if (null != preparedStatement)
				preparedStatement.close();
			if (null != connection)
				connection.close();
		}
	}

	// 使用JDBC查询大文本
	public void query_text() throws SQLException, IOException {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		try {
			connection = getConnection();

			preparedStatement = connection
					.prepareStatement("SELECT id,resume FROM testclob WHERE id = ?");

			preparedStatement.setString(1, id);

			resultSet = preparedStatement.executeQuery();

			while (true == resultSet.next()) {
				BufferedReader bufferedReader = null;
				BufferedWriter bufferedWriter = null;
				try {
					bufferedReader = new BufferedReader(
							resultSet.getCharacterStream("resume"));
					bufferedWriter = new BufferedWriter(
							new FileWriter(
									"src/main/java/cn/com/songjy/test/db/MySQLText.txt"));
					char[] buffer = new char[512];// 每次读取512个字符

					for (int len = 0; (len = bufferedReader.read(buffer)) > 0;) {
						bufferedWriter.write(buffer, 0, len);
					}
				} finally {
					if (null != bufferedWriter)
						bufferedWriter.close();
					if (null != bufferedReader)
						bufferedReader.close();
				}
			}

		} finally {

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

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

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

	// JDBC保存二进制数据
	public void save_binary_stream() throws SQLException, IOException {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		BufferedInputStream bufferedInputStream = null;

		try {

			File jpg = new File(
					"src/main/java/cn/com/songjy/test/db/Jellyfish.jpg");

			bufferedInputStream = new BufferedInputStream(new FileInputStream(
					jpg));

			connection = getConnection();

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

			preparedStatement.setString(1, id);
			// preparedStatement.setBinaryStream(2, inputStream, jpg.length());
			preparedStatement.setBinaryStream(2, bufferedInputStream);

			log.info(preparedStatement.executeUpdate() > 0 ? "图片保存成功"
					: "图片保存失败");

		} finally {
			if (null != bufferedInputStream)
				bufferedInputStream.close();// 记得关闭,否则可能导致该文件占用而影响其它操纵(删除等),可参阅//http://www.coder.xxx/archives/32.html

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

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

	// JDBC查询二进制数据
	public void query_binary_stream() throws SQLException, IOException {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;

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

			preparedStatement.setString(1, id);

			resultSet = preparedStatement.executeQuery();

			while (true == resultSet.next()) {
				BufferedOutputStream bufferedOutputStream = null;
				BufferedInputStream bufferedInputStream = 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];// 每次读取1k

					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 MySQLText().save_text();
		// new MySQLText().query_text();
		// new MySQLText().save_binary_stream();
		new MySQLText().query_binary_stream();
	}
}

/*
 * 
 * create table testclob
 * 
 * (
 * 
 * id varchar(40) primary key,
 * 
 * resume text
 * 
 * );
 * 
 * create table testblob
 * 
 * (
 * 
 * id varchar(40) primary key,
 * 
 * image MediumBlob
 * 
 * );
 */


备注:保存二进制文件时注意选择类型,详见mysql blob大小配置介绍



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

JDBC 学习笔记(二)—— 大数据+存储过程+批处理+事务管理

可能会遇到的问题:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException

Java读文件的一些归纳总结

InputStream未关闭导致文件被占用从而引发的问题

BufferedInputStream与BufferedOutputStream的使用
	public void resource() throws IOException {

		Resource resource = new UrlResource(
				"http://127.0.0.1:8008/monitor/file/navicat8_mysql_cs.exe");

		System.out.println(resource.getFilename());

		File f = new File(resource.getFilename());

		System.out.println(f.length());

		InputStream src_in = resource.getInputStream();

		BufferedInputStream in = new BufferedInputStream(src_in);

		byte[] temp = new byte[1024];

		BufferedOutputStream out = new BufferedOutputStream(
				new FileOutputStream(f));

		while (-1 != (in.read(temp))) {
			out.write(temp);
		}

		out.flush();

		out.close();
		in.close();
		src_in.close();

		System.out.println(f.length());
	}
分享到:
评论

相关推荐

    ExcelVBA操作MySQL

    1. ExcelVBA操作MySQL之一——准备工作 2. ExcelVBA操作MySQL之二——链接MySQL ...14. ExcelVBA操作MySQL之十四——AppendChunk、 GetChunk存取文本和图片二进制数据 15. ExcelVBA操作MySQL之十五——使用ADODB.Stream

    MYSQL

    4.14 TcX 二进制代码 4.15 安装后期(post-installation)的设置与测试 4.15.1 运行mysql_install_db 的问题 4.15.2 启动 MySQL 服务器的问题 4.15.3 自动启动和停止 MySQL 4.15.4 选项文件 ...

    MySQL中文参考手册.chm

    12 MySQL 实用程序 12.1 各种 MySQL 程序概述 12.2 管理一个 MySQL 服务器 12.3 从 MySQL 数据库和表中倒出(dump)结构和数据 12.4 从文本文件导入数据 12.5 MySQL 压缩只读表生成器 ...

    MySQL中文参考手册

    o 4.6 安装MySQL二进制代码分发 + 4.6.1 Linux RPM注意事项 + 4.6.2 构造客户程序 + 4.6.3 系统特定的问题 # 4.6.3.1 Linux 注意事项 # 4.6.3.2 HP-UX 注意事项 o 4.7 安装 MySQL源代码分发 + 4.7.1 快速...

    经典SQL脚本大全

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

    cmd操作命令和linux命令大全收集

    get server.exec:server.exe 登陆后,将“IP”的server.exe下载到目标主机c:server.exe 参数:-i指以二进制模式传送,如传送exe文件时用,如不加-i 则以ASCII模式(传送文本文件模式)进行传送 tftp -i 对方IP put...

    Python Cookbook

    1.11 检查一个字符串是文本还是二进制 23 1.12 控制大小写 25 1.13 访问子字符串 26 1.14 改变多行文本字符串的缩进 29 1.15 扩展和压缩制表符 31 1.16 替换字符串中的子串 33 1.17 替换字符串中的子串-Python...

    入门学习Linux常用必会60个命令实例详解doc/txt

    Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不开使用系统提供的命令。要想真正理解Linux系统,就必须从Linux...

    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 通过链接...

    Sqlserver2000经典脚本

    介绍就不多说了,下边是部分目录,觉得有用的话就顶一个 C:. │ sqlserver2000.txt │ ├─第01章 │ 1.9.1 设置内存选项.sql │ 1.9.2(2) 使用文件及文件组.sql │ 1.9.2(3) 调整...

    Linux操作系统基础教程

    二.安装Linux的好处?.........................................................................................................3 三.如何得到Linux?.......................................................

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

    你可以利用PHP连接包括Oracle,MS-Access,Mysql在内的大部分数据库。你可以在苍蝇上画图,编写程序下载或者显示e-mail。你甚至可以完成网络相关的功能。最好的是,你可以选择你的PHP安装版本需要哪些功能。引用...

Global site tag (gtag.js) - Google Analytics