如何使用 SimpleJdbcInsert 和 executeBatch 和 MYSQL JDBC 驱动程序获取生成的密钥?

Posted

技术标签:

【中文标题】如何使用 SimpleJdbcInsert 和 executeBatch 和 MYSQL JDBC 驱动程序获取生成的密钥?【英文标题】:How to get generated keys using SimpleJdbcInsert and executeBatch with MYSQL JDBC driver? 【发布时间】:2015-04-02 08:07:03 【问题描述】:

我想一次插入多条记录并获取每条记录的 id,它是自动递增的。我正在按照以下方式进行操作,但获取更新的行数而不是生成的密钥,在这种情况下为 id。

public int[] addPersons(List<Person> persons)

   SqlParameterSource[] records= new BeanPropertySqlParameterSource[persons.size()] ;

    int i = 0;
    for (Person person: persons) 
   
         records[i]= new BeanPropertySqlParameterSource(person);
         i++;   
    

  SimpleJdbcInsert insertPerson=new SimpleJdbcInsert(dsource).withTableName("PersonTable").usingGeneratedKeyColumns("id");
 int [] ids= insertPerson.executeBatch(records);

  return ids;

这里 Person 是 bean。 那么,对于添加的记录,如何获取自动生成的密钥 id 呢?

【问题讨论】:

【参考方案1】:

Spring JDBC 不允许在调用 executeBatch 方法时检索生成的密钥。这是因为它在内部调用了java.sql.PreparedStatementexecuteBatch() 方法,该方法只返回受影响的行数。另一种方法是使用executeAndReturnKey 方法多次执行insert 语句。

【讨论】:

现在我只使用executeAndReturnKey,但我认为这样做不是最佳做法,因为它会不必要地增加事务数量并保持服务器繁忙。 是的,我同意你的观点,但我们对 API 有限制:(

以上是关于如何使用 SimpleJdbcInsert 和 executeBatch 和 MYSQL JDBC 驱动程序获取生成的密钥?的主要内容,如果未能解决你的问题,请参考以下文章

SimpleJdbcInsert - 不在默认模式的表中插入数据

SimpleJdbcInsert由于自动生成的ID(HSQLDB)为空而无法插入

spring3: 对JDBC的支持 之 Spring提供的其它帮助 SimpleJdbcInsert/SimpleJdbcCall/SqlUpdate/JdbcTemplate 生成主键/批量处理(

Spring JDBCSimpleJdbcInsert

Spring JDBC 批量操作 数据

Spring JDBC