如何获取刚插入Java的行的ID

时间:2013-06-21 13:42:30

标签: java mysql sql

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

        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 个答案:

答案 0 :(得分:6)

ResultSet generatedKeys = preparedStatement.getGeneratedKeys();

if (generatedKeys.next()) {
    Long id = generatedKeys.getLong(1);
}

答案 1 :(得分:3)

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

答案 2 :(得分: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);  
} 

答案 3 :(得分:0)

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

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

此外,由于JDBC编码几乎都是样板编码,所以在某处写一个SqlUtils.getLastInsertId(Connection con)方法,并节省一些打字!