Ambiente recomendado: VS Code + Java Extension Pack + Maven (ou Gradle). Para começar com menos atrito, use SQLite; depois, faça a extensão opcional para MySQL.
lab-jdbc).pom.xml, adicione a dependência do SQLite JDBC:<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.40.1.0</version>
</dependency>
Alternativa (MySQL):mysql:mysql-connector-java:8.0.33.
pom.xml com a dependência adicionada e o projeto compilando.ConexaoDB.java:import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConexaoDB {
private static final String URL = "jdbc:sqlite:./loja.db"; // cria o arquivo no diretório do projeto
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL);
}
public static void main(String[] args) {
try (Connection conn = getConnection()) { // try-with-resources fecha automático
System.out.println("Conexão estabelecida!");
} catch (SQLException e) {
System.out.println("Erro ao conectar: " + e.getMessage());
}
}
}
String de conexão SQLite e uso de try-with-resources conforme a aula.
loja.db. Entrega: print do terminal com “Conexão estabelecida!”.clientes e pedidos (com chave estrangeira).CriaSchema.java:import java.sql.*;
public class CriaSchema {
public static void main(String[] args) {
String sqlClientes = """
CREATE TABLE IF NOT EXISTS clientes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
email TEXT UNIQUE,
telefone TEXT,
data_cadastro DATE
);
""";
String sqlPedidos = """
CREATE TABLE IF NOT EXISTS pedidos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
cliente_id INTEGER,
data_pedido DATE,
valor DECIMAL(10,2),
FOREIGN KEY (cliente_id) REFERENCES clientes(id)
);
""";
try (Connection conn = ConexaoDB.getConnection();
Statement st = conn.createStatement()) {
st.execute(sqlClientes);
st.execute(sqlPedidos);
System.out.println("Tabelas criadas/validadas com sucesso.");
} catch (SQLException e) {
System.out.println("Erro ao criar tabelas: " + e.getMessage());
}
}
}
Estruturas de clientes e pedidos com chave estrangeira, como no material.
clientes com parâmetros e em lote.InsereClientes.java:import java.sql.*;
import java.util.List;
public class InsereClientes {
public static void main(String[] args) {
List<String[]> dados = List.of(
new String[]{"Maria Silva", "maria@email.com", "11999887766"},
new String[]{"João Souza", "joao@email.com", "11999995555"}
);
String sql = "INSERT INTO clientes (nome, email, telefone, data_cadastro) VALUES (?, ?, ?, date('now'))";
try (Connection conn = ConexaoDB.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
conn.setAutoCommit(false);
for (String[] d : dados) {
ps.setString(1, d[0]);
ps.setString(2, d[1]);
ps.setString(3, d[2]);
ps.addBatch();
}
ps.executeBatch();
conn.commit();
System.out.println("Clientes inseridos com sucesso.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
PreparedStatement é recomendado e protege contra SQL Injection.
ListaClientes.java:import java.sql.*;
public class ListaClientes {
public static void main(String[] args) {
String sql = """
SELECT id, nome, email
FROM clientes
WHERE nome LIKE 'M%'
ORDER BY id DESC
LIMIT 10
""";
try (Connection conn = ConexaoDB.getConnection();
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql)) {
while (rs.next()) {
System.out.printf("[%d] %s <%s>%n",
rs.getInt("id"),
rs.getString("nome"),
rs.getString("email"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Uso de SELECT/WHERE/ORDER BY/LIMIT conforme a sintaxe apresentada.
AtualizaCliente.java:import java.sql.*;
public class AtualizaCliente {
public static void main(String[] args) {
String sql = "UPDATE clientes SET telefone = ? WHERE id = ?";
try (Connection conn = ConexaoDB.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, "11999998888");
ps.setInt(2, 1);
int linhas = ps.executeUpdate();
System.out.println("Linhas atualizadas: " + linhas);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
RemoveCliente.java:import java.sql.*;
public class RemoveCliente {
public static void main(String[] args) {
String sql = "DELETE FROM clientes WHERE id = ?";
try (Connection conn = ConexaoDB.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, 2);
int linhas = ps.executeUpdate();
System.out.println("Linhas removidas: " + linhas);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Nunca executeDELETEsemWHERE— isso apaga todos os registros. Faça SELECT antes para conferir e, se possível, limite a operação. p
PedidoTransacional.java para inserir um cliente e um pedido “na mesma transação”:import java.sql.*;
public class PedidoTransacional {
public static void main(String[] args) {
String insereCliente = "INSERT INTO clientes (nome, email, telefone, data_cadastro) VALUES (?, ?, ?, date('now'))";
String inserePedido = "INSERT INTO pedidos (cliente_id, data_pedido, valor) VALUES (?, date('now'), ?)";
try (Connection conn = ConexaoDB.getConnection()) {
conn.setAutoCommit(false); // Início da transação
// 1) Cliente
int novoClienteId;
try (PreparedStatement ps = conn.prepareStatement(insereCliente, Statement.RETURN_GENERATED_KEYS)) {
ps.setString(1, "Cliente Tx");
ps.setString(2, "ctx@example.com");
ps.setString(3, "11911112222");
ps.executeUpdate();
try (ResultSet keys = ps.getGeneratedKeys()) {
keys.next();
novoClienteId = keys.getInt(1);
}
}
// 2) Pedido vinculado
try (PreparedStatement ps = conn.prepareStatement(inserePedido)) {
ps.setInt(1, novoClienteId);
ps.setBigDecimal(2, new java.math.BigDecimal("199.90"));
ps.executeUpdate();
}
conn.commit();
System.out.println("Transação confirmada.");
} catch (SQLException e) {
e.printStackTrace();
// Em produção: tentar rollback dentro de outro try/catch
}
}
}
A aula destaca o uso de transações para garantir atomicidade (ACID) e consistência.
rollback().CREATE DATABASE meubanco;
ConexaoMySQL.java:import java.sql.*;
public class ConexaoMySQL {
public static Connection getConnection() throws SQLException {
String url = "jdbc:mysql://localhost:3306/meubanco";
String user = "root";
String pass = "sua_senha";
return DriverManager.getConnection(url, user, pass);
}
public static void main(String[] args) {
try (Connection conn = getConnection()) {
System.out.println("Conectado ao MySQL!");
} catch (SQLException e) {
System.out.println("Erro: " + e.getMessage());
}
}
}
Use a URLjdbc:mysql://localhost:3306/meubanco, com usuário/senha válidos. O banco deve existir antes da conexão.
Cliente (30–40 min)ClienteDAO com: salvar(Cliente), listar(), buscarPorId(int), atualizarTelefone(int,String), remover(int). Implemente com PreparedStatement, retorne listas/objetos e trate exceções de maneira adequada.Main de demonstração.pom.xml.jdbc:sqlite:./arquivo.db). WHERE em UPDATE/DELETE (risco de alterar/apagar tudo). Statement é “igual” a PreparedStatement (este previne SQL Injection e pode otimizar).

SELECT nome, email FROM clientes
WHERE cidade = 'São Paulo';INSERT INTO produtos (nome, preco)
VALUES ('Teclado', 89.90);UPDATE clientes
SET telefone = '11999998888'
WHERE id = 42;DELETE FROM pedidos
WHERE data < '2023-01-01';CREATE TABLE clientes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
email TEXT UNIQUE,
telefone TEXT,
data_cadastro DATE
);CREATE TABLE pedidos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
cliente_id INTEGER,
data_pedido DATE,
valor DECIMAL(10,2),
FOREIGN KEY (cliente_id)
REFERENCES clientes(id)
);

<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.40.1.0</version>
</dependency>implementation 'org.xerial:sqlite-jdbc:3.40.1.0'mysql:mysql-connector-java:8.0.33jdbc:sqlite:C:/sqlite/db/minhabase.dbjdbc:sqlite:./bancodados.dbimport java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConexaoDB {
public static Connection conectar() {
String url = "jdbc:sqlite:./loja.db";
Connection conn = null;
try {
conn = DriverManager.getConnection(url);
System.out.println("Conexão estabelecida!");
return conn;
} catch (SQLException e) {
System.out.println(e.getMessage());
return null;
}
}
}try (Connection conn = conectar()) {
// operações com o banco
} catch (SQLException e) {
// tratamento de erro
}import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ExemploConexao {
public static Connection connect() {
String url = "jdbc:sqlite:./aula_jdbc.db";
Connection conn = null;
try {
conn = DriverManager.getConnection(url);
System.out.println("Conexão com SQLite estabelecida com sucesso!");
return conn;
} catch (SQLException e) {
System.out.println("Erro ao conectar ao SQLite: " + e.getMessage());
return null;
}
}
public static void main(String[] args) {
Connection conn = connect();
if (conn != null) {
try {
conn.close();
System.out.println("Conexão fechada com sucesso!");
} catch (SQLException e) {
System.out.println("Erro ao fechar conexão: " + e.getMessage());
}
}
}
}jdbc:mysql://localhost:3306/meubancopublic static Connection conectarMySQL() {
String url = "jdbc:mysql://localhost:3306/meubanco";
String user = "root";
String password = "senha";
try {
Connection conn = DriverManager.getConnection(
url, user, password);
System.out.println("Conectado ao MySQL!");
return conn;
} catch (SQLException e) {
System.out.println("Erro: " + e.getMessage());
return null;
}
}SELECT [colunas]
FROM [tabela]
WHERE [condição]
ORDER BY [coluna] [ASC|DESC]
LIMIT [número];-- Todos os clientes
SELECT * FROM clientes;
-- Nome e email de clientes de SP
SELECT nome, email
FROM clientes
WHERE estado = 'SP';SELECT nome, total
FROM vendas
WHERE data BETWEEN '2023-01-01' AND '2023-12-31'
AND total > 1000
ORDER BY total DESC
LIMIT 10;INSERT INTO tabela (coluna1, coluna2, ...)
VALUES (valor1, valor2, ...);INSERT INTO clientes (nome, email, telefone)
VALUES ('Maria Silva', 'maria@email.com', '11999887766');INSERT INTO produtos (nome, preco, estoque) VALUES
('Teclado', 89.90, 15),
('Mouse', 45.00, 20),
('Monitor', 750.00, 5);Statement stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO clientes (nome) VALUES ('João')");
PreparedStatement ps = conn.prepareStatement(
"INSERT INTO clientes (nome) VALUES (?)");
ps.setString(1, "João");
ps.executeUpdate();UPDATE tabela
SET coluna1 = valor1, coluna2 = valor2
WHERE condição;-- Atualizar telefone de um cliente
UPDATE clientes
SET telefone = '11999998888'
WHERE id = 1;
-- Aumentar preço de produtos em 10%
UPDATE produtos
SET preco = preco * 1.10
WHERE categoria = 'Eletrônicos';
DELETE FROM tabela
WHERE condição;-- Remover cliente específico
DELETE FROM clientes
WHERE id = 5;
-- Remover produtos sem estoque
DELETE FROM produtos
WHERE estoque = 0;
-- Remover pedidos antigos
DELETE FROM pedidos
WHERE data_pedido < '2022-01-01';import java.sql.*;
public class ConsultaExemplo {
public static void main(String[] args) {
String url = "jdbc:sqlite:./loja.db";
try (Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, nome, email FROM clientes")) {
// Loop sobre os resultados
while (rs.next()) {
int id = rs.getInt("id");
String nome = rs.getString("nome");
String email = rs.getString("email");
System.out.println(id + " | " + nome + " | " + email);
}
} catch (SQLException e) {
System.out.println("Erro: " + e.getMessage());
}
}
}import java.sql.*;
public class ListarProdutos {
public static void main(String[] args) {
String url = "jdbc:sqlite:./loja.db";
// Consulta com filtro e ordenação
String sql = "SELECT id, nome, preco, estoque FROM produtos " +
"WHERE preco > 50.0 ORDER BY preco DESC";
try (Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
// Cabeçalho da tabela
System.out.println("+---------+-------------------+----------+----------+");
System.out.println("| ID | PRODUTO | PREÇO | ESTOQUE |");
System.out.println("+---------+-------------------+----------+----------+");
// Imprime cada produto em formato de tabela
while (rs.next()) {
System.out.printf("| %-7d | %-17s | R$%6.2f | %-8d |%n",
rs.getInt("id"),
rs.getString("nome"),
rs.getDouble("preco"),
rs.getInt("estoque"));
}
System.out.println("+---------+-------------------+----------+----------+");
} catch (SQLException e) {
System.out.println("Erro na consulta: " + e.getMessage());
}
}
}CREATE TABLE livros (
id INTEGER PRIMARY KEY AUTOINCREMENT,
titulo TEXT NOT NULL,
autor TEXT NOT NULL,
ano INTEGER,
preco REAL
);try {
// Operações com banco
} catch (SQLException e) {
System.err.println("Erro: " + e.getMessage());
System.err.println("Código: " + e.getErrorCode());
e.printStackTrace();
} finally {
// Fechar recursos
}try (Connection conn = DriverManager.getConnection(url);
PreparedStatement ps = conn.prepareStatement(sql)) {
// código aqui
} // recursos fechados automaticamente// ERRADO
String sql = "SELECT * FROM usuarios WHERE nome = '" + nome + "'";
// CORRETO
String sql = "SELECT * FROM usuarios WHERE nome = ?";
ps.setString(1, nome);conn.setAutoCommit(false);
try {
// várias operações
conn.commit();
} catch (Exception e) {
conn.rollback();
}