Sobes.tech
Junior

Jaký je rozdíl mezi metodami execute, executeQuery a executeUpdate?

sobes.tech AI

Odpověď od AI

Metody execute, executeQuery a executeUpdate jsou používány k provádění SQL dotazů přes JDBC, ale jsou určeny pro různé typy dotazů a vracejí různé výsledky.

  1. executeQuery(String sql):

    • Je určena pro provádění SQL dotazů typu SELECT.
    • Vrací objekt ResultSet, který obsahuje výsledky dotazu.
    • Vyhazuje výjimku SQLException, pokud dotaz není SELECT.
    // Příklad použití executeQuery
    String sql = "SELECT COUNT(*) FROM users";
    try (ResultSet rs = statement.executeQuery(sql)) {
        if (rs.next()) {
            int userCount = rs.getInt(1);
            System.out.println("Počet uživatelů: " + userCount);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    
  2. executeUpdate(String sql):

    • Je určena pro provádění SQL dotazů typu INSERT, UPDATE nebo DELETE.
    • Může být také použita pro provádění DDL příkazů (např. CREATE TABLE, ALTER TABLE).
    • Vrací celé číslo (int), které představuje počet zasažených řádků nebo 0.
    • Vyhazuje výjimku SQLException, pokud dotaz vrací ResultSet.
    // Příklad použití executeUpdate
    String sql = "UPDATE products SET price = price * 1.1 WHERE category = 'electronics'";
    try {
        int updatedRows = statement.executeUpdate(sql);
        System.out.println("Počet aktualizovaných řádků: " + updatedRows);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    
  3. execute(String sql):

    • Univerzální metoda pro provádění jakéhokoliv typu SQL dotazu.
    • Vrací boolean: true, pokud je výsledek ResultSet (pro SELECT), a false, pokud je výsledek počet zasažených řádků nebo nic (pro INSERT, UPDATE, DELETE, DDL).
    • Pro získání skutečného výsledku po execute:
      • Pokud execute vrátilo true, použijte getResultSet() pro získání ResultSet.
      • Pokud execute vrátilo false, použijte getUpdateCount() pro získání počtu zasažených řádků.
    // Příklad použití execute
    String sql = "CREATE TABLE IF NOT EXISTS logs (id INT PRIMARY KEY, message VARCHAR(255))";
    try {
        boolean isResultSet = statement.execute(sql);
        if (isResultSet) {
            // Jedná se o SELECT dotaz
            try (ResultSet rs = statement.getResultSet()) {
                // Zpracování výsledků
            }
        } else {
            // Jedná se o INSERT, UPDATE, DELETE nebo DDL dotaz
            int updateCount = statement.getUpdateCount();
            System.out.println("Počet zasažených řádků nebo DDL výsledek: " + updateCount);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    

V tabulce níže jsou uvedeny hlavní rozdíly:

Metoda Typ SQL dotazu Vrácená hodnota Příklady dotazů
executeQuery SELECT ResultSet SELECT * FROM users
executeUpdate INSERT, UPDATE, DELETE, DDL int (počet zasažených řádků nebo 0) INSERT INTO, UPDATE users, DROP TABLE
execute Jakýkoliv boolean (true, pokud ResultSet; false, pokud ne) Jakýkoliv

Obecně se doporučuje používat specifičtější metody (executeQuery, executeUpdate), když je typ dotazu znám předem, protože to zvyšuje srozumitelnost kódu a umožňuje překladači nebo IDE provádět přesnější kontroly. Metoda execute se používá v případech, kdy může být typ dotazu dynamický nebo neznámý předem.