2011-04-01 41 views
28

Esta respuesta a esta pregunta hecha de esta manera parece ser muy difícil de encontrar en Internet. Básicamente estoy insertando valores en una base de datos MySQL usando PreparedStatement. Uso PreparedStatement para escapar de los datos y evitar los ataques de inyección SQL. El problema es que ahora hay retreving esas llaves.Java PreparedStatement recuperando la última ID insertada

String query="Insert INTO Table_A(name, age) (?, ?)"; 
//String query="Insert INTO Table_A(name, age) ('abc','123')";//Doesn't escape 
PreparedStatement prest; 
prest = con.prepareStatement(query); 
prest.setString(1,"abc"); 
prest.setInt(2,123); 
prest.executeUpdate(); 
//prest.executeUpdate(query, PreparedStatement.RETURN_GENERATED_KEYS); Throws an error 
//prest.executeQuery(); Throws an error 

Entonces, ¿cómo puedo escapar de la entrada y usar PreparedStatements en Java?

+1

Pase el 'RETURN_GENERATED_KEYS' a la llamada' prepareStatement() 'y use' executeUpdate() 'para exentar el inserto. Si eso no funciona, brinde la excepción. – ZeissS

+0

@BalusC hace referencia a un método correcto para hacer esto. –

+0

@BalusC, eso es exactamente lo que estaba buscando. ¡Mal, no es una respuesta! –

Respuesta

1

Si no puede utilizar RETURN_GENERATED_KEYS, utilice otra declaración (una consulta de este tiempo) para hacer

SELECT last_insert_id() 

Asegúrese de que definitivamente tiene una columna de clave principal incremento automático de esa tabla.

+0

¿Esto también funciona para la situación de que hay varias inserciones en la misma tabla que está tratando de obtener id para una de las inserciones? – user917099

52

pase Statement.RETURN_GENERATED_KEYS en prepareStatement() junto con su consulta. Y luego use getGeneratedKeys() de PreparedStatement para obtener el ResultSet que contiene su auto_incremented_id insertado.

String query="Insert INTO Table_A(name, age) (?, ?)"; 
       //String query="Insert INTO Table_A(name, age) ('abc','123')";//Doesn't escape 
       PreparedStatement prest; 
       prest = con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); 
       prest.setString(1,"abc"); 
       prest.setInt(2,123); 
       prest.executeUpdate(); 
       //prest.executeUpdate(query, PreparedStatement.RETURN_GENERATED_KEYS); Throws an error 
       //prest.executeQuery(); Throws an error 
       ResultSet rs = prest.getGeneratedKeys(); 
       if(rs.next()) 
       { 
        int last_inserted_id = rs.getInt(1); 
       } 
Cuestiones relacionadas