2012-02-24 15 views
6

Sto usando il seguente codice per inserire un'immagine in un database. Memorerà due immagini perché ho usato PreparedStatement e Statement.Inserimento dei dati BLOB in Java con PreparedStatement

Quando si esegue questo codice, ottengo due immagini nel database. Ma le due immagini sono diverse e non capisco perché. Usando PreparedStatement, si sta inserendo perfettamente. Voglio avere la stessa immagine quando uso Statement. Perché non funziona ora e come posso farlo funzionare?

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

"esegui questo codice e script troverai due immagini nella tabella del database, ma entrambe sono diverse non so perché." - scusa, non ne vale la pena. Dovresti fare più lavoro qui. – duffymo

+0

Si prega di indentare il codice in modo corretto e utilizzare le maiuscole nelle frasi. –

+0

In genere, le persone non eseguono il codice fornito su questo sito: troppo rischioso. Ma controlleranno il tuo codice per te. Ti aspetti che le due immagini siano le stesse? – halfer

risposta

9

Certo che sarà diverso. La seguente query fa la seguente cosa:

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

Prendere B1, che è un array di byte, e chiamare il suo metodo toString(). Ciò si traduce in una stringa come [B @ 8976876, che significa "un oggetto di tipo array di byte con hashCode 8976876", ma non rappresenta affatto il contenuto dell'array di byte. Quindi inserisci questa stringa nella tabella.

Un array di byte non è una stringa. Fine della storia. È necessario utilizzare un'istruzione preparata per inserire dati binari in una tabella. In effetti, dovresti sempre usare una dichiarazione preparata per eseguire qualsiasi query che abbia un parametro non costante.

+0

Com'è che "non è vero"? Nella tua risposta, trasformi i dati binari in una stringa. Quindi non stai più inserendo dati binari, ma una stringa. In questo modo, perdi tempo (per codificare e decodificare) e spazio (perché una stringa base64 ha bisogno di 4 byte per rappresentare 3 byte binari). –

+0

Per inserire dati binari, sì, è vero. E le dichiarazioni preparate sono comunque una buona pratica in generale. –

2

Il tuo problema è che si sta concatenato una stringa con un array di byte (nella chiamata a executeStatment)

Vedere questa risposta su come inserire un blob con una dichiarazione: https://stackoverflow.com/a/2609614/355499

8

Usa setBlob con 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); 
Problemi correlati