Как в Java сделать параметризованный запрос (PreparedStatement)
Вставлять параметры в запрос "руками" — крайне плохая практика, чреватая нехорошими последствиями. В Java предусмотрен способ создания неименованных параметризованных запросов, где значения параметров в запросе заменены знаками вопроса "?", а подставляются специальными методами.
Создание параметризованного запроса происходит по следующему шаблону:
String connectionUrl = "jdbc:postgresql:UrlAndOtherData...";
try (Connection conn = DriverManager.getConnection(connectionUrl)) {
//Выборка
String selectSql = "SELECT * FROM PEOPLE WHERE NAME = ?";
PreparedStatement selectPreparedStatement = conn.prepareStatement(selectSql);
selectPreparedStatement.setString(1, "Peter");
ResultSet rs = selectPreparedStatement.executeQuery();
//Внесение изменений
String updateSql = "INSERT INTO PEOPLE (NAME, AGE) Values (?, ?)";
PreparedStatement updatePreparedStatement = conn.prepareStatement(updateSql);
updatePreparedStatement.setString(1, "Peter");
updatePreparedStatement.setInt(2, 25);
int affectedRows = updatePreparedStatement.executeUpdate();
} catch (SQLException ex) {}
Аналогично непараметризованным запросам для выборки и внесения изменений используются разные методы (executeQuery() и executeUpdate() соответственно). А также при установке параметров их перечисление начинается с единицы:
updatePreparedStatement.setString(1, "Peter");
updatePreparedStatement.setInt(2, 25);
Что касается именованных параметризованных запросов, где вместо знаков вопроса используются имена вида :name, то в JDBC такой функционал по умолчанию не поддерживается. Однако он может быть реализован отдельно. В частности он доступен в Spring Framework, где есть возможность для этих целей использовать класс NamedParameterJdbcTemplate.