Sobes.tech
Junior

Jaka jest różnica między metodami execute, executeQuery i executeUpdate?

sobes.tech AI

Odpowiedź od AI

Metody execute, executeQuery i executeUpdate służą do wykonywania zapytań SQL za pomocą JDBC, ale są przeznaczone do różnych typów zapytań i zwracają różne wyniki.

  1. executeQuery(String sql):

    • Przeznaczony do wykonywania zapytań SQL typu SELECT.
    • Zwraca obiekt ResultSet zawierający wyniki zapytania.
    • Rzuca wyjątek SQLException, jeśli zapytanie nie jest typu SELECT.
    // Przykład użycia executeQuery
    String sql = "SELECT COUNT(*) FROM users";
    try (ResultSet rs = statement.executeQuery(sql)) {
        if (rs.next()) {
            int userCount = rs.getInt(1);
            System.out.println("Liczba użytkowników: " + userCount);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    
  2. executeUpdate(String sql):

    • Przeznaczony do wykonywania zapytań SQL typu INSERT, UPDATE lub DELETE.
    • Może być również używany do wykonywania poleceń DDL (np. CREATE TABLE, ALTER TABLE).
    • Zwraca liczbę (int) reprezentującą liczbę zmienionych wierszy (dla INSERT, UPDATE, DELETE) lub 0 (dla poleceń DDL).
    • Rzuca wyjątek SQLException, jeśli zapytanie zwraca ResultSet.
    // Przykład użycia executeUpdate
    String sql = "UPDATE products SET price = price * 1.1 WHERE category = 'electronics'";
    try {
        int updatedRows = statement.executeUpdate(sql);
        System.out.println("Zaktualizowanych wierszy: " + updatedRows);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    
  3. execute(String sql):

    • Uniwersalna metoda do wykonywania dowolnego typu zapytania SQL.
    • Zwraca boolean: true, jeśli wynik jest ResultSet (dla SELECT), i false, jeśli wynik jest liczbą zmienionych wierszy lub nic nie zwraca (dla INSERT, UPDATE, DELETE, DDL).
    • Aby uzyskać rzeczywisty wynik po execute:
      • Jeśli execute zwróci true, użyj getResultSet() do pobrania ResultSet.
      • Jeśli execute zwróci false, użyj getUpdateCount() do pobrania liczby zmienionych wierszy.
    // Przykład użycia execute
    String sql = "CREATE TABLE IF NOT EXISTS logs (id INT PRIMARY KEY, message VARCHAR(255))";
    try {
        boolean isResultSet = statement.execute(sql);
        if (isResultSet) {
            // To jest zapytanie SELECT
            try (ResultSet rs = statement.getResultSet()) {
                // Przetwarzanie wyników
            }
        } else {
            // To jest zapytanie INSERT, UPDATE, DELETE lub DDL
            int updateCount = statement.getUpdateCount();
            System.out.println("Zmodyfikowanych wierszy lub wynik DDL: " + updateCount);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    

W poniższej tabeli przedstawiono główne różnice:

Metoda Typ zapytania SQL Zwracana wartość Przykłady zapytań
executeQuery SELECT ResultSet SELECT * FROM users
executeUpdate INSERT, UPDATE, DELETE, DDL int (liczba zmienionych wierszy lub 0) INSERT INTO, UPDATE users, DROP TABLE
execute Dowolny boolean (true jeśli ResultSet; false w przeciwnym razie) Dowolny

Zaleca się używanie bardziej specyficznych metod (executeQuery, executeUpdate), gdy typ zapytania jest znany z góry, ponieważ zwiększa to czytelność kodu i umożliwia kompilatorowi lub IDE dokładniejsze sprawdzanie. Metoda execute jest używana w przypadkach, gdy typ zapytania może być dynamiczny lub nieznany z góry.