Identität von SQL-Insert über jdbctemplate
-
13-09-2019 - |
Frage
Ist es möglich, die @@ Identität aus dem SQL-Einsatz auf einer Feder jdbc Vorlage Anruf zu bekommen? Wenn ja, wie?
Lösung
Die JDBCTemplate.update
Methode ist überlastet, ein Objekt zu nehmen ein GeneratedKeyHolder genannt, die Sie den automatisch generierten Schlüssel abrufen können. Zum Beispiel (Code genommen von hier ):
final String INSERT_SQL = "insert into my_test (name) values(?)";
final String name = "Rob";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps =
connection.prepareStatement(INSERT_SQL, new String[] {"id"});
ps.setString(1, name);
return ps;
}
},
keyHolder);
// keyHolder.getKey() now contains the generated key
Andere Tipps
Wie wäre es SimpleJdbcInsert.executeAndReturnKey
? Es nimmt zwei Formen an, abhängig von der Eingabe:
(1) Die Eingabe ist ein Map
public java.lang.Number executeAndReturnKey(java.util.Map<java.lang.String,?> args)
Beschreibung von Schnittstelle kopiert:
SimpleJdbcInsertOperations
Führen Sie den Einsatz mit den übergebenen Werte in und gibt den erzeugten Schlüssel. Dies erfordert, dass der Name der Spalten mit automatisch generierten Schlüssel angegeben wurden. Diese Methode wird immer ein
KeyHolder
zurück, aber der Anrufer muss überprüfen, ob es die generierten Schlüssel tatsächlich enthält.Definiert durch:
executeAndReturnKey
in SchnittstelleSimpleJdbcInsertOperations
Parameter:
args - Map containing column names and corresponding value
Returns:
the generated key value
(2) Die Eingabe ist ein SqlParameterSource
public java.lang.Number executeAndReturnKey(
SimpleJdbcInsertOperations
Führen Sie den Einsatz mit den übergebenen Werte in und gibt den erzeugten Schlüssel. Dies erfordert, dass der Name der Spalten mit automatisch generierten Schlüssel angegeben wurden. Diese Methode wird immer ein
KeyHolder
zurück, aber der Anrufer muss überprüfen, ob es die generierten Schlüssel tatsächlich enthält.Definiert durch:
executeAndReturnKey
in SchnittstelleSimpleJdbcInsertOperations
Parameter:
parameterSource - SqlParameterSource containing values to use for insert
Returns:
den erzeugten Schlüsselwert.
Hinzufügen detaillierte Notizen / Beispielcode todd.pierzina beantworten
jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("TABLE_NAME").usingGeneratedKeyColumns(
"Primary_key");
Map<String, Object> parameters = new HashMap<>();
parameters.put("Column_NAME1", bean.getval1());
parameters.put("Column_NAME2", bean.getval2());
// execute insert
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(
parameters));
// convert Number to Int using ((Number) key).intValue()
return ((Number) key).intValue();
Ich weiß nicht, ob es ein „one-liner“, aber dies scheint den Trick zu tun (für MSSQL mindestens):
// -- call this after the insert query...
this._jdbcTemplate.queryForInt( "select @@identity" );
Decent Artikel hier .