Что такое Statement в JDBC и когда его используют?

«Что такое Statement в JDBC и когда его используют?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Statement — это базовый интерфейс JDBC для выполнения статических SQL-запросов без параметров. Он создается из объекта Connection.

Основное использование и пример:

Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();

// Для SELECT используем executeQuery()
String sqlQuery = "SELECT id, name FROM users WHERE status = 'active'";
ResultSet rs = stmt.executeQuery(sqlQuery);
while (rs.next()) {
    System.out.println(rs.getInt("id") + ": " + rs.getString("name"));
}

// Для INSERT, UPDATE, DELETE используем executeUpdate()
String sqlUpdate = "UPDATE users SET status = 'inactive' WHERE last_login < '2023-01-01'";
int rowsAffected = stmt.executeUpdate(sqlUpdate);
System.out.println("Обновлено строк: " + rowsAffected);

// Всегда закрываем ресурсы!
rs.close();
stmt.close();
conn.close();

Критические недостатки и почему его избегают:

  1. Уязвимость к SQL-инъекциям: Запрос формируется конкатенацией строк, что позволяет злоумышленнику внедрить恶意 SQL-код.
    // ОПАСНО!
    String userInput = "'; DROP TABLE users; --";
    String sql = "SELECT * FROM users WHERE name = '" + userInput + "'";
    stmt.executeQuery(sql); // Выполнит DROP TABLE!
  2. Низкая производительность: Каждый запрос компилируется в СУБД заново, кеширование планов запросов неэффективно.

Когда использовать (редкие случаи):

  • Выполнение DDL-операций (CREATE, ALTER, DROP).
  • Выполнение простых, статистических запросов, где параметры известны на этапе компиляции и полностью контролируются разработчиком.

Рекомендация: Для любых запросов с данными, полученными от пользователя или извне, всегда используйте PreparedStatement, который защищает от инъекций и повышает производительность.