Je veux INSERT
un enregistrement dans une base de données (qui est Microsoft SQL Server dans mon cas) en utilisant JDBC en Java. En même temps, je veux obtenir l'ID d'insertion. Comment puis-je y parvenir à l'aide de l'API JDBC?
385
String sql = "INSERT INTO 'yash'.'mytable' ('name') VALUES (?)"; int primkey = 0 ; PreparedStatement pstmt = con.prepareStatement(sql, new String[] { "id" }/*Statement.RETURN_GENERATED_KEYS*/); pstmt.setString(1, name); if (pstmt.executeUpdate() > 0) { java.sql.ResultSet generatedKeys = pstmt.
getGeneratedKeys ();if (generatedKeys.next()) primkey = generatedKeys.getInt(1); }
Réponses:
S'il s'agit d'une clé générée automatiquement, vous pouvez l'utiliser
Statement#getGeneratedKeys()
pour cela. Vous devez l'appeler de la même manièreStatement
que celle utilisée pour leINSERT
. Vous devez d' abord créer l'instruction à l'aide deStatement.RETURN_GENERATED_KEYS
pour informer le pilote JDBC de retourner les clés.Voici un exemple de base:
Notez que vous dépendez du pilote JDBC pour savoir s'il fonctionne. Actuellement, la plupart des dernières versions fonctionneront, mais si je ne me trompe pas, le pilote Oracle JDBC est toujours quelque peu gênant avec cela. MySQL et DB2 le supportaient déjà depuis des lustres. PostgreSQL a commencé à le prendre en charge il n'y a pas longtemps. Je ne peux pas commenter MSSQL car je ne l'ai jamais utilisé.
Pour Oracle, vous pouvez appeler un
CallableStatement
avec uneRETURNING
clause ou unSELECT CURRVAL(sequencename)
(ou la syntaxe spécifique à DB pour ce faire) directement après laINSERT
dans la même transaction pour obtenir la dernière clé générée. Voir aussi cette réponse .la source
generatedKeys.next()
renvoietrue
si la base de données a renvoyé une clé générée. Regardez, c'est unResultSet
. Ilclose()
s'agit simplement de libérer des ressources. Sinon, votre base de données en manquera à long terme et votre application se cassera. Vous n'avez qu'à écrire vous-même une méthode utilitaire qui fait la tâche de fermeture. Voir aussi ceci et cette réponse.Créer une colonne générée
Passez cette colonne créée à votre déclaration
Utiliser un
ResultSet
objet pour récupérer les GeneratedKeys on Statementla source
Je frappe Microsoft SQL Server 2008 R2 à partir d'une application basée sur JDBC à un seul thread et je récupère le dernier ID sans utiliser la propriété RETURN_GENERATED_KEYS ou tout PreparedStatement. Ressemble à ceci:
Ce billet de blog isole joliment trois options principales de "dernier ID" de SQL Server: http://msjawahar.wordpress.com/2008/01/25/how-to-find-the-last-identity-value-insert-in-the -sql-server / - n'a pas encore eu besoin des deux autres.
la source
Lorsque vous rencontrez une erreur «Fonction non prise en charge» lors de l'utilisation
Statement.RETURN_GENERATED_KEYS
, essayez ceci:Où
BATCHID
est l'ID généré automatiquement.la source
BATCHID
J'utilise SQLServer 2008, mais j'ai une limitation de développement: je ne peux pas utiliser un nouveau pilote pour cela, je dois utiliser "com.microsoft.jdbc.sqlserver.SQLServerDriver" (je ne peux pas utiliser "com.microsoft.sqlserver.jdbc .SQLServerDriver ").
C'est pourquoi la solution a
conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)
lancé une java.lang.AbstractMethodError pour moi. Dans cette situation, une solution possible que j'ai trouvée est l'ancienne suggérée par Microsoft: Comment récupérer la valeur @@ IDENTITY à l'aide de JDBCCette solution a fonctionné pour moi!
J'espère que ça aide!
la source
Au lieu d'un commentaire , je veux juste répondre à un post.
Interface java.sql.PreparedStatement
columnIndexes «Vous pouvez utiliser la fonction prepareStatement qui accepte columnIndexes et l'instruction SQL. Où les indicateurs de colonnes autorisés de columnIndexes sont Statement.RETURN_GENERATED_KEYS 1 ou Statement.NO_GENERATED_KEYS [2], instruction SQL pouvant contenir un ou plusieurs '?' Espaces réservés pour les paramètres IN.
SYNTAX «
Exemple:
columnNames « Liste les noms de colonnes comme
'id', 'uniqueID', ...
. dans la table cible contenant les clés générées automatiquement qui doivent être renvoyées. Le pilote les ignorera si l'instruction SQL n'est pas uneINSERT
instruction.SYNTAX «
Exemple:
Exemple complet:
la source
Vous pouvez utiliser le code java suivant pour obtenir un nouvel identifiant inséré.
la source
Avec NativeQuery d'Hibernate, vous devez renvoyer une ResultList au lieu d'un SingleResult, car Hibernate modifie une requête native
comme
si vous essayez d'obtenir un seul résultat, ce qui provoque la plupart des bases de données (au moins PostgreSQL) à lancer une erreur de syntaxe. Ensuite, vous pouvez récupérer l'ID résultant de la liste (qui contient généralement exactement un élément).
la source
Il est possible de l'utiliser aussi avec des normales
Statement
(pas seulementPreparedStatement
)la source
Dans mon cas ->
la source
Si vous utilisez Spring JDBC, vous pouvez utiliser la classe GeneratedKeyHolder de Spring pour obtenir l'ID inséré.
Voir cette réponse ... Comment obtenir un identifiant inséré à l'aide de Spring Jdbctemplate.update (String sql, obj ... args)
la source
la source
createStatement
méthode deConnection
n'attend aucun paramètre. 2. Laexecute
méthode fromStatement
attend une chaîne avec une requête. 3. Laexecute
méthode renvoie:true
si le premier résultat est unResultSet
objet;false
s'il s'agit d'un nombre de mises à jour ou s'il n'y a aucun résultat. docs.oracle.com/javase/7/docs/api/java/sql/…