在本文将介绍如何使用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代码为:
1 public void insert() throws Exception {
2 Connection conn = null;
3 PreparedStatement st = null;
4 ResultSet rs = null;
5
6 try{
7 conn = JdbcUtils.getConnection();
8 String sql = "insert into text(id,words) values(?,?)";
9 st = conn.prepareStatement(sql);
10 st.setInt(1, 1);
11 File file = new File("D:\a.txt");
12 if(file.exists()) {
13 FileReader reader = new FileReader(file);
14 st.setCharacterStream(2, reader,file.length());
15 int num = st.executeUpdate();
16 if(num>0) {
17 System.out.println("插入成功");
18 }
19 reader.close();
20 }
21 }finally{
22 JdbcUtils.release(conn, st, rs);
23 }
24 }
通过该方法就可以将一个文本文件中的文字内容存储到MySQL数据库中。
读取大容量字符类型的方法demo代码为:
1 public void read() throws Exception {
2 Connection conn = null;
3 PreparedStatement st = null;
4 ResultSet rs = null;
5
6 try{
7 conn = JdbcUtils.getConnection();
8 String sql = "select words from text where id=1";
9 st = conn.prepareStatement(sql);
10 rs = st.executeQuery();
11 if(rs.next()) {
12 Reader reader = rs.getCharacterStream("words");
13 int length = 0;
14 char[] buffer = new char[1024];
15 FileWriter writer = new FileWriter("D:\b.txt");
16 while((length=reader.read(buffer))>0) {
17 writer.write(buffer, 0, length);
18 }
19 writer.close();
20 reader.close();
21 }
22 }finally{
23 JdbcUtils.release(conn, st, rs);
24 }
25 }
这里将数据库中的一个大容量数据类型的数据读取到一个文本文件中(D盘目录下的b.txt),避免在程序中直接显示,否则将会导致程序内存溢出。
上面的例子是操作文本类型的大容量数据,而对于字节类型的大容量数据类型,例如图片,歌曲,视频等等,处理的过程也是类型的。