使用Spring JDBCTemplate在数据库中插入新数据记录后如何获取生成的ID?

时间:2013-01-26 13:51:03

标签: database spring unique jdbctemplate persistent

当我使用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);
}

2 个答案:

答案 0 :(得分:6)

JdbcTemplate.update()返回:

  

受影响的行数

1语句始终为INSERT。不同的数据库以不同的方式支持生成的密钥提取,但是大多数JDBC驱动程序都是抽象的,JdbcTemplate支持这一点。引用12.2.8 Retrieving auto-generated keys

  

update()便捷方法支持检索数据库生成的主键。这种支持是JDBC 3.0标准的一部分;有关详细信息,请参阅规范的第13.6章。

基本上你需要这个更冗长的陈述:

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();

答案 1 :(得分:0)

@panadol-chong,@tomasz-nurkiewicz 的代码需要稍作修改才能在这里工作。

final String SQL = "INSERT INTO ... RETUNING id";

KeyHolder keyHolder = new GeneratedKeyHolder();

jdbcTemplate.update(connection -> {
    PreparedStatement ps = connection.prepareStatement(SQL, 
                           Statement.RETURN_GENERATED_KEYS);

    return ps;
}, keyHolder);

return keyHolder.getKey().intValue();

主要区别在于 Statement.RETURN_GENERATED_KEYS