Ответ
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();
Критические недостатки и почему его избегают:
- Уязвимость к SQL-инъекциям: Запрос формируется конкатенацией строк, что позволяет злоумышленнику внедрить恶意 SQL-код.
// ОПАСНО! String userInput = "'; DROP TABLE users; --"; String sql = "SELECT * FROM users WHERE name = '" + userInput + "'"; stmt.executeQuery(sql); // Выполнит DROP TABLE! - Низкая производительность: Каждый запрос компилируется в СУБД заново, кеширование планов запросов неэффективно.
Когда использовать (редкие случаи):
- Выполнение DDL-операций (CREATE, ALTER, DROP).
- Выполнение простых, статистических запросов, где параметры известны на этапе компиляции и полностью контролируются разработчиком.
Рекомендация: Для любых запросов с данными, полученными от пользователя или извне, всегда используйте PreparedStatement, который защищает от инъекций и повышает производительность.