Cette réponse à cette question ainsi posée semble être très difficile à trouver sur Internet. Fondamentalement, j'insère des valeurs dans une base de données MySQL à l'aide de PreparedStatement. J'utilise le PreparedStatement pour échapper aux données et empêcher les attaques par injection SQL. Le problème est qu'il existe désormais un moyen de récupérer ces clés.
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
Alors, comment puis-je échapper à la saisie et utiliser PreparedStatements en Java?
passez Statement.RETURN_GENERATED_KEYS
dans prepareStatement()
avec votre requête. Et puis utilisez getGeneratedKeys () de PreparedStatement
pour obtenir le ResultSet contenant votre auto_incremented_id inséré.
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);
}
Utilisez Java.sql.ResultSet Java.sql.Statement.getGeneratedKeys () pour récupérer vos clés générées.
Si vous ne pouvez pas utiliser RETURN_GENERATED_KEYS
, utilisez une autre instruction (une requête cette fois) pour faire
SELECT last_insert_id()
Assurez-vous que vous disposez bien d'une colonne de clé primaire à incrémentation automatique dans ce tableau.