Est-il possible d'obtenir l'identité @@ à partir de l'insertion SQL sur un appel de modèle Spring jdbc? Si c'est le cas, comment?Identité de sql insert via jdbctemplate
Répondre
La méthode 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 here):
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 SimpleJdbcInsert.executeAndReturnKey?
Wow, je ne savais pas vraiment à propos de cette classe - un peu soigné. Merci. +1 – javamonkey79
J'aime cette version plus que la version avec PreparedStatementCreator. – ruslanys
Ajout de notes détaillées/exemple de code pour répondre à todd.pierzina
jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("TABLE_NAME").usingGeneratedKeyColumns(
"Primary_key");
Map<String, Object> parameters = new HashMap<String, Object>();
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 suis confronté à cette exception: org.springframework.dao.InvalidDataAccessResourceUsageException: La fonction getGeneratedKeys n'est pas supportée par cette base de données –
@ Az.MaYo - Votre problème peut être lié à la version du pilote JDBC. –
Ce serait le "one liner" que je cherche ici. Agréable. Triste chose est que j'ai vu le lien, mais je l'ai passé à côté de cela: "partie de la norme JDBC 3.0". (Je ne pense pas que nous utilisions JDBC 3.0, mais je ne pense pas non plus que cela soit pertinent). – javamonkey79
Il obtient un vrai one liner en Java 8 avec lambdas \ m/ – fabwu