我在使用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();

09-28 04:04