使用JDBC存储和调用大对象
彭丽
摘要:介绍用Java语言编程实现大对象文件在数据库中存储和调用的方法,在数据表中将图像、声音等大对象文件声明为BLOB类型数据。通过JDBC驱动程序与数据库建立连接,利用JDBC API包含的类PreparedStatement和ResultSet中的方法存储和调用BLOB类型数据。
关键词:大对象(BLOB),数据库,JDBC,JAVA API
随着Internet网络应用的发展,多媒体资料的应用越来越广泛,多媒体资料的管理也渐渐成为使用者迫切需要解决的问题,建立一个能够使多媒体资料方便存储和查找的多媒体资料库系统尤为必要。传统的文件系统管理方式只适合少量、单一的多媒体资料的浏览和查询。作为目前主流技术的是基于关系模型的数据库管理系统,通过在系统中引入新的数据类型如二进制大对象(Binary Large OBject, BLOB )来存储多媒体对象字段如图像、声音等。
下面以实现一个GIF格式的图像文件在MySQL数据库中的调入和调出为例,编程语言采用Java,原完整程序代码在JBuilder5 环境下编译通过。
1 首先在MySQL数据库中创建一个存储二进制数据的数据库myimage和表bin_data。
启动MySQL后,输入以下命令行:
mysql> create database myimage;
mysql> use myimage;
mysql> CREATE TABLE bin_data (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30), data LONGBLOB );
这样就建好了数据库和表。
2 建立数据库连接,装载JDBC驱动程序:
Java程序与数据库的连接是通过JDBC (Java DataBase Connectivity),JDBC 的基本结构是JDBC API 配合JDBC驱动程序。在程序的开头将包含JDBC API的java.sql套件import到程序中,这样才能通过JDBC所提供的丰富的类和接口来编写功能强大的Java数据库程序。而JDBC驱动程序则可细分为四种类型,不同类型的JDBC驱动程序有着不一样的特性和使用方法,而同一类型不同版本的JDBC对不同类型和不同版本的数据库的数据类型的支持也有很多差异,在此不一一详述。
本程序中的驱动程序采用JDBC-ODBC Bridage。
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//装载驱动程序
Connection conn = DriverManager.getConnection (
"jdbc:odbc:bin_data", // 数据库连接路径
"root", // 用户名
"123"); // 用户密码
3 存储名为“dancegirl.gif”的图像文件,使用java.sql包PreparedStatement类的SetBinaryStream()方法:
File files = new File("dancegirl.gif");
FileInputStream fis=new FileInputStream(files);
PreparedStatement ps = conn.prepareStatement(
"INSERT INTO binary_data (name,data)" +
"VALUES (?, ?)"); //预编译SQL语句
ps.setString(1, files.getName());
ps.setBinaryStream(2, fis,(int)files.length());
ps.executeUpdate();
fis.close();
ps.close();
4 调出已存入数据库的名为“dancegirl.gif”的文件,读出字节数并作为ImageIcon类对象在Label控件中显示出来:
ImageIcon ii;
JLabel jLabel1 = new JLabel();
JLabel jLabel1 = new JLabel();
int byteSum = 0;
int bytesRead = 0;
byte[] buffer = new byte[8 * 1924];
FileOutputStream fis = new FileOutputStream(
(String)(jComboBox1.getSelectedItem()));
PreparedStatement ps = conn.prepareStatement(
"select data from binary_data where name=?");
ps.setString(1,
(String)(jComboBox1.getSelectedItem()));
ResultSet rs = ps.executeQuery();
if (rs != null)
{
while(rs.next())
{
InputStream is = rs.getBinaryStream(1);
while ((bytesRead = is.read(buffer)) != -1)
{
byteSum += bytesRead;
fis.write(buffer, 0, bytesRead);
}
ii = new ImageIcon(buffer);
jLabel1.setIcon(ii);
is.close( );
}
rs.close( );
}
ps.close( );
fis.close( );
jLabel3.setText("bytes written: " + byteSum);
参考文献:
1、 [美]DenielI.Joshi Rodney Rundfson Ramesh Chandak著,王翠英等译《Java的最新技术—连接SQL的JDBC》
北京:电子工业出版社,1999年。
2、 [美]Bruce Eckel著,京京工作室译《Java编程思想》
北京:机械工业出版社,1999年。