✅ Submit queries and read results from the database

Incluindo:

  • Criar statements
  • Retornar result sets
  • Iterar sobre os resultados
  • Fechar corretamente ResultSet, Statement e Connection

🧠 RESUMO

Fluxo básico para consultar o banco:

  1. Criar uma Connection
  2. Criar um Statement ou PreparedStatement
  3. Executar a query
  4. Obter e iterar sobre o ResultSet
  5. Fechar todos os recursos!

🧱 COMPONENTES

🔹 Connection

Obtido via DriverManager.getConnection(...), representa a sessão com o banco.

🔹 Statement / PreparedStatement

  • Statement: query simples sem parâmetros.
  • PreparedStatement: pré-compila e aceita parâmetros — preferido para queries dinâmicas.
Statement stmt = conn.createStatement();
PreparedStatement ps =

conn.prepareStatement("SELECT * FROM clientes WHERE ativo = ?");

🔹 ResultSet

Contém os dados retornados de uma consulta SELECT.


🔁 COMO ITERAR PELO RESULTSET

ResultSet rs = stmt.executeQuery("SELECT nome FROM clientes");

while (rs.next()) {
String nome = rs.getString("nome");
System.out.println(nome);
}

🔸 Use rs.getXXX(coluna) para recuperar os dados.

Ex: getInt, getString, getDate, etc.


✅ FECHANDO OS RECURSOS CORRETAMENTE

A ordem correta:

  1. ResultSet
  2. Statement ou PreparedStatement
  3. Connection

Use try-with-resources sempre que possível:

try (
Connection conn = DriverManager.getConnection(...);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM produtos")
) {
while (rs.next()) {
System.out.println(rs.getString("nome"));
}
} catch (SQLException e) {
e.printStackTrace();
}

💡 DICAS PARA A PROVA

  • executeQuery() → apenas para SELECT, retorna ResultSet.
  • executeUpdate() → para INSERT, UPDATE, DELETE, retorna nº de linhas afetadas.
  • Não feche Connection antes de Statement e ResultSet.
  • Use try-with-resources para garantir o fechamento.
  • Nunca ignore exceções de SQL (SQLException).

🚨 ERROS COMUNS

❌ Tentar ler dados de um ResultSet antes de next()
❌ Não fechar conexões (causa vazamento)
❌ Usar executeQuery() com INSERT ou UPDATE
❌ Achar que Statement aceita parâmetros — use PreparedStatement


📌 EXEMPLO COMPLETO

import java.sql.*;

public class ConsultaClientes {
  public static void main(String[] args) {
    String url = "jdbc:mysql://localhost:3306/meubanco";
    String user = "root";
    String password = "1234";

    String sql = "SELECT id, nome FROM clientes WHERE ativo = ?";

    try (
      Connection conn = DriverManager.getConnection(url, user, password);
      PreparedStatement ps = conn.prepareStatement(sql)
    ) {
      ps.setBoolean(1, true);

      try (ResultSet rs = ps.executeQuery()) {
        while (rs.next()) {
          int id = rs.getInt("id");
          String nome = rs.getString("nome");
          System.out.println(id + " - " + nome);
        }
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
}

✅ 10 QUESTÕES DE PRÁTICA

1. Qual método retorna dados de uma consulta SELECT?

A) executeUpdate()
B) executeQuery() ✅
C) executeInsert()
D) run()


2. Qual classe representa os resultados de uma consulta?

A) Statement
B) PreparedStatement
C) ResultSet ✅
D) DriverManager


3. Qual é a ordem correta para fechar os objetos JDBC?

A) Statement → ResultSet → Connection
B) ResultSet → Statement → Connection ✅
C) Connection → Statement → ResultSet
D) Ordem não importa


4. O que acontece se não chamar rs.next() antes de rs.getString()?

A) Retorna null
B) Lança SQLException ✅
C) Retorna string vazia
D) Fecha o ResultSet


5. O que rs.getString("nome") retorna?

A) O nome da tabela
B) O tipo da coluna
C) O valor da coluna “nome” da linha atual ✅
D) O SQL da consulta


6. Qual interface deve ser usada para queries com parâmetros?

A) Statement
B) PreparedStatement ✅
C) ResultSet
D) Connection


7. Qual método de PreparedStatement executa uma consulta SELECT?

A) executeUpdate()
B) executeInsert()
C) executeQuery() ✅
D) select()


8. Qual vantagem do try-with-resources com JDBC?

A) Executa queries automaticamente
B) Fecha os recursos automaticamente ✅
C) Cria conexão mais rápido
D) Não precisa de catch


9. Como recuperar um valor inteiro de uma coluna chamada “id”?

A) rs.getColumn(“id”)
B) rs.getInt(“id”) ✅
C) rs.get(“id”)
D) rs.getInteger(“id”)


10. O que Statement.executeQuery("INSERT INTO...") faz?

A) Insere dados
B) Lança SQLException ✅
C) Retorna um ResultSet
D) Atualiza dados