Java MySQL 连接(完整教程)

为什么你需要掌握 Java MySQL 连接

在现代软件开发中,数据存储和读取是几乎所有应用的核心环节。无论是用户登录信息、商品订单,还是日志记录,都离不开数据库的支持。而 Java 作为企业级开发的主流语言之一,与 MySQL 这个轻量级、高性能的关系型数据库的结合,已经成为开发者必备的技能组合。

想象一下,你的 Java 应用就像一个餐厅,而 MySQL 就是餐厅的后厨。用户点菜(前端请求)之后,服务员(Java 程序)需要把订单传给后厨(数据库),后厨处理完再把菜品(数据)送回来。这个“传单”的过程,就是 Java MySQL 连接的实质。

掌握 Java MySQL 连接,意味着你能构建真正能“活起来”的应用,而不是只能在内存里跑跑数据的玩具程序。它不仅是技术栈的一部分,更是你通往后端开发之路的敲门砖。


准备工作:环境与依赖配置

在开始编码之前,确保你的开发环境已经就绪。你需要:

  • 一台安装了 Java 8 或更高版本的电脑(推荐使用 Java 11 或 Java 17)
  • 一个运行中的 MySQL 服务(建议 8.0 版本)
  • 一个支持 Maven 或 Gradle 的项目构建工具(我们以 Maven 为例)

首先,确保 MySQL 已经启动。打开终端或命令行,输入:

mysql -u root -p

输入你的密码后进入 MySQL 命令行,创建一个测试数据库:

CREATE DATABASE test_db;
USE test_db;
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE
);

这一步相当于在后厨建了一个“用户登记本”,以后所有用户信息都将存入这个表。

接下来,在你的 Maven 项目中,打开 pom.xml 文件,添加 MySQL 驱动依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

注:这里使用的是 MySQL 8.0 的官方 JDBC 驱动。版本号建议保持最新,以获得更好的性能和安全性。Maven 会自动下载并管理这个依赖。


建立连接:Java 与 MySQL 的“握手”

Java 通过 JDBC(Java Database Connectivity)标准来连接数据库。你可以把 JDBC 理解为一个“翻译官”,它让 Java 代码能和数据库“对话”。

下面是一个完整的连接示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnection {

    // 数据库连接的 URL,格式为:jdbc:mysql://主机:端口/数据库名
    private static final String URL = "jdbc:mysql://localhost:3306/test_db";
    
    // 数据库用户名
    private static final String USERNAME = "root";
    
    // 数据库密码
    private static final String PASSWORD = "your_password"; // 替换为你自己的密码

    public static void main(String[] args) {
        Connection connection = null;

        try {
            // 1. 加载 MySQL 驱动类(JDBC 4.0 以后可自动加载,但显式加载更清晰)
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. 使用 DriverManager 获取连接对象
            connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);

            // 3. 判断连接是否成功
            if (connection != null) {
                System.out.println("✅ Java MySQL 连接成功!");
            }

        } catch (ClassNotFoundException e) {
            System.err.println("❌ 找不到 MySQL 驱动类,请检查依赖是否正确添加。");
            e.printStackTrace();

        } catch (SQLException e) {
            System.err.println("❌ 数据库连接失败,请检查 URL、用户名或密码是否正确。");
            e.printStackTrace();

        } finally {
            // 4. 关闭连接,释放资源
            if (connection != null) {
                try {
                    connection.close();
                    System.out.println("🔒 连接已关闭。");
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

关键点说明

  • Class.forName("com.mysql.cj.jdbc.Driver"):显式加载驱动类,虽然 JDBC 4.0 后可自动加载,但加上更稳妥。
  • DriverManager.getConnection():这是获取数据库连接的核心方法,参数分别是数据库地址、用户名、密码。
  • finally 块:确保连接无论是否成功,都会被关闭,避免资源泄露。

运行这段代码,如果一切正常,你会看到输出:

✅ Java MySQL 连接成功!
🔒 连接已关闭。

数据操作:增删改查(CRUD)实战

连接成功后,下一步就是操作数据。我们以“用户表”为例,演示如何完成基本的增删改查操作。

插入数据(INSERT)

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class InsertUser {

    private static final String URL = "jdbc:mysql://localhost:3306/test_db";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "your_password";

    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement statement = null;

        try {
            // 建立连接
            connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);

            // SQL 语句:插入一条用户记录
            String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
            statement = connection.prepareStatement(sql);

            // 设置参数:? 是占位符,防止 SQL 注入
            statement.setString(1, "张三");
            statement.setString(2, "zhangsan@example.com");

            // 执行插入操作
            int rowsAffected = statement.executeUpdate();

            if (rowsAffected > 0) {
                System.out.println("✅ 用户插入成功,影响了 " + rowsAffected + " 行。");
            }

        } catch (SQLException e) {
            System.err.println("❌ 插入失败:" + e.getMessage());
            e.printStackTrace();

        } finally {
            // 释放资源
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

为什么用 PreparedStatement?
直接拼接 SQL 容易引发 SQL 注入攻击。? 占位符让数据库先编译 SQL,再传参,安全又高效。


查询数据(SELECT)

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class SelectUsers {

    private static final String URL = "jdbc:mysql://localhost:3306/test_db";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "your_password";

    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try {
            connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);

            // 查询所有用户
            String sql = "SELECT id, name, email FROM users";
            statement = connection.prepareStatement(sql);
            resultSet = statement.executeQuery(); // executeQuery 用于 SELECT

            // 遍历结果集
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                String email = resultSet.getString("email");
                System.out.println("ID: " + id + ", 姓名: " + name + ", 邮箱: " + email);
            }

        } catch (SQLException e) {
            System.err.println("❌ 查询失败:" + e.getMessage());
            e.printStackTrace();

        } finally {
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

ResultSet 是数据库返回的结果集合,你可以用 next() 移动指针,用 getInt()getString() 获取字段值。


连接池:提升性能的关键

当应用并发用户增多时,频繁创建和关闭连接会成为性能瓶颈。这时,连接池就派上用场了。

HikariCP 是目前最流行、性能最高的连接池之一。在 pom.xml 中添加依赖:

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>5.0.1</version>
</dependency>

使用示例:

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class ConnectionPoolExample {

    public static void main(String[] args) {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/test_db");
        config.setUsername("root");
        config.setPassword("your_password");
        config.setMaximumPoolSize(10); // 最大连接数
        config.setConnectionInitSql("SELECT 1"); // 连接初始化 SQL

        HikariDataSource dataSource = new HikariDataSource(config);

        // 获取连接
        try (var connection = dataSource.getConnection()) {
            System.out.println("✅ 从连接池获取连接成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 关闭连接池
        dataSource.close();
    }
}

连接池的优势

  • 复用连接,避免频繁创建
  • 控制并发连接数,防止数据库过载
  • 提高响应速度,尤其在高并发场景

最佳实践与常见问题排查

常见问题汇总

问题 可能原因 解决方案
ClassNotFoundException: com.mysql.cj.jdbc.Driver 依赖未添加或版本错误 检查 pom.xml 是否包含正确驱动
Access denied for user 'root'@'localhost' 用户名或密码错误 检查 MySQL 用户权限和密码
Could not create connection to database server MySQL 服务未启动 运行 sudo systemctl start mysql 启动服务
SQL 注入漏洞 使用拼接字符串 始终使用 PreparedStatement

实用建议

  • 生产环境中务必使用连接池(如 HikariCP)
  • 密码等敏感信息不要硬编码,使用配置文件或环境变量
  • 合理设置连接池大小,避免资源浪费
  • try-with-resources 自动管理资源,减少内存泄漏风险

总结

Java MySQL 连接并不是一个复杂的概念,但它承载着整个应用的数据生命线。从最简单的 DriverManager.getConnection(),到使用连接池提升性能,每一步都值得你认真掌握。

无论你是初学者还是有一定经验的开发者,理解并熟练使用 Java MySQL 连接,都能让你的项目更稳定、更高效。它不仅是技术能力的体现,更是构建可扩展系统的基础。

当你能自如地在 Java 代码中操作 MySQL 数据时,你就真正迈出了后端开发的第一步。接下来,你可以尝试整合 Spring Boot、MyBatis 等框架,让数据操作变得更简洁、更优雅。

记住:数据库是应用的“心脏”,而 Java MySQL 连接,就是为这颗心脏输送氧气的血管。