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

jv2fixgn  于 2023-08-02  发布在  Spring
关注(0)|答案(3)|浏览(87)

我在使用Spring JDBCTTemplate的时候遇到了一个很常见的问题,我想在我插入一个新的数据记录到数据库后获取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);
}

字符串

kcrjzv8t

kcrjzv8t1#

JdbcTemplate.update()返回:
受影响的行数
对于INSERT语句,它始终是1。不同的数据库以不同的方式支持生成的键提取,但大多数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();

字符串

3phpmpom

3phpmpom2#

@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

smtd7mpg

smtd7mpg3#

你可以使用@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。

相关问题