有没有办法从预准备语句中检索自动增量ID

jW.*_*jW. 59 java mysql prepared-statement auto-increment

有没有办法在使用带有预准备语句的java查询时从数据库查询中检索自动生成的密钥.

例如,我知道AutoGeneratedKeys可以如下工作.

stmt = conn.createStatement();

stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
if(returnLastInsertId) {
    ResultSet rs = stmt.getGeneratedKeys();
    rs.next();
    auto_id = rs.getInt(1);
} 
Run Code Online (Sandbox Code Playgroud)

然而.如果我想使用准备好的Statement进行插入,该怎么办?

String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql);

//this is an error
stmt.executeUpdate(Statement.RETURN_GENERATED_KEYS);
if(returnLastInsertId) {
    //this is an error since the above is an error
    ResultSet rs = stmt.getGeneratedKeys();
    rs.next();
    auto_id = rs.getInt(1);
} 
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,我不知道.从javadoc看来,PreparedStatements无法返回自动生成的ID.

Yis*_*hai 93

是.看到这里.第7.1.9节.将您的代码更改为:

String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);


stmt.executeUpdate();
if(returnLastInsertId) {
   ResultSet rs = stmt.getGeneratedKeys();
    rs.next();
   auto_id = rs.getInt(1);
}
Run Code Online (Sandbox Code Playgroud)

  • @JafarAli,这个问题是关于mysql的.在oracle中,您必须指定[生成的列](https://community.oracle.com/thread/338591)或使用行ID. (9认同)
  • @Winter,这段代码专注于解决问题中的问题,而不是处理资源和异常处理。像任何其他语句和结果集一样,调用 close 是必要的。 (2认同)