从Java插入/更新blob到MySQL

时间:2013-11-25 13:35:06

标签: java mysql sql blob mysql-workbench

经过一天的谷歌搜索后,我终于决定抽出时间向所有强大的SO社区提问。我试图将图像插入或更新到MySQL数据库。我使用的查询和代码如下:

    FileInputStream inputStream = new FileInputStream(file);

    String[] str_array = file.getName().split("-");
    String stringb = str_array[1];
    String stringc = str_array[2];
    String fingerName = stringc.substring(0, 2);
    //gets file name and splits it accordingly

    String id = getID.id(stringb); //does a sql lookup to get the previously inserted id according to the stringb(users unique id number)

    String INSERT_PIC = "INSERT INTO database.user_picture(id_ref, picture_num, user_image) values('" + id + "', ?, ?) ON DUPLICATE KEY UPDATE user_image = ?;";

    //creates the sql statement that inserts or updates according to the primary keys id_ref and picture_num

    ps = (PreparedStatement) connection.prepareStatement(INSERT_PIC);

    ps.setString(1, fingerName);
    ps.setBinaryStream(2, (InputStream) inputStream, file.length());
    ps.setBinaryStream(3, (InputStream) inputStream, file.length());

    //creates the prepared statement and inserts the 3 parameters

    ps.executeUpdate();
    connection.commit();
    //executes the query on the connected database

我很确定这会奏效。测试时,它会将图像正确插入数据库。更新时所有字段都正确更新,但blob / image字段除外,而是更改为NULL。

我不确定为什么会发生这种情况或以其他任何方式使其发挥作用,任何建议都将不胜感激......

2 个答案:

答案 0 :(得分:1)

我的猜测是第一个setBinaryStream()使用了流。所以第二次调用setBinaryStream()只是读取“null”。

答案 1 :(得分:1)

您为参数2和3提供相同的输入流。 执行语句时,首先读取参数2流直到结束。 当JDBC驱动程序然后尝试读取参数3的流时,它已经在它的末尾,因为它是相同的流实例。

尝试提供两个输入流:

FileInputStream inputStream1 = new FileInputStream(file);
FileInputStream inputStream2 = new FileInputStream(file);
[...]
ps.setBinaryStream(2, (InputStream) inputStream1, file.length());
ps.setBinaryStream(3, (InputStream) inputStream2, file.length());

另外,不要忘记在某些finally块中关闭流。

祝你好运。