【问题标题】:Inserting blob data in Java using PreparedStatement使用 PreparedStatement 在 Java 中插入 blob 数据
【发布时间】:2012-03-14 20:37:29
【问题描述】:

我正在使用以下代码在数据库中插入图像。它将存储两张图像,因为我使用了PreparedStatementStatement

当我运行这段代码时,我在数据库中获得了两张图片。但是这两个图像不同,我不明白为什么。使用PreparedStatement,它可以完美插入。当我使用Statement 时,我想拥有相同的图像。为什么它现在不起作用,我怎样才能使它起作用?

import java.io.*;
import java.sql.*;
public class Image
{
    public static void main(String args[]) throws Exception
    {
        System.out.println("kshitij");
        Class.forName("com.mysql.jdbc.Driver");
        Connection cn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jsfdb","root","kshitij");
        Statement st=cn.createStatement();
        File f1=new File("c:\\k1.jpg");
        FileInputStream fin=new FileInputStream(f1);
        //DataInputStream dataIs = new DataInputStream(new FileInputStream(f1));
        PreparedStatement pst = cn.prepareStatement("insert into registration(image) values(?)");
        //pst.setInt(1,67);
        pst.setBinaryStream(1,fin,fin.available());
        pst.executeUpdate();
        //int length=(int)f1.length();
        byte [] b1=new byte[(int)f1.length()];
        fin.read(b1);
        fin.close();
        st.executeUpdate("insert into registration(image) values('"+b1+"')");
        System.out.println("Quesry Executed Successfully");
        FileOutputStream fout=new FileOutputStream("d://k1.jpg");
        fout.write(b1);
        fout.close();
    }
}

MySQL

CREATE DATABASE IF NOT EXISTS jsfdb;
USE jsfdb;

-- Definition of table `registration`
DROP TABLE IF EXISTS `registration`;
CREATE TABLE `registration` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `image` blob NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=234 DEFAULT CHARSET=latin1;

【问题讨论】:

  • "请运行此代码和脚本,您将在数据库表中找到两个图像。但两者不同,我不知道为什么。" - 对不起,不值得努力。你应该在这里做更多的工作。
  • 请正确缩进您的代码并在句子中使用正确的大小写。
  • 人们通常不会运行本网站提供的代码 - 太冒险了。但是他们会为您查看您的代码。你认为这两张图片是一样的吗?
  • PS:欢迎来到 Stack Overflow!顺便说一句,我同意 Felix - 尝试使用有意义的标题并尽可能使句子的大小写和语法正确(尽管我尝试为非英语使用者提供例外)。一般来说,努力提出问题会鼓励人们回答。

标签: java mysql


【解决方案1】:

将 setBlob 与 InputStream 一起使用

File file= new File("your_path");
FileInputStream inputStream= new FileInputStream(file);

PreparedStatement statement = connection.prepareStatement("INSERT INTO yourTable (yourBlob) VALUES (?)");
statement.setBlob(1, inputStream);

【讨论】:

    【解决方案2】:

    您的问题是您正在将一个字符串与一个字节数组连接起来(在您对 executeStatment 的调用中)

    有关如何使用语句插入 blob,请参阅此答案: https://stackoverflow.com/a/2609614/355499

    【讨论】:

      【解决方案3】:

      当然它们会有所不同。以下查询执行以下操作:

      "insert into registration(image) values('"+b1+"')"
      

      以字节数组b1为例,调用其toString()方法。这会产生一个类似 [B@8976876 的字符串,这意味着“具有 hashCode 8976876 的字节数组类型的对象”,但根本不代表字节数组的内容。然后在表中插入这个字符串。

      字节数组不是字符串。故事结局。您必须使用准备好的语句在表中插入二进制数据。事实上,您应该始终使用准备好的语句来执行任何具有非常量参数的查询。

      【讨论】:

      • 那“不是真的”怎么办?在您的回答中,您将二进制数据转换为字符串。所以你不再插入二进制数据,而是一个字符串。通过这样做,您可以节省时间(编码和解码)和空间(因为 base64 字符串需要 4 个字节来表示 3 个二进制字节)。
      • 插入二进制数据,没错,没错。无论如何,准备好的语句通常是一种很好的做法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 2021-11-03
      • 2012-08-11
      • 1970-01-01
      • 2020-07-08
      相关资源
      最近更新 更多