Bonjour ,
Je cherche l'equivalent de la fonction PHP "mysql_insert_id() " qui permet de recupérer le dernier id insérer dans une table donnée .
Merci.
Bonjour ,
Je cherche l'equivalent de la fonction PHP "mysql_insert_id() " qui permet de recupérer le dernier id insérer dans une table donnée .
Merci.
tu utilise un ResultSet et dans ton while tu lance un ResultSet.last().
et bien dans ta classe dao tu fait une fonction qui te renvoit le dernier élément de ta table
Exemple :
que tu stocke dans un int et tu le renvoit c'est tout
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 int cpt = 0; ResultSet rs = null; PreparedStatement pst = null; Job job = null; String sql = "SELECT * FROM Job ;"; try { pst = this.connect.prepareStatement(sql); rs = pst.executeQuery(); if(rs.last()){ job = new Job(); job.setIdJob(rs.getInt(1)); cpt = job.getIdJob(); } } catch (SQLException e) { e.printStackTrace(); } return cpt;
Pense à Résolu
Bonjour,
@seb759
Faire un select * pour ne récupérer qu'un champ prend plus de memoire que de faire directement un select nomChamp.
C'est mieux de récupérer l'id directement au moment de l'insert.
Regarde le java doc de Statement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 //method 1 PreparedStatement pst = connection.prepareStatement("insert into ... ?, ?"); pst.setString(1,"champ"); .... pst.executeUpdate(); ResultSet rs = pst.getGeneratedKeys(); //method 2 PreparedStatement pst = connection.prepareStatement(); int id= pst.executeUpdate("insert into ...",Statement.RETURN_GENERATED_KEYS );
A+.
As-tu au moins les remarques de tchize_ et moi pour utiliser la solution de seb759?
Enfin de compte , j'ai pris la solution qui marche , je n'ai pas vraiment le temps de penser a autres solution .
J'ai testé la solution
Pas de résultat , et en plus il y a une erreur vu que le prepareStatement prend une requete en parametre . Je n'ai pas compris cette solution .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ( PreparedStatement pst = connection.prepareStatement(); int id= pst.executeUpdate("insert into ...",Statement.RETURN_GENERATED_KEYS );
La requête en paramètre c'est la requête qui fait l'insertion dans la base.
Sans nous donner le stacktrace de l'erreur, difficile de t'aider.
A+.
Non , il y avait d'erreur mais il m'affichait un résultat incohérent .
Bonjour,
Si vous parlez de la solution de seb759, on peut dire que celle-ci ne marche pas puisqu'elle ne correspond pas à votre demande : elle ne gère absolument pas la concurrence et rien ne garantit que l'identifiant renvoyé correspond à la ligne que vous venez d'insérer (comme l'a déjà dit tchize_ d'ailleurs).
Alors je ne sais pas pourquoi la solution de tchize ne veut pas fonctionner ! .
Peut être parce ue je n'ai donné aucune solution, j'ai juste pointé que la solution proposée du select sur la table était abherrante
Donc la solution (que l'on trouve accessoirement en 30 seconde de recherche google dans la doc de mysql)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 stmt.executeUpdate( "INSERT INTO blablablabla....", Statement.RETURN_GENERATED_KEYS); // // Example of using Statement.getGeneratedKeys() // to retrieve the value of an auto-increment // value // int autoIncKeyFromApi = -1; rs = stmt.getGeneratedKeys(); if (rs.next()) { autoIncKeyFromApi = rs.getInt(1); } else { // throw an exception from here } rs.close();
Voila ce que j'ai fait :
Test !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public static int getLastID(String req) throws SQLException { ResultSet rs=null; s.executeUpdate( req, Statement.RETURN_GENERATED_KEYS); int autoIncKeyFromApi = -1; rs = s.getGeneratedKeys(); if (rs.next()) { autoIncKeyFromApi = rs.getInt(1); } else { // throw an exception from here } rs.close(); return autoIncKeyFromApi; }
Il insert deux lignes , si j'enleve la ligne " m.reqInsertDelete " , il m'affiche cette erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 String reqInsertSource = "insert into T_LISTE_SOURCE(ID_LISTE_SOURCE,ID_TYPE_SOURCE,ID_SCENARIO)"; reqInsertSource+= "values('','"+ID_TYPE_SOURCE+"','"+ID_SCENARIO+"')"; m.reqInsertDelete(reqInsertSource) ; // RECUPERER LE DERNIER ID INSERE int LastID_ListeSource = m.getLastID(reqInsertSource); System.out.println(LastID_ListeSource);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Exception in thread "main" java.lang.NullPointerException at InterrogationDBB.getLastID(InterrogationDBB.java:92) at Fonction.add_source(Fonction.java:54) at TestAffiche.main(TestAffiche.java:17)
Bonjour,
Apparemment, tu n'as pas compris la solution qu'on a proposé.
Ce que je veux dire c'est qu'au moment au tu fais une insertion, tu récupères directement l'id mais tu ne fais plus une autre requête d'insertion pour récupérer le dernier id.C'est mieux de récupérer l'id directement au moment de l'insert.
J'imagine que la méthode "reqInsertDelete" fait une insertion et dans la méthode getLastID, tu fais une nouvelle insertion rien que pour récupérer le dernier id. Tu dois récupérer le dernier id inséré avec l'exécution de la requête dans reqInsertDelete.
A+.
J'ai bien compris que je récupére lorsque j'insere , c'est ce que j'ai fait , et aprés j'ai eu l'erreur , qui n'est pas encore résolu ,
La ligne qui ne foncionne pas :
mm si j'inisialise s = null , ça ne marche pas ! .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 s.executeUpdate( req, Statement.RETURN_GENERATED_KEYS);
private static java.sql.Statement s ; ==> c'est ça la déclaration .
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager