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

有没有办法在将 Java 查询与预准备语句一起使用时从数据库查询中检索自动生成的密钥。

例如,我知道自动生成的密钥可以按如下方式工作。

stmt = conn.createStatement();

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

然而。如果我想用准备好的语句做一个插入怎么办?

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);
} 

有没有一种方法可以做到这一点,我不知道。从javadoc来看,PreparedStatements似乎无法返回自动生成的ID。


答案 1

是的。请参阅此处。第 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);
}

答案 2

有几种方法,似乎不同的jdbc驱动程序处理事情有点不同,或者在某些情况下根本不处理(有些只给你自动生成的主键,而不是其他列),但基本形式是

stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 

或者使用此表单:

String autogenColumns[] = {"column1","column2"};
stmt = conn.prepareStatement(sql, autogenColumns)

推荐