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 驱动依赖:

mysql

mysql-connector-java

8.0.33

注:这里使用的是 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 中添加依赖:

com.zaxxer

HikariCP

5.0.1

使用示例:

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 连接,就是为这颗心脏输送氧气的血管。