2012-02-24 35 views
6

Tôi đang sử dụng mã sau để chèn hình ảnh vào cơ sở dữ liệu. Nó sẽ lưu trữ hai hình ảnh vì tôi đã sử dụng PreparedStatementStatement.Chèn dữ liệu blob vào Java bằng cách sử dụng PreparedStatement

Khi tôi chạy mã này, tôi nhận được hai hình ảnh trong cơ sở dữ liệu. Nhưng hai hình ảnh khác nhau, và tôi không hiểu tại sao. Sử dụng PreparedStatement, nó được chèn hoàn hảo. Tôi muốn có cùng một hình ảnh khi tôi sử dụng Statement. Tại sao nó không hoạt động bây giờ, và làm thế nào tôi có thể làm cho nó hoạt động?

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; 
+3

"hãy chạy mã và tập lệnh này bạn sẽ tìm thấy hai hình ảnh trong bảng cơ sở dữ liệu. Nhưng cả hai đều khác nhau, tôi không biết tại sao." - xin lỗi, không đáng nỗ lực. Bạn nên làm nhiều việc hơn ở đây. – duffymo

+0

Vui lòng thụt lề mã của bạn đúng cách và sử dụng cách viết hoa phù hợp trong câu của bạn. –

+0

Mọi người thường không chạy mã được cung cấp trên trang web này - quá mạo hiểm. Nhưng họ sẽ xem xét mã của bạn cho bạn. Bạn có mong đợi hai hình ảnh giống nhau không? – halfer

Trả lời

9

Tất nhiên họ sẽ khác nhau. Truy vấn sau thực hiện như sau:

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

Lấy b1, là mảng byte và gọi phương thức toString(). Điều này dẫn đến một chuỗi như [B @ 8976876, có nghĩa là "một đối tượng của mảng byte kiểu với hashCode 8976876", nhưng không đại diện cho nội dung của mảng byte cả. Sau đó chèn chuỗi này vào bảng.

Mảng byte không phải là Chuỗi. Kết thúc câu chuyện. Bạn phải sử dụng câu lệnh chuẩn bị để chèn dữ liệu nhị phân vào bảng. Trong thực tế, bạn nên luôn luôn sử dụng một câu lệnh đã chuẩn bị để thực hiện bất kỳ truy vấn nào có tham số không cố định.

+0

Làm thế nào là "không đúng"? Trong câu trả lời của bạn, bạn chuyển đổi dữ liệu nhị phân thành một Chuỗi. Vì vậy, bạn không chèn dữ liệu nhị phân nữa, nhưng thay vào đó là một Chuỗi. Bằng cách đó, bạn mất thời gian (để mã hóa và giải mã), và không gian (vì một chuỗi base64 cần 4 byte để đại diện cho 3 byte nhị phân). –

+0

Để chèn dữ liệu nhị phân, vâng, đó là sự thật. Và tuyên bố chuẩn bị là một thực hành tốt nói chung anyway. –

2

Vấn đề của bạn là bạn đang concatenating một chuỗi với một mảng byte (trong lệnh gọi executeStatment)

Xem câu trả lời này về cách chèn một blob bằng một tuyên bố: https://stackoverflow.com/a/2609614/355499

8

Sử dụng setBlob với 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); 
Các vấn đề liên quan