Estabelecendo Conexão com MySQL via JDBC em Java

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, pois rollback() só é válido com autocommit = 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>

Tags: java jdbc MySQL SQL transactions

Publicado em 8-7 12:03