`
周一Monday
  • 浏览: 345988 次
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC之处理大数据类型

阅读更多

这次以MySQL与Oralce为例。

 

先看表结构把:

------------------------处理大数对象-----------------

------------------------MySQL----------------------
--有4种text类型:tinytext、text、mediumtext和longtext
create table t_clob
(
	id		integer ,
	resume	longtext,
	primary key(id)
);

--有4种blob类型:tinyblob、blob、mediumblob和longblob
create table t_blob
(
	id		integer ,
	photo	longblob,
	primary key(id)
);


-----------------------Oracle------------------------
--clob
create table t_clob
(
	id		integer ,
	resume	clob,
	primary key(id)
);

--blob
create table t_blob
(
	id		integer ,
	photo	blob,
	primary key(id)
);

 

 

先考虑Clob类型的,下面的代码适用于MySQL与Oralce

 

package org.monday.demo;

import java.io.File;
import java.io.FileReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.junit.Test;
import org.monday.util.JdbcUtil;

/**
 * Clob大文本数据操作
 */
public class ClobMain {

	private static String INSERT_CLOB = "insert into t_clob(id,resume)values(?,?)";
	private static String SELECT_CLOB = "select * from t_clob where id=?";

	@Test
	public void insert() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
			File file = new File("src/电子商务.txt");
			Reader reader = new FileReader(file);
			conn = JdbcUtil.getConnection();
			pstmt = conn.prepareStatement(INSERT_CLOB);
			pstmt.setInt(1, 1);
			pstmt.setCharacterStream(2, reader, (int) file.length());
			pstmt.executeUpdate();
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			JdbcUtil.release(conn, pstmt, null);
		}
	}

	@Test
	public void read() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtil.getConnection();
			pstmt = conn.prepareStatement(SELECT_CLOB);
			pstmt.setInt(1, 1);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				Reader reader = rs.getCharacterStream("resume");
				PrintWriter out = new PrintWriter(System.out); // 打印到控制台
				// PrintWriter out= new PrintWriter("src/out.txt"); // 打印到文本
				try {
					int len = 0;
					char[] buffer = new char[1024];
					while ((len = reader.read(buffer)) > 0) {
						out.write(buffer, 0, len);
					}
				} finally {
					if (reader != null) {
						reader.close();
					}
					out.close();
				}
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			JdbcUtil.release(conn, pstmt, rs);
		}
	}
}

 

 

接下来是Blob类型,这个MySQL与Oracle还是有些不一样的。看仔细了。。

 

package org.monday.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.junit.Test;
import org.monday.util.JdbcUtil;

/**
 * Blob图片数据操作
 * MySQL与Oralce有所不同
 */
public class BlobMain {

	private static String INSERT_BLOB = "insert into t_blob(id,photo)values(?,?)";
	private static String SELECT_BLOB = "select * from t_blob where id=?";

	@Test
	public void insert() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
			File file = new File("src/王若琳.jpg");
			InputStream in = new FileInputStream(file);
			conn = JdbcUtil.getConnection();
			pstmt = conn.prepareStatement(INSERT_BLOB);
			pstmt.setInt(1, 1);
			pstmt.setAsciiStream(2, in, (int) file.length());
			pstmt.executeUpdate();
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			JdbcUtil.release(conn, pstmt, null);
		}
	}

	@Test
	public void read() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtil.getConnection();
			pstmt = conn.prepareStatement(SELECT_BLOB);
			pstmt.setInt(1, 1);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				InputStream in = rs.getBlob("photo").getBinaryStream();
				// 或者InputStream in = rs.getAsciiStream("photo"); 但是这个却Oralce不好用
				OutputStream out = new FileOutputStream("src/out.jpg");
				try {
					int len = 0;
					byte[] b = new byte[1024];
					while ((len = in.read(b)) > 0) {
						out.write(b, 0, len);
					}
				} finally {
					if (in != null) {
						in.close();
					}
					if (out != null) {
						out.close();
					}
				}
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			JdbcUtil.release(conn, pstmt, rs);
		}
	}

	
	/**
	 * Oralce插入Blob类型很特殊
	 */
	@Test
	public void insert_oralce() {

		// 插入Oralce用的
		String INSERT_BLOB_ORACLE = "insert into t_blob(id,photo)values(?,empty_blob())"; // empty_blob()固定的
		String SELECT_BLOB_ORACLE = "select * from t_blob where id=? for update"; // for update 固定的,不可去

		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			// 不用开启事务,网上传说要开启事务
			// conn.setAutoCommit(false);
			conn = JdbcUtil.getConnection();
			// 插入一个指针
			pstmt = conn.prepareStatement(INSERT_BLOB_ORACLE);
			pstmt.setInt(1, 1);
			pstmt.executeUpdate();

			// 读取插入的那个指针
			pstmt = conn.prepareStatement(SELECT_BLOB_ORACLE);
			pstmt.setInt(1, 1);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				InputStream in = new FileInputStream(new File("src/王若琳.jpg"));
				// 得到java.sql.Blob对象后强制转换为oracle.sql.BLOB
				oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("photo");
				OutputStream out = blob.getBinaryOutputStream();
				try {
					byte[] b = new byte[blob.getBufferSize()];
					int len;
					while ((len = in.read(b)) > 0) {
						out.write(b, 0, len);
					}
				} finally {
					if (in != null) {
						in.close();
					}
					if (out != null) {
						out.close();
					}
				}
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			JdbcUtil.release(conn, pstmt, rs);
		}
	}
}

 

 

之前,看过网上的一些列子,感觉写的虎头蛇尾的。。。自己整理了一下。

其中Oralce的插入Blob类型,很特殊。

 

说点特别的:

一般来说,网站的大数据类型的文件,不会直接存到数据库,会存放在一定的服务器目录下。

所以,貌似这样的代码用的机会很少。但是,与中情况还是可以用用滴。

 

比如:你有心爱女孩的照片,但却不是你的女友或者老婆的,这个时候,你就可以把她的照片存到数据库中。

凡此种种,你懂的...

 

 

 

分享到:
评论

相关推荐

    利用JDBC解决大数据查询的问题

    在处理大数据查询时,经常遇到的一个问题是由于查询结果集过大而导致的性能瓶颈,尤其是当这些数据需要被加载到客户端应用程序的内存中时。这种情况下的常见错误是`Java.lang.OutOfMemoryError:Java heap space`,即...

    oracle mysql sqlser2000对大数据对象的操作

    SQL Server 2000虽然较旧,但在处理大数据方面也有其独特之处。它提供了IMAGE数据类型来存储二进制数据,以及TEXT和NTEXT数据类型存储长文本数据。然而,由于SQL Server 2000已不再得到官方支持,开发者通常会倾向于...

    大数据监控页面模版

    Java是一种多用途、跨平台的编程语言,其稳定性和高性能使其成为处理大数据的理想选择。特别是在大数据框架如Hadoop和Spark中,Java被广泛用于编写MapReduce任务和Spark作业。 1. **Hadoop与Java**:Hadoop是Apache...

    大数据技术之Hive.docx

    大数据技术之Hive 大数据技术之Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。本质是将HQL转化成MapReduce程序。Hive处理的数据存储在HDFS,分析数据底层的实现...

    大数据开发工程师实习报告.doc

    JDBC提供了一种标准的方式来连接各种类型的数据库,简化了数据库操作,使得Java成为开发数据库驱动的应用程序的理想选择。 总的来说,大数据开发工程师实习不仅要求扎实的技术基础,还需要不断学习和适应快速发展的...

    Java在处理大数据的时候一些小技巧

    Java在处理大数据时,面临的主要挑战是如何有效地管理内存,避免内存溢出。处理大数据的关键在于采用合适的方法和技术,包括分解、压缩、并行处理和利用临时文件。以下是一些具体的处理策略: 1. 分解数据:面对大...

    hgdb-6.0.0-jdbc42.jar_hgdb-6.0.0-jdbc42_

    标题中的“hgdb-6.0.0-jdbc42.jar”指的是一个特定版本的Hypertable(可能被简写为hgdb)数据库的Java JDBC驱动程序,具体是...配合提供的编程资料,可以帮助开发者快速上手,高效地利用Hypertable处理大数据任务。

    sql server2008 jdbc驱动

    SQL Server 2008 JDBC驱动还支持一些高级特性,如读写分离、分布式事务、大数据类型处理(如XML和二进制数据)、JDBC批处理以及SQL Server特有的功能(如Service Broker或Integration Services)。 9. **错误处理*...

    hive jdbc依赖的jar包

    它将SQL查询转换为MapReduce任务在Hadoop集群上运行,因此适合处理和分析大数据。 Hive JDBC的使用涉及到以下几个关键知识点: 1. **安装与配置**:下载Hive JDBC的JAR文件后,需要将其添加到运行环境中,通常是...

    spark jdbc 读取并发优化

    在处理大数据时,Spark作为一个强大的分布式数据处理框架,能够通过其弹性分布式数据集(RDD)和DataFrame等数据结构,实现数据的并行处理。然而,在使用Spark与数据库交互时,尤其是使用JDBC(Java Database ...

    SQL Server jdbc驱动包

    - 高级特性:如事务控制、存储过程调用、大数据类型支持等。 在实际开发中,确保正确配置JDBC驱动类路径,并在Java代码中加载驱动(例如,`Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")`),...

    clickhouse-jdbc(从0.2.4到0.3.2版本).zip

    6. **分页查询**:在处理大数据时,分页查询是常见的需求。clickhouse-jdbc可能提供了分页查询的API,如使用`LIMIT`和`OFFSET`。 7. **连接池**:在生产环境中,使用连接池如HikariCP或C3P0来管理JDBC连接是最佳...

    关于在Hibernate中对于Clob,Blob字段的处理方法

    在Java的持久化框架Hibernate中,处理大数据类型如Clob(Character Large Object)和Blob(Binary Large Object)是一项常见的任务。这些数据类型通常用于存储大量的文本数据(Clob)和二进制数据(Blob),例如长篇...

    JDBC批量插入 更新 删除等操作

    通过JDBC,Java应用程序可以与多种类型的数据库进行交互,实现数据的读取、写入等功能。批量操作是指在一次数据库连接中执行多次SQL语句的操作,这种方式能显著提高程序性能,尤其是在处理大量数据时。 **批量插入*...

    sqljdbc架包

    它还提供了对Unicode的支持,能够处理大数据类型,如BLOB和CLOB,并且可以在不同版本的SQL Server之间进行迁移。 在实际开发中,为了确保最佳性能和安全性,你应该始终使用最新的SQLJDBC驱动版本,因为每个新版本...

    elasticsearch-jdbc-2.3.3.0-dist.zip

    《Elasticsearch-JDBC连接MySQL实现大数据搜索》 在当今的大数据时代,高效的数据检索与分析成为了企业核心竞争力的一部分。Elasticsearch作为一个强大的开源搜索引擎,以其分布式、实时、灵活的特性,广泛应用于...

    jdbc的多个pdf帮助文档

    在学习过程中,你可以通过这些PDF文档深入理解JDBC的使用方式,包括如何配置数据源、如何处理大数据、如何优化JDBC性能等方面。每个PDF都可能涵盖不同的主题,例如JDBC API的详解、最佳实践、示例代码等,对于理解...

Global site tag (gtag.js) - Google Analytics