Incluindo:
- Criar statements
- Retornar result sets
- Iterar sobre os resultados
- Fechar corretamente
ResultSet,StatementeConnection
🧠 RESUMO
Fluxo básico para consultar o banco:
- Criar uma
Connection - Criar um
StatementouPreparedStatement - Executar a query
- Obter e iterar sobre o
ResultSet - 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:
ResultSetStatementouPreparedStatementConnection
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 paraSELECT, retornaResultSet.executeUpdate()→ paraINSERT,UPDATE,DELETE, retorna nº de linhas afetadas.- Não feche
Connectionantes deStatementeResultSet. - Use
try-with-resourcespara 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