Java文件上传到MySQL

5

我遇到了一个问题,无法从JFileChooser的选择中获取java.io.File,以便将该java.io.File对象上传到MySQL表中,该表具有以下表结构:

     COL_NAME  COL_TYPE     ATTRIBUTES        EXTRA
(PK) idSample  int(10)      UNSIGNED ZEROFILL AUTO_INCREMENT
     FileName  varchar(250)
     FileBin   blob         BINARY 

这段Java代码中,newConnection 方法是该类的静态方法,它返回一个新的 DriverManager 实例,默认连接到 MySQL 数据库。另外需要注意的是,我使用的是 java.sql 而不是 com.mysql.jdbc 包。

public static boolean insert(final String filename, File file) throws SQLException, IOException {
    boolean flag = false;
    try {
        Connection connection = newConnection();
        PreparedStatement statement = connection.prepareStatement(SQL_INSERT);
        statement.setString(1, filename);
        statement.setBlob(2, new FileInputStream(file), file.length());
        flag = statement.executeUpdate() > 0;
        statement.close();
        connection.close();
    } catch (SQLException ex) {
        throw ex;
    } catch (IOException ex) {
        throw ex;
    }
    return flag;
}

当我尝试运行这个程序时,它返回一个错误,导致statement.setBlob这一行出现以下堆栈跟踪:
Exception in thread "main" java.lang.AbstractMethodError: com.mysql.jdbc.PreparedStatement.setBlob(ILjava/io/InputStream;J)V

我该如何解决这个问题?

你尝试过使用SetBinaryStream而不是SetBlob吗?http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#setBinaryStream(int, java.io.InputStream) - Diego Basch
仍然返回相同的异常。 - David B
异常提示您最后一个参数是long(J)。尝试将file.length强制转换为int:....,(int)file.length()); - Diego Basch
从流中读取字节数据,并将其用作setBlob的参数。 - Perception
1个回答

2

AbstractMethodError 意味着你的 JDBC 驱动程序的 PreparedStatement 没有实现 setBlob(int, InputStream, long)

使用旧的 setBlob(int, Blob) 或者升级你的驱动程序(Connector/J 5.1 实现了 Jdbc 4.0,这应该是你需要 setBlob(int, InputStream, long) 的东西)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接