0

好的,所以我的代码看起来像这样

        String sqlString = "INSERT into auditlog(report_name, username, start_datetime, resource_uri, resource_id) VALUES (?,?,?,?,?)";
        preparedStatement = connection.prepareStatement(sqlString);
        preparedStatement.setString(1, reportName);
        preparedStatement.setString(2, username);
        preparedStatement.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
        preparedStatement.setString(4, uri);
        preparedStatement.setBigDecimal(5, new BigDecimal(0));
        preparedStatement.executeUpdate();

该表还有一个字段“ID”,但它是自动生成的,我如何获得该密钥?我需要在下一段代码中将其用作外键

4

4 回答 4

6
ResultSet generatedKeys = preparedStatement.getGeneratedKeys();

if (generatedKeys.next()) {
    Long id = generatedKeys.getLong(1);
}
于 2013-06-21T13:45:26.587 回答
3

Statement接口定义getGeneratedKeys()方法。但这一切都取决于您使用的驱动程序。如果驱动程序实现了它,您可以检索生成的 ID

于 2013-06-21T13:46:59.187 回答
2

您需要传递PreparedStatement.RETURN_GENERATED_KEYS给您的准备,然后使用getGeneratedKeys()来检索它;

preparedStatement = connection.prepareStatement(sqlString,      
    PreparedStatement.RETURN_GENERATED_KEYS);  

...

int rownum = preparedStatement.executeUpdate();  
ResultSet resultset = preparedStatement.getGeneratedKeys();  
if( rownum != 0 && !resultset.next()) {  
      int version = resultset.getInt(1);  
} 
于 2013-06-21T13:57:26.447 回答
0

在 MySQL 中,“SELECT LAST_INSERT_ID()”应该这样做。当然,请确保您在同一事务中执行此操作。

不要“选择 MAX(id) FROM ...”。这可以很容易地工作正常,但随着表的增长变得越来越慢。

此外,由于 JDBC 编码几乎都是样板编码,因此请在某处为自己编写一个 SqlUtils.getLastInsertId(Connection con) 方法,并为自己节省一些输入!

于 2013-06-21T13:51:04.270 回答