使用JDBC存储和调用大对象[绝对转载]

           使用JDBC存储和调用大对象

                      彭丽

 摘要:介绍用Java语言编程实现大对象文件在数据库中存储和调用的方法,在数据表中将图像、声音等大对象文件声明为BLOB类型数据。通过JDBC驱动程序与数据库建立连接,利用JDBC API包含的类PreparedStatementResultSet中的方法存储和调用BLOB类型数据。

 关键词:大对象(BLOB),数据库,JDBCJAVA 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年。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值