Sobes.tech
Junior

Qual é a diferença entre os métodos execute, executeQuery e executeUpdate?

sobes.tech IA

Resposta da IA

Os métodos execute, executeQuery e executeUpdate são utilizados para executar consultas SQL através do JDBC, mas destinam-se a diferentes tipos de consultas e retornam resultados diferentes.

  1. executeQuery(String sql):

    • Destinado a executar consultas SQL do tipo SELECT.
    • Retorna um objeto ResultSet contendo os resultados da consulta.
    • Lança uma exceção SQLException se a consulta não for um SELECT.
    // Exemplo de uso de executeQuery
    String sql = "SELECT COUNT(*) FROM users";
    try (ResultSet rs = statement.executeQuery(sql)) {
        if (rs.next()) {
            int userCount = rs.getInt(1);
            System.out.println("Número de utilizadores: " + userCount);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    
  2. executeUpdate(String sql):

    • Destinado a executar consultas SQL do tipo INSERT, UPDATE ou DELETE.
    • Pode também ser usado para executar comandos DDL (por exemplo, CREATE TABLE, ALTER TABLE).
    • Retorna um inteiro (int) que representa o número de linhas afetadas (para INSERT, UPDATE, DELETE) ou 0 (para comandos DDL).
    • Lança uma exceção SQLException se a consulta retornar um ResultSet.
    // Exemplo de uso de executeUpdate
    String sql = "UPDATE products SET price = price * 1.1 WHERE category = 'electronics'";
    try {
        int updatedRows = statement.executeUpdate(sql);
        System.out.println("Linhas atualizadas: " + updatedRows);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    
  3. execute(String sql):

    • Método universal para executar qualquer tipo de consulta SQL.
    • Retorna boolean: true se o resultado for um ResultSet (para SELECT), e false se o resultado for o número de linhas afetadas ou não retornar nada (para INSERT, UPDATE, DELETE, DDL).
    • Para obter o resultado real após execute:
      • Se execute retornar true, usar getResultSet() para obter o ResultSet.
      • Se execute retornar false, usar getUpdateCount() para obter o número de linhas afetadas.
    // Exemplo de uso de execute
    String sql = "CREATE TABLE IF NOT EXISTS logs (id INT PRIMARY KEY, message VARCHAR(255))";
    try {
        boolean isResultSet = statement.execute(sql);
        if (isResultSet) {
            // É uma consulta SELECT
            try (ResultSet rs = statement.getResultSet()) {
                // Processar resultados
            }
        } else {
            // É uma consulta INSERT, UPDATE, DELETE ou DDL
            int updateCount = statement.getUpdateCount();
            System.out.println("Linhas afetadas ou resultado DDL: " + updateCount);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    

Na tabela abaixo, as principais diferenças são apresentadas:

Método Tipo de consulta SQL Valor devolvido Exemplos de consultas
executeQuery SELECT ResultSet SELECT * FROM users
executeUpdate INSERT, UPDATE, DELETE, DDL int (número de linhas afetadas ou 0) INSERT INTO, UPDATE users, DROP TABLE
execute Qualquer boolean (true se ResultSet; false caso contrário) Qualquer

Geralmente, recomenda-se usar métodos mais específicos (executeQuery, executeUpdate) quando o tipo de consulta é conhecido com antecedência, pois isso melhora a clareza do código e permite ao compilador ou IDE realizar verificações mais precisas. O método execute é usado em casos onde o tipo de consulta pode ser dinâmico ou desconhecido antecipadamente.