Conectar-se a um banco de dados MySQL diretamente usando JDBC é uma habilidade fundamental para desenvolvedores Java, especialmente em cenários de teste, diagnóstico ou integração leve — mesmo que frameworks ORM como Hibernate ou MyBatis sejam preferidos em aplicações robustas.
Configuração do Driver
O primeiro passo é incluir o conector JDBC do MySQL no projeto. Para projetos Maven, adicione a dependência compatível com sua versão do MySQL Server:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
Observação: Versões moedrnas (8.x+) usam o driver com.mysql.cj.jdbc.Driver, substituindo o antigo com.mysql.jdbc.Driver.
Exemplo Básico de Conexão e Consulta
O código abaixo demonstra uma conexão mínima, execução de uma consulta simples e liberação segura dos recursos — utilizando try-with-resources para evitar vazamentos:
import java.sql.*;
public class SimpleMySQLConnector {
private static final String URL = "jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
private static final String USER = "root";
private static final String PASS = "123456";
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection(URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, user_id, balance FROM t_balance LIMIT 3")) {
System.out.println("Conexão estabelecida. Resultados:");
while (rs.next()) {
System.out.printf("ID=%d | Usuário=%d | Saldo=%.2f%n",
rs.getInt("id"),
rs.getInt("user_id"),
rs.getDouble("balance")
);
}
} catch (SQLException e) {
System.err.println("Erro ao acessar o banco: " + e.getMessage());
e.printStackTrace();
}
}
}
A saída esperaad (assumindo dados pré-existentes) seria algo como:
Conexão estabelecida. Resultados:
ID=1 | Usuário=100 | Saldo=10000.00
ID=2 | Usuário=101 | Saldo=5500.50
Comportamanto de Autocommit e Transações
Por padrão, Connection opera com autocommit = true. Isso significa que cada instrução DML (INSERT/UPDATE/DELETE) é confirmada imediatamente — tornando rollback() ineficaz sem desativar esse modo previamente.
Veja os três cenários típicos:
- Caso 1 (autocommit ativado, sem exceção): A atualização é persistida automaticamente.
- Caso 2 (autocommit ativado, com exceção): A operação ainda é aplicada — não há rollback automático.
- Caso 3 (autocommit ativado, chamada explícita de rollback): Lança
MySQLNonTransientConnectionException, poisrollback()só é válido comautocommit = false.
Para controle transacional adequado, configure explicitamente:
conn.setAutoCommit(false); // desativa autocommit
// ... executa instruções ...
conn.commit(); // confirma todas
// ou
conn.rollback(); // desfaz todas
Ferramenta Prática para Testes Rápidos
Abaixo está uma classe utilitária simplificada — focada em legibilidade e uso pontual — com suporte a consultas parametrizadas e transações manuais:
import java.sql.*;
import java.util.*;
public class DbUtils {
private static final String URL = "jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
private static final String USER = "root";
private static final String PASS = "123456";
public static List<map object="">> select(String sql) throws SQLException {
List<map object="">> rows = new ArrayList<>();
try (Connection conn = DriverManager.getConnection(URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
ResultSetMetaData meta = rs.getMetaData();
int cols = meta.getColumnCount();
while (rs.next()) {
Map<string object=""> row = new LinkedHashMap<>();
for (int i = 1; i <= cols; i++) {
row.put(meta.getColumnName(i), rs.getObject(i));
}
rows.add(row);
}
}
return rows;
}
public static int update(String sql) throws SQLException {
try (Connection conn = DriverManager.getConnection(URL, USER, PASS)) {
conn.setAutoCommit(false);
try (Statement stmt = conn.createStatement()) {
int affected = stmt.executeUpdate(sql);
conn.commit();
return affected;
} catch (SQLException e) {
conn.rollback();
throw e;
}
}
}
// Uso no main
public static void main(String[] args) throws SQLException {
System.out.println("Antes: " + select("SELECT * FROM t_balance WHERE user_id = 100"));
update("UPDATE t_balance SET balance = balance + 1500 WHERE user_id = 100");
System.out.println("Depois: " + select("SELECT * FROM t_balance WHERE user_id = 100"));
}
}</string></map></map>