web-dev-qa-db-fra.com

Java PreparedStatement récupérant le dernier ID inséré

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?

33
Devin Dixon

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);
                }
60
Asad

Utilisez Java.sql.ResultSet Java.sql.Statement.getGeneratedKeys () pour récupérer vos clés générées.

4
Dave G

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.

1
Jonathan