Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用SimpleJDCnsert和带有MYSQL JDBC驱动程序的executeBatch获取生成的密钥?_Java_Mysql_Spring_Jdbc_Spring Jdbc - Fatal编程技术网

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

Java 如何使用SimpleJDCnsert和带有MYSQL JDBC驱动程序的executeBatch获取生成的密钥?,java,mysql,spring,jdbc,spring-jdbc,Java,Mysql,Spring,Jdbc,Spring Jdbc,我想一次插入多个记录,并获取每个记录的id,该id是自动递增的。我按照下面的方式做,但得到的是更新行的数量,而不是生成的键,在本例中,该键是id public int[] addPersons(List<Person> persons) { SqlParameterSource[] records= new BeanPropertySqlParameterSource[persons.size()] ; int i = 0; for (Person perso

我想一次插入多个记录,并获取每个记录的id,该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;
}
public int[]addPersons(列出人员)
{
SqlParameterSource[]records=new BeanPropertySqlParameterSource[persons.size()];
int i=0;
用于(人:人)
{
记录[i]=新BeanPropertySqlParameterSource(个人);
i++;
}
SimpleJDBCInsertPerson=新的SimpleJDBCInsertPerson(数据源)。带有表名(“PersonTable”)。使用GeneratedKeyColumns(“id”);
int[]id=insertPerson.executeBatch(记录);
返回ID;
}
这里的人就是豆子。
那么,对于添加的记录,如何获取自动生成的密钥id呢?

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

现在我只使用executeAndReturnKey,但我认为这样做不是最好的做法,因为这样做将不必要地增加事务数量并使服务器繁忙。是的,我同意你的看法,但我们对API有一个限制:(