Est-il possible d'obtenir l'identité @@ à partir de l'insertion SQL lors d'un appel de modèle Spring jdbc? Si c'est le cas, comment?
Le JDBCTemplate.update
est surchargée pour prendre un objet appelé GeneratedKeyHolder que vous pouvez utiliser pour récupérer la clé générée automatiquement. Par exemple (code tiré de ici ):
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
Que diriez-vous de SimpleJdbcInsert.executeAndReturnKey
? Cela prend deux formes, selon l'entrée:
Map
public Java.lang.Number executeAndReturnKey(Java.util.Map<Java.lang.String,?> args)
Description copiée depuis l'interface:
SimpleJdbcInsertOperations
Exécutez l'insertion à l'aide des valeurs transmises et renvoyez la clé générée. Cela nécessite que le nom des colonnes avec des clés générées automatiquement ait été spécifié. Cette méthode renvoie toujours un
KeyHolder
mais l'appelant doit vérifier qu'il contient réellement les clés générées.Spécifié par:
executeAndReturnKey
dans l'interfaceSimpleJdbcInsertOperations
Paramètres:
args - Map containing column names and corresponding value
Renvoie:
the generated key value
SqlParameterSource
public Java.lang.Number executeAndReturnKey(
SqlParameterSource
parameterSource)
Description copiée depuis l'interface:
SimpleJdbcInsertOperations
Exécutez l'insertion à l'aide des valeurs transmises et renvoyez la clé générée. Cela nécessite que le nom des colonnes avec des clés générées automatiquement ait été spécifié. Cette méthode renvoie toujours un
KeyHolder
mais l'appelant doit vérifier qu'il contient réellement les clés générées.Spécifié par:
executeAndReturnKey
dans l'interfaceSimpleJdbcInsertOperations
Paramètres:
parameterSource - SqlParameterSource containing values to use for insert
Renvoie:
la valeur de clé générée.
Ajout de notes détaillées/exemple de code à la réponse todd.pierzina
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();
Je ne sais pas s'il y a un "one-liner" mais cela semble faire l'affaire (pour MSSQL au moins):
// -- call this after the insert query...
this._jdbcTemplate.queryForInt( "select @@identity" );
Article décent ici .