Ответ
Эти методы интерфейса Statement служат для выполнения SQL-запросов, но предназначены для разных типов операций.
-
executeQuery(String sql)- Назначение: Выполняет только запросы на чтение данных — оператор
SELECT. - Возвращаемое значение: Объект
ResultSet, содержащий результаты запроса. - Использование: Когда нужно получить данные из базы.
ResultSet rs = statement.executeQuery("SELECT * FROM users");
- Назначение: Выполняет только запросы на чтение данных — оператор
-
executeUpdate(String sql)- Назначение: Выполняет запросы, изменяющие данные или схему БД:
INSERT,UPDATE,DELETE, а также DDL-операторы (CREATE,ALTER,DROP). - Возвращаемое значение:
int— количество затронутых строк (для DDL возвращает 0). - Использование: Для модификации данных или структуры таблиц.
int rows = statement.executeUpdate("DELETE FROM logs WHERE date < '2024-01-01'"); System.out.println("Удалено строк: " + rows);
- Назначение: Выполняет запросы, изменяющие данные или схему БД:
-
execute(String sql)- Назначение: Универсальный метод для выполнения любых SQL-запросов.
- Возвращаемое значение:
boolean. Возвращаетtrue, если первый результат являетсяResultSet(т.е. был выполненSELECT), иfalseесли это счетчик обновлений или результат отсутствует. - Использование: Полезен, когда тип запроса неизвестен заранее (например, в динамических конструкторах запросов). После вызова
execute()для получения результата нужно использоватьgetResultSet()илиgetUpdateCount().boolean hasResultSet = statement.execute(someDynamicSql); if (hasResultSet) { ResultSet rs = statement.getResultSet(); // обработка результатов SELECT } else { int updateCount = statement.getUpdateCount(); // обработка результата UPDATE/INSERT/DELETE }
Рекомендация: Для явных операций всегда используйте executeQuery (для SELECT) или executeUpdate (для INSERT/UPDATE/DELETE). Метод execute оставьте для сценариев, где запрос формируется динамически.