- 准备驱动:下载并添加MySQL的JDBC驱动。
- 加载驱动:在Java代码中加载驱动类。
- 建立连接:使用
DriverManager获取数据库连接对象。 - 创建执行对象:通过连接对象创建
Statement或PreparedStatement来执行SQL。 - 执行SQL:执行查询或更新操作。
- 处理结果:如果是查询,处理返回的
ResultSet结果集。 - 关闭资源:按照后进先出的原则,关闭所有打开的资源(
ResultSet,Statement,Connection)。
第一步:准备MySQL JDBC驱动
你需要下载MySQL官方提供的Java驱动库,也就是JAR包。

-
下载地址:
- 访问 MySQL Connector/J 下载页面。
- 选择 "Platform Independent" (平台独立) 版本,下载一个ZIP压缩包。
- 或者,如果你使用Maven或Gradle,可以直接在项目中添加依赖,无需手动下载。
-
添加到项目:
- 对于普通Java项目:将下载的ZIP包解压,找到
mysql-connector-j-版本号.jar文件,在你的IDE(如Eclipse, IntelliJ IDEA)中,将这个JAR文件添加到项目的 "External Libraries" 或 "Libraries" 中。 - 对于Maven项目:在
pom.xml文件中添加以下依赖,Maven会自动帮你下载和管理。
<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> <!-- 建议使用最新稳定版 --> </dependency>- 对于Gradle项目:在
build.gradle文件中添加以下依赖。
implementation 'com.mysql:mysql-connector-j:8.0.33' // 建议使用最新稳定版
- 对于普通Java项目:将下载的ZIP包解压,找到
第二步:编写Java代码连接数据库
下面是一个完整的、详细的Java代码示例,展示了如何连接MySQL数据库并执行一个简单的查询。
核心代码示例
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MySQLJdbcExample {
// 数据库连接信息
// 注意:如果MySQL 8.0+,驱动类名和URL略有不同
private static final String DB_URL = "jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC";
private static final String USER = "your_username";
private static final String PASS = "your_password";
public static void main(String[] args) {
// 1. 定义资源变量,并在finally块中关闭
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 2. 加载JDBC驱动 (对于新版驱动,这步通常是可选的,但写上更稳妥)
// Class.forName("com.mysql.cj.jdbc.Driver");
// 3. 获取数据库连接
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
System.out.println("Connection successful!");
// 4. 创建执行SQL语句的Statement对象
// 推荐使用PreparedStatement来防止SQL注入
String sql = "SELECT id, name, email FROM users WHERE id = ?";
stmt = conn.prepareStatement(sql);
// 设置参数
stmt.setInt(1, 1); // 假设我们要查询id为1的用户
// 5. 执行查询,获取结果集
System.out.println("Executing query: " + sql);
rs = stmt.executeQuery();
// 6. 处理结果集
while (rs.next()) {
// 通过列名获取数据,更具可读性且不易出错
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
// 打印输出
System.out.print("ID: " + id);
System.out.print(", Name: " + name);
System.out.println(", Email: " + email);
}
} catch (SQLException e) {
// 捕获并处理SQL异常
e.printStackTrace();
} finally {
// 7. 关闭资源 (非常重要!)
// 关闭顺序:ResultSet -> Statement -> Connection
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
System.out.println("Database resources closed.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
重要细节和说明
驱动类名和URL的差异 (MySQL 5.x vs 8.x)
这是最容易出错的地方。请根据你的MySQL版本选择正确的配置。

| 特性 | MySQL 5.x | MySQL 8.0+ |
|---|---|---|
| 驱动类名 | com.mysql.jdbc.Driver |
com.mysql.cj.jdbc.Driver |
| URL格式 | jdbc:mysql://host:port/db_name |
jdbc:mysql://host:port/db_name?... |
| SSL | 可选 | 强烈建议使用,需在URL中显式禁用 useSSL=false |
| 时区 | 无需特殊处理 | 必须指定时区,否则会报错 serverTimezone=UTC |
示例URL:
-
MySQL 5.x:
String DB_URL = "jdbc:mysql://localhost:3306/your_database_name";
-
MySQL 8.0+:
String DB_URL = "jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC"; // 如果你的数据库在远程,可能需要添加 allowPublicKeyRetrieval=true // String DB_URL = "jdbc:mysql://remote_host:3306/your_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
Statement vs PreparedStatement
-
Statement:用于执行静态的SQL语句,如果SQL语句中包含变量,需要手动拼接字符串,非常容易导致SQL注入攻击,不推荐使用。
(图片来源网络,侵删)// 不推荐的方式 String sql = "SELECT * FROM users WHERE name = '" + userName + "'"; stmt = conn.createStatement(); rs = stmt.executeQuery(sql);
-
PreparedStatement:预编译SQL语句,它使用 作为占位符,然后通过setXxx()方法来设置参数,这种方式更安全、高效,并且能防止SQL注入。强烈推荐使用PreparedStatement。
关闭资源的重要性
数据库连接(Connection)、语句对象(Statement/PreparedStatement)和结果集(ResultSet)都是数据库资源,非常宝贵,如果不关闭,会导致数据库连接泄漏,最终可能耗尽数据库的连接池,导致整个应用程序无法工作。
finally 块确保无论是否发生异常,资源都会被尝试关闭,这是Java编程中的一个良好实践。
使用连接池 (Connection Pool)
在真实的应用程序中,频繁地创建和关闭连接是非常低效的,通常会使用连接池来管理数据库连接。
连接池在应用程序启动时创建一组数据库连接,当需要连接时从池中获取,使用完毕后归还给池中,而不是关闭。
流行的连接池库:
- HikariCP:目前性能最好、最流行的连接池。
- Apache DBCP
- C3P0
使用HikariCP的简单示例:
-
添加Maven依赖:
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> <!-- 使用最新版本 --> </dependency> -
配置和使用:
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class HikariExample { private static HikariDataSource dataSource; static { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC"); config.setUsername("your_username"); config.setPassword("your_password"); config.setDriverClassName("com.mysql.cj.jdbc.Driver");
