`

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

相关推荐

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

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

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

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

    vb.net 使用Access数据库保存和读取图片文件

    保存图片至数据库涉及读取图片文件,将其转换为字节数组,然后将该数组存储在数据库的二进制字段中。以下代码片段展示了如何实现这一过程: ```vbnet Dim openFileDialog1 As New OpenFileDialog() If ...

    MySQL 字符串类型.pdf

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

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

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

    SQL数据库里存取图片

    图片在数据库中通常以二进制形式存储,而非直接以文件系统形式存储。接下来将深入探讨在SQL数据库中存取图片的概念、技术方法和实践操作。 ### 知识点一:图片存储的数据模型 首先需要明确的是,图片在数据库中是...

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

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

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

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

    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)来处理大的文本数据。存取...

    mysql,sqlserver,oracle三种数据库的大对象存取

    BLOB用于二进制大对象,CLOB用于字符大对象,NCLOB用于Unicode字符大对象。Oracle使用PL/SQL过程或Java的OracleCallableStatement来处理大对象。例如,使用PL/SQL的UTL_FILE包读写文件,或者在Java中使用...

    数据库保存、读取图片

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

    C#+SQL实现图片存取

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

    ExcelVBA操作MySQL

    - AppendChunk、GetChunk存取文本和图片二进制:解释了如何使用ADO对象的AppendChunk和GetChunk方法来处理大量文本和图片数据的存取。 - 使用ADODB.Stream数据:最后,作者提到了ADODB.Stream对象,这是处理二进制...

    存取数据库图片

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

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

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

Global site tag (gtag.js) - Google Analytics