我在使用Spring JDBCTemplate时遇到一个非常常见的问题,我想在将新的数据记录插入数据库后获取ID值,该ID值将被引用到另一个相关表中。我尝试通过以下方式将其插入,但是我总是返回1而不是其实际的唯一ID。 (我使用MySQL作为数据库)
public int insert(BasicModel entity) {
String insertIntoSql = QueryUtil.getInsertIntoSqlStatement(entity);
log.info("SQL Statement for inserting into: " + insertIntoSql);
return this.jdbcTemplate.update(insertIntoSql);
}
最佳答案
JdbcTemplate.update()
返回:
对于1
语句,这始终是INSERT
。不同的数据库以不同的方式支持生成的 key 提取,但是大多数JDBC驱动程序对此进行了抽象,而JdbcTemplate
支持这一点。引用12.2.8 Retrieving auto-generated keys
基本上,您需要以下更为冗长的语句:
final String insertIntoSql = QueryUtil.getInsertIntoSqlStatement(entity);
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
return connection.prepareStatement(insertIntoSql, new String[] {"id"});
}
}, keyHolder);
return keyHolder.getKey().intValue();