BLOB字段类型的示例

来源:互联网 发布:唐鹤德对于我知你好 编辑:程序博客网 时间:2024/06/10 19:51
JDBC中BLOB字段类型的示例

测试数据库MYSQL

测试表:

CREATE TABLE `jdbc`.`blob_test` (
  `id` INTEGER NOT NULL AUTO_INCREMENT,
  `blob` BLOB NOT NULL,
  PRIMARY KEY (`id`)
)
ENGINE = InnoDB;


示例代码:

package test.jdbc;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;


/**
 * 这是一个BLOB字段类型的示例
 */
public class BlobRW {

    public static void main(String[] args) throws Exception {

        create();
        read();
    }

    public static void create()
            throws Exception {
        // TODO Auto-generated method stub
        System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/jdbc", "root", "");
        String sql = "insert into blob_test (blob_bit) values (?)";
        PreparedStatement stat = conn.prepareStatement(sql);
        File file = new File("pw00007.jpg");
        InputStream in = new BufferedInputStream(new FileInputStream(file));
        stat.setBinaryStream(1, in, (int)file.length());
        stat.executeUpdate();
        in.close();
        stat.close();
        conn.close();
    }

    public static void read() throws Exception {
        // TODO Auto-generated method stub
        System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/jdbc", "root", "");
        String sql = "select blob_bit from blob_test";
        PreparedStatement stat = conn.prepareStatement(sql);
        ResultSet rs = stat.executeQuery();
        while (rs.next()) {
            Blob blob = rs.getBlob("blob_bit");
            InputStream in = blob.getBinaryStream();
            File file = new File("pw00007_bak.jpg");
            OutputStream out = new BufferedOutputStream(new FileOutputStream(file));
            byte[] bbuf = new byte[1024];
            for (int i = 0; (i = in.read(bbuf)) > 0;) {
                out.write(bbuf, 0, i);
            }
            out.close();
            in.close();
        }
        rs.close();
        stat.close();
        conn.close();
    }

}

运行方法:
在运行目录下放一个名字为pw00007.jpg的图片文件。

运行结果:
create方法的结果可以用mysql的query browser工具来看表中插入的文件内容
read方法的结果可以看当前目录下生成的pw00007_bak.jpg文件的内容

总结:
在向blob字段类型中插入数据时,要使用javaio的inputstream,读入文件。
而相反从blob字段中读出数据时,同样使用javaio的inputstream,再用javaio的outputstream写入文件。

实践时的发生的问题和原因调查:

1,mysql关键字问题
用上面的建表语句执行本程序的时候,总是出现sql语法错误。
调查发现,建表语句BLOB字段的名字用的是blob,这个好像是mysql关键字,导致问题发生。改成其他的名字即可。
CREATE TABLE `jdbc`.`blob_test` (
  `id` INTEGER NOT NULL AUTO_INCREMENT,
  `blob_bit` BLOB NOT NULL,
  PRIMARY KEY (`id`)
)
ENGINE = InnoDB;

2,版本问题
同clob的示例中的问题
如果在设置字节流的地方不加类型转换的话,如下:
stat.setBinaryStream(1, in, file.length());
则会出现如下错误
Exception in thread "main" java.lang.AbstractMethodError: com.mysql.jdbc.PreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V
    at test.jdbc.BlobRW.create(BlobRW.java:38)
    at test.jdbc.BlobRW.main(BlobRW.java:24)

后来看了看java和mysql的jdbc驱动两方面的代码,原因明白,原来是用的jdk1.6的版本中,有长度为long类型的方法。
而对应的mysql的jdbc驱动jar中,还没有实现。
将其进行类型转换后,即可正常运行。

3,二进制文件的大小的问题
如果文件的长度超过64k,也会出现错误。存入的文件大小要小于64k。

本文出自 “点点滴滴” 博客,请务必保留此出处http://kin111.blog.51cto.com/738881/168462


原创粉丝点击