核心概念:JDBC 和 MySQL Connector/J
-
JDBC (Java Database Connectivity): 这是 Java 提供的一套标准 API(应用程序接口),用于执行 SQL 语句,它定义了如何连接数据库、执行查询、获取结果等操作,你可以把它想象成 Java 和数据库之间的“通用语言”或“翻译官”。
(图片来源网络,侵删) -
MySQL Connector/J: 这是 MySQL 官方提供的 JDBC 驱动程序,它实现了 JDBC 接口,使得 Java 程序能够“说” MySQL 数据库能听懂的语言,你下载的 JAR 包就是这个驱动程序。
获取 MySQL Connector/J JAR 包
你需要从 MySQL 官方网站下载最新的 JDBC 驱动。
- 访问官网:前往 MySQL Connector/J 下载页面。
- 选择版本:
- Platform Independent (独立平台): 这是推荐的选择,它是一个 ZIP 压缩包,包含
.jar文件,适用于任何操作系统。 - Operating System: 如果你使用的是特定的 IDE(如 IntelliJ IDEA 或 Eclipse),它们可能会提供自动下载的选项,但手动下载总是最可靠的。
- Platform Independent (独立平台): 这是推荐的选择,它是一个 ZIP 压缩包,包含
- 下载并解压:下载 ZIP 文件并解压,你会找到一个名为
mysql-connector-j-8.0.xx(版本号可能不同)的文件夹,里面有一个核心文件:mysql-connector-j-8.0.xx.jar,这个就是你需要添加到项目中的 JAR 包。
版本注意:
mysql-connector-j-8.x.x.jar: 用于连接 MySQL 8.0+ 或 MariaDB 10.2+,这是目前的主流版本。mysql-connector-java-5.1.xx-bin.jar: 用于连接 MySQL 5.x 或更早版本,如果你使用的是旧版数据库,才需要这个。强烈建议使用新版驱动连接新版数据库。
将 JAR 包添加到你的 Java 项目
这一步是告诉你的项目(编译器和运行时环境)去哪里找这个驱动,根据你使用的开发工具,方法不同。

方法 A: 使用 IDE (推荐)
这是最简单、最常用的方法。
以 IntelliJ IDEA 为例:
- 打开你的项目。
- 在左侧的
Project窗口中,右键点击你的项目名称(或lib文件夹,如果没有就创建一个)。 - 选择
Add as Library...(或Add as Framework...)。 - 在弹出的窗口中,点击
Attach Files...或 号。 - 浏览并选择你刚刚下载的
mysql-connector-j-8.0.xx.jar文件。 - 确认库的作用域(通常保持默认的
Compile和Runtime即可),然后点击OK。
以 Eclipse 为例:
- 在
Project Explorer中,右键点击你的项目。 - 选择
Build Path->Configure Build Path...。 - 在
Libraries标签页中,点击Add External JARs...。 - 浏览并选择
mysql-connector-j-8.0.xx.jar文件。 - 点击
Apply and Close。
方法 B: 使用构建工具 (Maven/Gradle)
这是现代 Java 项目的标准做法,无需手动下载和添加 JAR 包。

使用 Maven (pom.xml):
在你的 pom.xml 文件的 <dependencies> 标签内添加以下依赖:
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version> <!-- 使用你需要的最新版本 -->
</dependency>
Maven 会自动下载并管理这个依赖。
使用 Gradle (build.gradle 或 build.gradle.kts):
在你的 dependencies 代码块中添加:
// Groovy DSL implementation 'com.mysql:mysql-connector-j:8.0.33' // 使用你需要的最新版本
// Kotlin DSL
implementation("com.mysql:mysql-connector-j:8.0.33") // 使用你需要的最新版本
编写 Java 连接代码
万事俱备,可以写代码了,下面是一个完整的、包含最佳实践的示例。
准备工作
确保你已经有一个 MySQL 数据库在运行,并且创建了一个数据库和用户。
-- 在 MySQL 命令行中执行 CREATE DATABASE my_test_db; CREATE USER 'java_user'@'localhost' IDENTIFIED BY 'your_password'; GRANT ALL PRIVILEGES ON my_test_db.* TO 'java_user'@'localhost'; FLUSH PRIVILEGES;
完整 Java 代码示例
这个例子展示了如何连接数据库、执行一个简单的查询,并正确处理资源和异常。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MysqlJdbcExample {
// 数据库连接信息
// MySQL 8.0+ 的驱动类名是 com.mysql.cj.jdbc.Driver
// URL 格式: jdbc:mysql://[主机名]:[端口]/[数据库名]?[属性]
private static final String DB_URL = "jdbc:mysql://localhost:3306/my_test_db?useSSL=false&serverTimezone=UTC";
private static final String USER = "java_user";
private static final String PASS = "your_password";
public static void main(String[] args) {
// 使用 try-with-resources 语句,可以自动关闭资源
// Connection, Statement, ResultSet 都实现了 AutoCloseable 接口
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 'Hello, MySQL!' AS message")) {
// 检查连接是否成功
if (conn != null) {
System.out.println("连接数据库成功!");
}
// 处理结果集
while (rs.next()) {
// 通过列名获取数据,更安全
String message = rs.getString("message");
System.out.println("从数据库获取到的消息: " + message);
}
} catch (SQLException e) {
// 捕获并处理 SQL 异常
System.err.println("数据库连接或查询失败!");
e.printStackTrace();
}
// try-with-resources 会自动在这里关闭 conn, stmt, rs
// 即使发生异常,它们也会被正确关闭
}
}
代码关键点解析
-
加载驱动 (旧版方式): 在 JDBC 4.0 (Java 6+) 之后,已经不再需要显式地加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver"),JDBC 驱动会通过META-INF/services/java.sql.Driver文件自动注册,在现代代码中你可以省略这一步。 -
DriverManager.getConnection(): 这是获取数据库连接的核心方法,它需要三个参数:DB_URL: 数据库的统一资源定位符。jdbc:mysql://: 协议和子协议。localhost:3306: 数据库服务器地址和端口。/my_test_db: 要连接的数据库。?useSSL=false&serverTimezone=UTC: URL 属性。useSSL=false用于开发环境(生产环境应配置 SSL)。serverTimezone=UTC指定时区,避免时区警告。
USER: 数据库用户名。PASS: 数据库密码。
-
try-with-resources语句: 这是 Java 7 引入的一个非常重要的特性,它会自动实现了AutoCloseable接口的对象(如Connection,Statement,ResultSet)在代码块执行完毕后关闭,即使发生异常也能保证关闭,这极大地简化了资源管理,避免了资源泄漏。 -
SQLException: 所有与数据库交互的操作都可能抛出SQLException,因此必须用try-catch块来处理它。
常见问题与解决方案
java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
原因: JVM 在运行时找不到 MySQL 驱动类,这几乎总是因为 JAR 包没有被正确添加到项目的类路径(Classpath)中。 解决方案:
- 回到 步骤二,仔细检查你是否将
mysql-connector-j-8.0.xx.jar成功添加到了你的项目中。 - 如果你使用的是 Maven 或 Gradle,确保
pom.xml或build.gradle文件中的依赖配置正确,并且已经执行了mvn install或gradle build。
java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
原因: 你的 MySQL 服务器或客户端系统时区与 Java 程序的默认时区不匹配。 解决方案: 在 JDBC URL 中添加时区属性,如上面代码所示:
private static final String DB_URL = "jdbc:mysql://localhost:3306/my_test_db?serverTimezone=UTC"; // 或者使用你的本地时区,如 Asia/Shanghai // private static final String DB_URL = "jdbc:mysql://localhost:3306/my_test_db?serverTimezone=Asia/Shanghai";
java.sql.SQLException: Access denied for user 'java_user'@'localhost'
原因: 用户名或密码错误,或者该用户没有连接到指定数据库的权限。 解决方案:
- 检查代码中的
USER和PASS是否正确。 - 登录 MySQL,使用
GRANT命令确保用户权限正确(参考准备工作中的 SQL 语句)。
Communications link failure
原因: 无法连接到 MySQL 服务器。 解决方案:
- MySQL 服务是否启动? 检查你的 MySQL 服务是否正在运行。
- 地址和端口是否正确?
localhost对应的是0.0.1,MySQL 安装在其他机器上,请使用正确的 IP 地址,默认端口是3306,如果不是,请修改 URL 中的端口号。 - 防火墙是否阻止? 检查本地或服务器的防火墙设置,是否允许
3306端口的通信。
连接 MySQL 数据库的流程可以概括为:
- 获取驱动: 下载
mysql-connector-j-x.x.x.jar。 - 配置项目: 将 JAR 包添加到项目类路径中(通过 IDE 或 Maven/Gradle)。
- 编写代码:
- 使用
DriverManager.getConnection()获取Connection对象。 - 使用
Connection创建Statement对象。 - 使用
Statement执行 SQL,获取ResultSet。 - 遍历
ResultSet处理数据。
- 使用
- 管理资源: 使用
try-with-resources确保Connection,Statement,ResultSet被正确关闭。 - 处理异常: 用
try-catch捕获SQLException。
