Как в 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.