我从下面的代码中获取最后一个插入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;
}
}
}
答案 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
, - 因此您无需检索它。