Cách duy nhất mà một số trình điều khiển JDBC để trở Statement.RETURN_GENERATED_KEYS
là để làm một cái gì đó trong các cách sau:PreparedStatement với Statement.RETURN_GENERATED_KEYS
long key = -1L;
Statement statement = connection.createStatement();
statement.executeUpdate(YOUR_SQL_HERE, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = statement.getGeneratedKeys();
if (rs != null && rs.next()) {
key = rs.getLong(1);
}
Có cách nào để làm điều tương tự với PreparedStatement
?
Sửa
Lý do tôi hỏi nếu tôi có thể làm tương tự với PreparedStatement
xem xét các tình huống sau:
private static final String SQL_CREATE =
"INSERT INTO
USER(FIRST_NAME, MIDDLE_NAME, LAST_NAME, EMAIL_ADDRESS, DOB)
VALUES (?, ?, ?, ?, ?)";
Trong bảng USER
có một PRIMARY KEY (USER_ID)
mà là một BIGINT AUTOINCREMENT
(do đó tại sao bạn không nhìn thấy nó trong chuỗi SQL_CREATE
.
Bây giờ, tôi điền số ?
bằng cách sử dụng PreparedStatement.setXXXX(index, value)
. Tôi muốn trả lại ResultSet rs = PreparedStatement.getGeneratedKeys()
. Làm thế nào tôi có thể đạt được điều này?
Nhiều người hiểu sai và sử dụng PreparedStatement # executeUpdate (arg). Java doc nói 'Phương thức này với đối số không thể được gọi trên một PreparedStatement hoặc CallableStatement.' Nó có nghĩa là chúng ta phải sử dụng executeUpdate() mà không có đối số mặc dù phương thức' executeUpdate (arg) 'có thể được thừa kế trong lớp PreparedStatement nhưng chúng ta không có để sử dụng nó nếu không chúng ta sẽ nhận được SQLException. – AmitG