`

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());
	}
分享到:
评论

相关推荐

    c#数据库操作二进制存取图片源码.rar

    "c#数据库操作二进制存取图片源码.rar"这个压缩包文件显然包含了一个示例项目,展示了如何在C#中将图片以二进制形式存储到数据库,并进行读取。这种做法通常用于存储无法直接作为文本的非结构化数据。 首先,我们来...

    ExcelVBA操作MySQL

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

    MySQL 字符串类型.pdf

    * MEDIUMBLOB:MEDIUMBLOB 类型是 MySQL 中的一种二进制字符串类型,长度范围从 0 到 16777215 bytes。 * LONGBLOB:LONGBLOB 类型是 MySQL 中的一种二进制字符串类型,长度范围从 0 到 4294967295 bytes。 文本...

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

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

    DELPHI的CLOB和BLOB存取处理.zip_DELPHI的CLOB和BLOB存取处理_hallzgz

    CLOB主要用来存储大文本数据,如长篇文章、XML文档或JSON字符串,而BLOB则用于存储大量的二进制数据,如图像、音频、视频文件或者任何非文本的大型数据。在DELPHI中,通常会使用ADO(ActiveX Data Objects)或DBX...

    公文档案在MySQL数据库中的存取.pdf

    此时,需要调整MySQL配置,增加允许存储的文件大小,或者使用分块上传技术处理大文件。 总的来说,将公文档案存储在MySQL数据库中,能够实现高效的空间利用、便捷的文件管理和安全的访问控制。然而,这种方法对平台...

    delphi-picture-mysql.zip_MYSQL_delphi mysql

    1. 用户选择或捕获图片后,Delphi 应用程序会读取图片文件并将其转换为二进制数据。 2. 使用 Delphi 的数据库组件(如 TSQLQuery)构建 SQL 插入语句,将二进制数据插入到 MySQL 的 BLOB 字段。 3. 当需要显示图片时...

    VB多类图片数据库存取技巧.zip

    在数据库中,图片通常以二进制数据的形式存储,可以使用Binary字段类型。 2. 数据库连接:VB支持多种数据库引擎,如Access、SQL Server、MySQL等。使用ADO(ActiveX Data Objects)库,可以创建数据库连接,执行SQL...

    特殊数据类型处理——存取数据库中的图片

    BLOB是一种特殊的数据库数据类型,用于存储大块的二进制数据,如图片、音频或视频文件。 1. **图片数据类型**:大多数关系型数据库系统,如MySQL、PostgreSQL和Oracle,都提供了BLOB或与其类似的二进制数据类型来...

    mysql,sqlserver,oracle三种数据库的大对象存取解析.docx

    在SQL Server中,大对象通常使用IMAGE数据类型来存储,它可以存储任意二进制数据,与MySQL的BLOB类似。与MySQL不同的是,SQL Server没有提供特定的文本大对象类型,而是使用VARBINARY(MAX)来处理大的文本数据。存取...

    数据库保存、读取图片

    在IT领域,数据库通常用于存储各种类型的数据,包括文本、数字以及二进制大对象(BLOB)。"数据库保存、读取图片"这个主题涉及到如何将图片这种非结构化的数据以有效的方式存入数据库,以及如何从数据库中检索并显示...

    C#+SQL实现图片存取

    在IT领域,数据库存储非文本数据,如图片、音频或视频文件,是常见的需求。本话题聚焦于如何使用C#编程语言与SQL数据库配合,实现图片的存储和检索。C#提供了丰富的类库和方法来处理文件操作和数据库交互,而SQL...

    存取数据库图片

    2. **图片存储**:当图片上传时,程序会读取图片文件的二进制数据,然后将其存储到数据库的BLOB字段中。这通常通过编程语言的数据库API完成,例如PHP的PDO,Java的JDBC,Python的sqlite3库等。 3. **数据库操作**:...

    将图片存入数据库,并从数据库中读取

    这是因为大多数关系型数据库系统,如MySQL、SQL Server或Oracle,不直接支持存储文件,而是以二进制大对象(BLOB,Binary Large Object)的形式存储非结构化数据,如图像。 2. **创建数据库表**:创建一个包含字段...

    C#2005文件IO与数据存取秘诀\C#2005文件IO与数据存取秘诀-第十二章

    `BinaryReader`和`BinaryWriter`用于处理二进制数据,而`TextReader`和`TextWriter`家族则处理字符数据。在处理大文件时,了解如何使用缓冲区和异步IO可以显著提高性能。 接下来,ADO.NET是.NET框架中用于访问...

    利用VB存取数据库中BLOB数据

    在IT领域,VB,全称Visual Basic,是一种由微软公司开发的可视化的编程工具,它以其易学易用的特点在编程界占据...理解并熟练掌握这些技巧,能帮助开发者有效地处理大数据量的二进制文件,实现更高效的数据存储和检索。

    MySQL数据库面试题(2022版)

    3. 字符串类型,如VARCHAR、CHAR、TEXT、BLOB,VARCHAR节省空间,用于可变长度字符串,CHAR用于固定长度字符串,TEXT和BLOB分别用于大量文本和二进制数据。 在数据库设计中,选择合适的数据类型既能节省存储空间,...

    《实战MATLAB之文件与数据接口技术》代码.zip

    在压缩包子文件的名称中,我们可以看到`.part1.rar`和`.part2.rar`,这表明原文件可能是一个大文件,被分割成了两个RAR分卷文件。在MATLAB中,虽然没有直接处理RAR或ZIP压缩文件的内置函数,但可以通过调用操作系统...

Global site tag (gtag.js) - Google Analytics