核心概念
Java 通过 JDBC (Java Database Connectivity) API 来与各种数据库(包括 MySQL)进行交互,JDBC 是 Java 的一套标准,它定义了一组接口和类,让 Java 程序能够执行 SQL 语句并处理结果。

要连接 MySQL 数据库,你需要两样东西:
- JDBC 驱动程序:这是 MySQL 官方提供的、实现了 JDBC 接口的库,Java 程序通过它才能“说”懂 MySQL 的语言。
- Java 代码:使用 JDBC API 来加载驱动、建立连接、创建语句、执行查询和处理结果。
第一步:准备工作
安装 MySQL 数据库
确保你的计算机上已经安装并运行了 MySQL 数据库,你可以从 MySQL 官网 下载并安装。
创建数据库和表
为了演示,我们先在 MySQL 中创建一个简单的数据库和一张表。
-- 登录到你的 MySQL 服务器
-- mysql -u root -p
-- 创建一个名为 'java_test' 的数据库
CREATE DATABASE java_test;
-- 使用这个数据库
USE java_test;
-- 创建一张名为 'users' 的表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
age INT
);
-- 插入一些测试数据
INSERT INTO users (name, email, age) VALUES
('Alice', 'alice@example.com', 28),
('Bob', 'bob@example.com', 32),
('Charlie', 'charlie@example.com', 24);
下载 MySQL JDBC 驱动
这是最关键的一步,你需要下载 MySQL Connector/J,也就是 JDBC 驱动。

- 访问 MySQL Connector/J 下载页面。
- 选择平台无关的版本(Platform Independent)。
- 下载
.zip或.tar.gz压缩包。 - 解压后,你会得到一个
mysql-connector-j-x.x.x.jar文件(x.x.x是版本号),这个 JAR 文件就是我们需要的驱动。
第二步:在项目中配置 JDBC 驱动
你有两种主要方式将这个 JAR 文件添加到你的 Java 项目中:
IDE(如 IntelliJ IDEA 或 Eclipse)中手动添加
这是最简单直接的方式,适合初学者和单个项目。
-
在 IntelliJ IDEA 中:
- 打开你的项目。
- 在左侧的文件浏览器中,右键点击你的项目名称(或
src文件夹)。 - 选择
Open Module Settings(或按F4)。 - 在弹出的窗口中,选择
Libraries。 - 点击 号,选择
Java。 - 找到并选择你刚刚下载的
mysql-connector-j-x.x.x.jar文件。 - 点击
OK,IDE 会自动将其添加到项目的 Classpath 中。
-
在 Eclipse 中:
(图片来源网络,侵删)- 右键点击你的项目,选择
Build Path->Configure Build Path。 - 在
Libraries标签页下,点击Add External JARs...。 - 找到并选择
mysql-connector-j-x.x.x.jar文件。 - 点击
Apply and Close。
- 右键点击你的项目,选择
使用 Maven(推荐用于大型项目)
如果你的项目使用 Maven 构建管理,你只需要在 pom.xml 文件中添加依赖即可,Maven 会自动帮你下载。
打开你的 pom.xml 文件,在 <dependencies> 标签内添加以下内容:
<dependencies>
<!-- 其他依赖... -->
<!-- MySQL Connector/J 驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version> <!-- 建议使用最新稳定版 -->
</dependency>
</dependencies>
第三步:编写 Java 连接代码
下面是一个完整的 Java 示例,演示了如何连接到 MySQL 数据库,并执行查询操作。
数据库连接信息:
- 主机:
localhost(如果你的 MySQL 在本机运行) - 端口:
3306(MySQL 默认端口) - 数据库名:
java_test - 用户名:
root - 密码:
你的 MySQL 密码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MysqlJdbcExample {
// --- 数据库连接信息 ---
// 注意:如果使用较新版本的驱动,URL中的 "com.mysql.cj.jdbc.Driver" 是推荐的
private static final String DB_URL = "jdbc:mysql://localhost:3306/java_test?useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PASS = "你的密码"; // 请替换成你自己的密码
public static void main(String[] args) {
// try-with-resources 语句可以自动关闭资源,是 Java 7+ 的最佳实践
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name, email, age FROM users")) {
// 1. 加载驱动 (对于较新版本的 JDBC 驱动,这步通常是可选的,但写上更明确)
// Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("成功连接到数据库!");
// 2. 执行查询
System.out.println("ID\tName\t\tEmail\t\tAge");
System.out.println("-------------------------------------------");
// 3. 遍历结果集
while (rs.next()) {
// 通过列名获取数据,更健壮,不易因列顺序改变而出错
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
int age = rs.getInt("age");
// 输出结果
System.out.printf("%d\t%-15s\t%-20s\t%d\n", id, name, email, age);
}
} catch (SQLException e) {
// 捕获并处理 SQL 异常
System.err.println("数据库连接或查询出错!");
e.printStackTrace();
}
}
}
代码解析
-
DB_URL: 数据库的统一资源定位符。jdbc:mysql://: 协议和子协议,表示使用 JDBC 连接到 MySQL。localhost:3306: 数据库服务器地址和端口。/java_test: 要连接的数据库。?useSSL=false&serverTimezone=UTC: URL 参数。useSSL=false: 在本地开发时禁用 SSL,避免警告,生产环境应配置正确的 SSL。serverTimezone=UTC: 指定服务器时区,避免时区警告。
-
DriverManager.getConnection(url, user, password): 这是建立连接的核心方法,它尝试使用提供的 URL、用户名和密码连接到数据库。 -
try-with-resources: 语法(Connection conn = ...; Statement stmt = ...; ResultSet rs = ...)。- 这个语法会确保
conn,stmt,rs在代码块执行完毕后自动被关闭,即使发生异常也是如此,这极大地避免了资源泄漏,是现代 Java 编程的推荐做法。
- 这个语法会确保
-
conn.createStatement(): 创建一个Statement对象,用于执行静态 SQL 语句。 -
stmt.executeQuery("..."): 执行一个查询(SELECT)语句,并返回一个ResultSet对象,该对象包含了查询结果。 -
while (rs.next()):ResultSet的游标最初位于第一行 之前。rs.next()方法将游标移动到下一行,如果存在下一行则返回true,否则返回false,我们用它来遍历所有结果行。 -
rs.getXXX("columnName"): 从当前行中获取指定列的数据。getInt("id"): 获取名为 "id" 的列的值,并转换为int类型。getString("name"): 获取名为 "name" 的列的值,并转换为String类型。
-
catch (SQLException e): 如果连接或执行 SQL 过程中发生任何错误(如密码错误、表不存在等),会抛出SQLException,我们在这里捕获并打印错误信息。
常见问题
-
java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver- 原因: JDBC 驱动 JAR 文件没有被正确添加到项目的 Classpath 中。
- 解决: 回到第二步,确保你已将
mysql-connector-j-x.x.x.jar文件添加到你的项目中。
-
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)- 原因: 用户名或密码错误,或者该用户没有连接到指定数据库的权限。
- 解决: 检查你的
USER和PASS变量是否正确,你可以尝试在 MySQL 命令行中用相同的凭据登录来验证。
-
java.sql.SQLException: The server time zone value '�йʱ��' is unrecognized or represents more than one time zone.- 原因: 服务器和客户端的时区不一致。
- 解决: 在数据库 URL 中添加时区参数,如
?serverTimezone=UTC或?serverTimezone=Asia/Shanghai。
-
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/java_test- 原因: JDBC 驱动没有被加载。
- 解决: 确保你的 JDBC 驱动版本较新(8.x),或者手动加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");,在现代驱动中,这通常不是必需的,但可以作为一个排查步骤。
进阶:使用 PreparedStatement 防止 SQL 注入
上面的例子使用了 Statement,它不适合处理用户输入,因为容易受到 SQL 注入攻击,在实际开发中,你应该优先使用 PreparedStatement。
// 示例:使用 PreparedStatement 查询特定年龄的用户
String sql = "SELECT name, email FROM users WHERE age > ?";
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
// 设置参数(索引从 1 开始)
pstmt.setInt(1, 25); // 查询年龄大于 25 的用户
// 执行查询
try (ResultSet rs = pstmt.executeQuery()) {
System.out.println("Name\tEmail");
System.out.println("----------------------");
while (rs.next()) {
System.out.println(rs.getString("name") + "\t" + rs.getString("email"));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
PreparedStatement 会将 SQL 语句和参数分开处理,从而有效防止 SQL 注入,并且通常性能更好,因为它可以被数据库预编译和缓存。
