Java PreparedStatement возвращает последний вставленный идентификатор
Этот ответ на этот вопрос, сделанный таким образом, кажется очень трудным найти в Интернете. В основном я вставляю значения в базу данных MySQL, используя PreparedStatement. Я использую PreparedStatement, чтобы избежать данных, чтобы предотвратить атаки SQL Injection. Проблема в том, что теперь есть способ вернуть эти ключи.
String query="Insert INTO Table_A(name, age) (?, ?)";
//String query="Insert INTO Table_A(name, age) ('abc','123' )";//Doesn't escape
PreparedStatement prest;
prest = con.prepareStatement(query);
prest.setString(1,"abc");
prest.setInt(2,123);
prest.executeUpdate();
//prest.executeUpdate(query, PreparedStatement.RETURN_GENERATED_KEYS); Throws an error
//prest.executeQuery(); Throws an error
Итак, как я могу избежать ввода и использовать PreparedStatements в Java?
Ответы
Ответ 1
передать Statement.RETURN_GENERATED_KEYS
в prepareStatement()
вместе с вашим запросом. Затем используйте getGeneratedKeys() из PreparedStatement
, чтобы получить ResultSet, содержащий введенный auto_incremented_id.
String query="Insert INTO Table_A(name, age) (?, ?)";
//String query="Insert INTO Table_A(name, age) ('abc','123' )";//Doesn't escape
PreparedStatement prest;
prest = con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
prest.setString(1,"abc");
prest.setInt(2,123);
prest.executeUpdate();
//prest.executeUpdate(query, PreparedStatement.RETURN_GENERATED_KEYS); Throws an error
//prest.executeQuery(); Throws an error
ResultSet rs = prest.getGeneratedKeys();
if(rs.next())
{
int last_inserted_id = rs.getInt(1);
}
Ответ 2
Использование
java.sql.ResultSet java.sql.Statement.getGeneratedKeys() для извлечения сгенерированных ключей.
Ответ 3
Если вы не можете использовать RETURN_GENERATED_KEYS
, используйте другой оператор (запрос на этот раз) для выполнения
SELECT last_insert_id()
Убедитесь, что у вас определенно есть столбец первичного ключа с автоматическим приращением в этой таблице.