Die einzige Möglichkeit, die einige JDBC-Treiber zurückgeben können, Statement.RETURN_GENERATED_KEYS
besteht darin, Folgendes zu tun:
long key = -1L;
Statement statement = connection.createStatement();
statement.executeUpdate(YOUR_SQL_HERE, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = statement.getGeneratedKeys();
if (rs != null && rs.next()) {
key = rs.getLong(1);
}
Gibt es eine Möglichkeit, dasselbe zu tun PreparedStatement
?
Bearbeiten
Der Grund, warum ich gefragt habe, ob ich dasselbe tun kann, ist PreparedStatement
das folgende Szenario:
private static final String SQL_CREATE =
"INSERT INTO
USER(FIRST_NAME, MIDDLE_NAME, LAST_NAME, EMAIL_ADDRESS, DOB)
VALUES (?, ?, ?, ?, ?)";
In der USER
Tabelle gibt es eine, PRIMARY KEY (USER_ID)
die eine ist BIGINT AUTOINCREMENT
(daher sehen Sie es nicht in der SQL_CREATE
Zeichenfolge.
Jetzt fülle ich die ?
Verwendung PreparedStatement.setXXXX(index, value)
. Ich möchte zurückkehren ResultSet rs = PreparedStatement.getGeneratedKeys()
. Wie kann ich das erreichen?
This method with argument cannot be called on a PreparedStatement or CallableStatement.
es bedeutet, dass wir executeUpdate () ohne Argument verwenden müssen, obwohl dieexecuteUpdate(arg)
Methode in der PreparedStatement-Klasse vererbt werden kann, aber wir müssen sie nicht verwenden, sonst erhalten wir SQLException.Antworten:
Sie können entweder die
prepareStatement
Methode verwenden, die einen zusätzlichenint
Parameter verwendetBei einigen JDBC-Treibern (z. B. Oracle) müssen Sie die Spaltennamen oder Indizes der generierten Schlüssel explizit auflisten:
quelle
Du meinst so etwas?
quelle
Da ich momentan keinen Compiler bei mir habe, werde ich eine Frage stellen:
Hast du das versucht? Funktioniert es?
Haftungsausschluss: Natürlich habe ich das nicht zusammengestellt, aber Sie haben die Idee.
PreparedStatement ist eine Subschnittstelle von Statement , daher sehe ich keinen Grund, warum dies nicht funktionieren würde, es sei denn, einige JDBC-Treiber sind fehlerhaft.
quelle
PreparedStatement
eine Unterklasse vonStatement
... ist. Siehe meinen aktualisierten Beitrag.quelle
quelle