为什么这个java代码没有获得最后更新的ID?

时间:2015-09-07 12:07:04

标签: java oracle jdbc

我从下面的代码中获取最后一个插入ID,但是当我更改它以进行更新时,它总是返回0作为最后更新的ID。有没有什么不同的方法来使用预准备语句在java中获取最后更新的id?

public static String updateRegistrationInfo(Integer COMPANY_ID, String FIRST_NAME, String LAST_NAME, String MOBILE_NO,
                                       String WORK_EMAIL, String PASSWORD) throws Exception {
    Connection dbConnection = null;
    PreparedStatement preparedStatement = null;
    Integer last_inserted_id = 0;

    String insertTableSQL = 
        "UPDATE USER_DETAILS SET COMPANY_ID=?,FIRST_NAME=?, LAST_NAME=?, MOBILE_NO=?, WORK_EMAIL=?, PASSWORD=? WHERE WORK_EMAIL=? AND MOBILE_NO=?";

    try {

        dbConnection = getConnection();

        //--USER_ID IS SET TO AUTO INCREMENT PRIMARY KEY

        String returnCols[] = { "USER_ID" };

        //--INSERTING MEETING DETAILS

        preparedStatement = dbConnection.prepareStatement(insertTableSQL, returnCols);

        preparedStatement.setInt(1, COMPANY_ID);
        preparedStatement.setString(2, FIRST_NAME);
        preparedStatement.setString(3, LAST_NAME);
        preparedStatement.setString(4, MOBILE_NO);
        preparedStatement.setString(5, WORK_EMAIL);
        preparedStatement.setString(6, PASSWORD);
        preparedStatement.setString(7, WORK_EMAIL);
        preparedStatement.setString(8, MOBILE_NO);

        // execute insert SQL stetement
        preparedStatement.executeUpdate();

        ResultSet rs = preparedStatement.getGeneratedKeys();
        if (rs.next()) {
            last_inserted_id = rs.getInt(1);
        }

        return last_inserted_id.toString();

    } catch (SQLException e) {
        return e.getMessage() + " ERROR CODE: " + e.getErrorCode();
    } finally {
        if (preparedStatement != null) {
            preparedStatement.close();
        }
        if (dbConnection != null) {
            dbConnection.close();
            dbConnection = null;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

与创建新行的INSERT不同,UPDATE对现有行进行操作,因此不会生成新的行键。当你打这个电话时

ResultSet rs = preparedStatement.getGeneratedKeys();
if (rs.next()) {
   last_inserted_id = rs.getInt(1);
}

结果返回空,因此last_inserted_id保持为零。

这背后的逻辑很简单:在INSERT中你不知道密钥是什么,所以JDBC允许你检索它。在UPDATE中,您知道自己设置了哪个密钥 - 它是COMPANY_ID, - 因此您无需检索它。