在 Java 中连接 MySQL 数据库,你需要使用 MySQL 官方提供的 JDBC 驱动程序(Connector/J),它是一个实现了 JDBC(Java Database Connectivity) 接口的驱动,让 Java 程序能够与 MySQL 数据库进行交互。
如果你使用 Maven 构建项目,直接在 pom.xml 中添加以下依赖即可:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version> <!-- 请使用最新版本,可到 https://mvnrepository.com/artifact/mysql/mysql-connector-java 查看 -->
</dependency>🔒 建议定期检查 Maven Central 或 MySQL 官方 获取最新驱动版本。
下面是一个完整的 Java 示例代码,展示如何使用 JDBC 连接 MySQL 数据库,执行简单查询。
import java.sql.*;
public class MySQLExample {
public static void main(String[] args) {
// JDBC URL, 用户名和密码
String url = "jdbc:mysql://localhost:3306/你的数据库名?useSSL=false&serverTimezone=UTC";
String user = "root"; // 替换为你的用户名
String password = "123456"; // 替换为你的密码
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
// 1. 加载驱动(MySQL 8.x 可省略,因为 JDBC4 可自动加载,但显式写上也无害)
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 建立连接
connection = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接成功!");
// 3. 创建 Statement 对象
statement = connection.createStatement();
// 4. 执行 SQL 查询
String sql = "SELECT * FROM your_table"; // 替换为你的表名
resultSet = statement.executeQuery(sql);
// 5. 处理结果集
while (resultSet.next()) {
// 假设表中有 id 和 name 两个字段
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
} catch (ClassNotFoundException e) {
System.err.println("找不到 JDBC 驱动类!");
e.printStackTrace();
} catch (SQLException e) {
System.err.println("数据库连接或查询出错!");
e.printStackTrace();
} finally {
// 6. 关闭资源(倒序关闭)
try {
if (resultSet != null) resultSet.close();
if (statement != null) statement.close();
if (connection != null) connection.close();
System.out.println("数据库连接已关闭。");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}MySQL JDBC 的连接 URL 基本格式为:
jdbc:mysql://<host>:<port>/<database>?<参数>jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true参数 | 说明 |
|---|---|
useSSL=false | 是否使用 SSL 连接,默认不建议在生产关闭,但在本地测试可设为 false |
serverTimezone=UTC | 指定时区,比如 UTC、Asia/Shanghai,非常重要,否则可能报时区错误 |
allowPublicKeyRetrieval=true | MySQL 8.x 可能要求,当使用 caching_sha2_password 认证插件时可能需要 |
characterEncoding=utf8 | 指定字符编码,如 utf8 或 utf8mb4(推荐 utf8mb4 支持完整的 Unicode,比如 emoji) |
✅ 推荐完整写法(适合 MySQL 8.x,本地测试):
jdbc:mysql://localhost:3306/你的数据库名?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4版本 | 驱动类名 | JDBC URL 示例 | 推荐驱动包 |
|---|---|---|---|
MySQL 5.x | com.mysql.jdbc.Driver(已废弃) | jdbc:mysql://localhost:3306/db | mysql-connector-java 5.x(如 5.1.49) |
MySQL 8.x | com.mysql.cj.jdbc.Driver | jdbc:mysql://localhost:3306/db?serverTimezone=UTC | mysql-connector-java 8.x(如 8.0.33) |
⚠️ MySQL 8.x 推荐使用
com.mysql.cj.jdbc.Driver,而且必须指定时区(如serverTimezone=UTC或Asia/Shanghai),否则可能抛出如下错误:
The server time zone value 'xxx' is unrecognized ...从 Java 7 开始,可以使用 try-with-resources 自动关闭资源(Connection, Statement, ResultSet),更安全、更简洁:
import java.sql.*;
public class MySQLExampleSimple {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "123456";
// 使用 try-with-resources 自动关闭资源
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM your_table")) {
System.out.println("连接成功,查询数据:");
while (rs.next()) {
System.out.println(rs.getInt("id") + ", " + rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}✅ 优点:无需手动关闭连接,代码更简洁,避免资源泄露。
原因:没有引入 MySQL JDBC 驱动依赖(比如 Maven 未正确配置或驱动 jar 未放入 classpath)
✅ 解决方案:
pom.xml 是否引入了 mysql-connector-java原因:MySQL 8.x 默认要求指定时区
✅ 解决方案:在 JDBC URL 中添加参数:
serverTimezone=UTC
// 或者
serverTimezone=Asia/Shanghai原因:MySQL 8 使用
caching_sha2_password认证方式,某些客户端连接需要允许公钥检索
✅ 解决方案:在 JDBC URL 中添加:
allowPublicKeyRetrieval=true(注意:此选项有安全风险,仅限测试环境使用。生产环境建议使用正确的 SSL 配置与账号权限。)