9

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

3 回答 3

10

JdbcTemplate.update()返回:

受影响的行数

这总是1用于INSERT声明。不同的数据库以不同的方式支持生成的密钥提取,但大多数 JDBC 驱动程序对此进行了抽象并JdbcTemplate支持这一点。引用12.2.8 检索自动生成的密钥

一种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();
于 2013-01-26T14:01:59.380 回答
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.

于 2021-02-26T14:52:41.580 回答
0

您可以使用@Tomasz Nurkiewicz 答案,它肯定可以工作,但您不需要:Spring 提供了 SimpleJdbcInsert,它“提供元数据处理以简化构建基本插入语句所需的代码”。

@Repository
public class UserDao {

    private JdbcTemplate jdbcTemplate;
    private SimpleJdbcInsert insertIntoUser;

    @Autowired
    public UserDao(DataSource datasource) {
        jdbcTemplate = new JdbcTemplate(datasource);
        insertIntoUser = new SimpleJdbcInsert(jdbcTemplate).withTableName("user").usingGeneratedKeyColumns("id_user");
    }

    public Number insertUser(User u) {
        final Map<String, Object> parameters = new HashMap<>();
        parameters.put("name", u.getName());

        return insertIntoUser.executeAndReturnKey(parameters);
    }
}

insertUser 返回的“Number”是为用户插入生成的 id_user。

于 2021-12-06T11:34:06.097 回答