在本文将介绍如何使用JDBC操作MySQL数据库对于大容量数据类型的读取。在之前的博客中已经介绍了如何使用JDBC来操作数据库对各种数据的增删改查,那么大容量数据类型的数据操作又为何不同呢。

  原因在于之前对数据的操作,都可以存储在系统的内存中,但是如果我们对于大容量数据还按以前的方式操作的话,就要将数据先存储在内存中,这样极有可能造成系统内存溢出。所以对于JDBC操作大容量数据,就该使用“IO流”的方式。

  注:本文只是探讨在数据库读取和存入大容量数据的技术兴趣,实际开发并不适用。因为对大容量数据的操作会占用数据库链接很大的时间,而数据库链接又是非常宝贵的,其次大容量数据也会对数据库存储容量造成极大的资源浪费。所以在一般开发中都以上传与下载方式在硬盘中存储一个大数据容量的文件。

  在MySQL数据库中,对于大容量的“字符”数据类型使用的是TEXT系列类型,该系列具体类型为如下四种:

  TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT

  对于大容量的“字节”数据类型使用的是BLOB系列类型,该系列具体类型为如下四种:

  TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB

  那么在JDBC是如何操作大容量数据类型呢?和以前操作其他数据不同的步骤在哪里呢?其实大部分还是相同的,不同的地方在于:

  ⑴ 如果是使用JDBC将大容量数据存入MySQL数据库中,使用的是PreparedStatement对象,在替代占位符的部分,应该是使用

setCharacterStream( index , reader , length)  对于大容量字符类型

setBinaryStream( index, inputStream, length)  对于大容量字节类型

  ⑵ 如果是使用JDBC将大容量数据读取MySQL数据库中,使用的是结果集ResultSet对象,当判断ResultSet的next()方法发现结果集有内容时,对内容处理的方法过程中,使用

reader = resultSet.getCharacterStream(int  columnIndex)  对于大容量字符类型

或者reader = resultSet.getCharacterStream(String  columnLabel)  对于大容量字符类型

inputStream = resultSet.getBinaryStream(int  columnIndex)  对于大容量字节类型

或者inputStream = resultSet.getBinaryStream(String  columnLabel)  对于大容量字节类型

注:下面以一个例子分别来介绍如何使用JDBC操作大容量数据的类型,其中使用到了自定义的工具类JdbcUtils,该自定义类具体请看《JDBC操作数据库的学习(2)》中定义的方式。

例1:使用JDBC处理MySQL的大容量字符类型

假如我们有一个文本类型的文件,如txt、word等等,里面有大量的文字,现在使用JDBC将该文件中的内容存储到MySQL数据库中。这个文本文件假设为a.txt,在D盘目录下。

数据库和表的创建:

create database blobtext;
use blobtext;
create table text(
id int primary key,
words text
);

  注:在表text中,只有一个id列和words列,其中words列的类型为TEXT。

创建Java工程

  在该工程中导入配置文件,编写好工具类(JdbcUtils),在该工具类中主要功能有读取配置文件、注册数据库驱动、获取链接、释放资源,这两步请看《JDBC操作数据库的学习(2)》,此处略。

创建类,则添加大容量字符类型的方法demo代码为:

 public void insert() throws Exception {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null; try{
conn = JdbcUtils.getConnection();
String sql = "insert into text(id,words) values(?,?)";
st = conn.prepareStatement(sql);
st.setInt(1, 1);
File file = new File("D:\\a.txt");
if(file.exists()) {
FileReader reader = new FileReader(file);
st.setCharacterStream(2, reader,file.length());
int num = st.executeUpdate();
if(num>0) {
System.out.println("插入成功");
}
reader.close();
}
}finally{
JdbcUtils.release(conn, st, rs);
}
}

  通过该方法就可以将一个文本文件中的文字内容存储到MySQL数据库中。

读取大容量字符类型的方法demo代码为:

 public void read() throws Exception {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null; try{
conn = JdbcUtils.getConnection();
String sql = "select words from text where id=1";
st = conn.prepareStatement(sql);
rs = st.executeQuery();
if(rs.next()) {
Reader reader = rs.getCharacterStream("words");
int length = 0;
char[] buffer = new char[1024];
FileWriter writer = new FileWriter("D:\\b.txt");
while((length=reader.read(buffer))>0) {
writer.write(buffer, 0, length);
}
writer.close();
reader.close();
}
}finally{
JdbcUtils.release(conn, st, rs);
}
}

  这里将数据库中的一个大容量数据类型的数据读取到一个文本文件中(D盘目录下的b.txt),避免在程序中直接显示,否则将会导致程序内存溢出。

  上面的例子是操作文本类型的大容量数据,而对于字节类型的大容量数据类型,例如图片,歌曲,视频等等,处理的过程也是类型的。

使用JDBC处理数据库大容量数据类型的更多相关文章

  1. 通过 JDBC 驱动程序使用大容量复制

    Microsoft SQL Server 包含一个名为 bcp 的受欢迎的命令行实用工具,以便将较大文件快速大容量复制到 SQL Server 数据库的表或视图中. SQLServerBulkCopy ...

  2. 通过jdbc获取数据库中的表结构

    通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类   1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的属性等等.Met ...

  3. 用JDBC查询数据库

    JDBC API的核心组件:1.DriverManager类:用语跟踪可用的JDBC驱动程序并产生数据库连接. 2.Connection接口:用于取得数据库信息.生成数据库语句,并管理数据库事务. 3 ...

  4. javaweb学习总结(三十三)——使用JDBC对数据库进行CRUD

    一.statement对象介绍 Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可. Statement对象的exe ...

  5. 使用JDBC调用数据库的存储过程

    本篇讲述如何使用JDBC来调用MySQL数据库中的存储过程.建议在学习如何使用JDBC调用存储过程前,请先了解如何在数据库中使用存储过程. 存储过程是指在数据库系统中,一组为了完成特定功能的SQL语句 ...

  6. javaweb(三十三)——使用JDBC对数据库进行CRUD

    一.statement对象介绍 Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可. Statement对象的exe ...

  7. Java之JDBC操作数据库

    DBC JDBC就是一套接口,真正执行的是jar包里得实现类,通过泛型对象来执行实现类里的方法. 步骤: ###1.导入驱动jar包到工程中 ###2.编写代码注册驱动,我们要让程序知道用的是哪个驱动 ...

  8. 二.使用JDBC对数据库CRUD

    一.statement对象介绍 Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可. Statement对象的exe ...

  9. 十六:使用JDBC对数据库进行CRUD

    一.statement对象介绍 Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可. Statement对象的exe ...

随机推荐

  1. linux下安装greenplum

    1. 下载 Greenplum Database 源代码 $ git clone https://github.com/greenplum-db/gpdb 2. 安装依赖库 Greenplum Dat ...

  2. Hibernate MySQL 数据库 使用别名 报 Column * Not Found

    使用Hibernate 查询MySQL数据表的时候报 Column Not Found ,原因是MySQL的驱动不支持别名, 解决方案如下,在连接参数中加上 useOldAliasMetadataBe ...

  3. [转] Ant 编译 Android 项目为 Apk 实战, 常见问题解决

    补充,自行安装Ant, 配置ant环境变量, 在android 项目 根目录下使用 android update project 可以自动生成 build.xml 和 local.peoperties ...

  4. 缩略图类库--ThumbLib使用简介

    //加载类库文件 require_once 'path/to/ThumbLib.inc.php'; //实例化类库,传入你要处理的图片的地址可以是网络地址,也可以是本地地址 $thumb = PhpT ...

  5. C语言深度剖析---const关键字(转载)

    const是constant的缩写,是恒定不变的意思.被const修饰的值,是只读变量. 1.const修饰只读变量,具有不变性      #include <stdio.h> int m ...

  6. ZOJ 2852 Deck of Cards DP

    题意: 一一个21点游戏. 1. 有三个牌堆,分别为1X,2X,3X. 2. 纸牌A的值为1,纸牌2-9的值与牌面面相同,10(T).J.Q.K的值为10,而而joke(F)的值为 任意大大. 3. ...

  7. 多玩YY聊天记录解析全过程

    再来一发,现在开始! 下载安装YY,观察YY目录,很明显的发现了sqlite3.dll,这个数据库很多很多很多软件都在用,简单小巧且开源.删除sqlite3.dll 进入YY,历史记录不能正常显示,基 ...

  8. ExecuteReader: CommandText 属性尚未初始化

    没有对sqlcommand对象的commandtext属性赋值说白了就是没写SQL语句 -.- 无语死了.

  9. Hiddenfield控件

    本文转自:http://www.cnblogs.com/weicleer/archive/2012/11/26/2788722.html ASP.NET2.0 HiddenField控件(1)2007 ...

  10. Android studio gradle配置

    什么是Gradle? Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. gr ...