Effiziente Einfügungs-ID in JDBC erhalten
Beim Einfügen von Daten in eine Datenbanktabelle mithilfe von JDBC müssen Sie häufig den generierten Schlüssel (oder die Einfügungs-ID) abrufen, der den neu hinzugefügten Datensatz identifiziert. JDBC bietet einen Mechanismus zum effizienten Abrufen dieser ID.
Verwenden Sie Statement#getGeneratedKeys()
Für automatisch generierte Schlüssel stellt JDBC die Methode Statement#getGeneratedKeys()
bereit. Diese Methode wird in derselben Anweisung aufgerufen, die die INSERT-Operation ausführt. Um die Generierung von Schlüsseln zu ermöglichen, muss die Anweisung mit dem Flag Statement.RETURN_GENERATED_KEYS
erstellt werden.
<code class="language-java">public void create(User user) throws SQLException { try ( Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement(SQL_INSERT, Statement.RETURN_GENERATED_KEYS); ) { statement.setString(1, user.getName()); statement.setString(2, user.getPassword()); statement.setString(3, user.getEmail()); // ... int affectedRows = statement.executeUpdate(); if (affectedRows == 0) { throw new SQLException("创建用户失败,没有影响行。"); } try (ResultSet generatedKeys = statement.getGeneratedKeys()) { if (generatedKeys.next()) { user.setId(generatedKeys.getLong(1)); } else { throw new SQLException("创建用户失败,未获得 ID。"); } } } }</code>
Treiberkompatibilität
Der Erfolg dieses Ansatzes hängt von der JDBC-Treiberunterstützung ab. Die meisten modernen JDBC-Treiber unterstützen diese Funktion, einschließlich MySQL, DB2 und PostgreSQL. Allerdings kann der Oracle JDBC-Treiber in diesem Bereich noch Einschränkungen aufweisen.
Oracle-Alternativen
Erwägen Sie für Oracle die Verwendung von CallableStatement
oder einer SELECT-Abfrage mit einer RETURNING-Klausel, um den zuletzt generierten Schlüssel abzurufen.
<code class="language-sql">"{? = call INSERT_FUNCTION(?, ?, ?)}"</code>
Platzhalter ?
stellt eine Variable dar, die die Einfügungs-ID enthält.
Das obige ist der detaillierte Inhalt vonWie kann ich die Einfügungs-ID in JDBC effizient abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!