В чем разница между методами execute, executeQuery и executeUpdate в JDBC?

Ответ

Эти методы интерфейса 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 оставьте для сценариев, где запрос формируется динамически.