【问题标题】:How to get generated ID after I inserted into a new data record in database using Spring JDBCTemplate?使用 Spring JDBCTemplate 插入数据库中的新数据记录后如何获取生成的 ID?
【发布时间】:2013-01-10 08:18:12
【问题描述】:
我在使用 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);
}
【问题讨论】:
标签:
database
spring
unique
jdbctemplate
persistent
【解决方案1】:
JdbcTemplate.update() 返回:
受影响的行数
对于INSERT 语句,始终为1。不同的数据库以不同的方式支持生成的密钥提取,但大多数 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();
【解决方案2】:
@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。
【解决方案3】:
您可以使用@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。