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.
-
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(); } - Je určena pro provádění SQL dotazů typu
-
executeUpdate(String sql):- Je určena pro provádění SQL dotazů typu
INSERT,UPDATEneboDELETE. - 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(); } - Je určena pro provádění SQL dotazů typu
-
execute(String sql):- Univerzální metoda pro provádění jakéhokoliv typu SQL dotazu.
- Vrací
boolean:true, pokud je výsledekResultSet(proSELECT), afalse, pokud je výsledek počet zasažených řádků nebo nic (proINSERT,UPDATE,DELETE, DDL). - Pro získání skutečného výsledku po
execute:- Pokud
executevrátilotrue, použijtegetResultSet()pro získáníResultSet. - Pokud
executevrátilofalse, použijtegetUpdateCount()pro získání počtu zasažených řádků.
- Pokud
// 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.