核心要素
一个标准的 JDBC URL 通常包含以下几个部分:

jdbc:mysql://[host][:port]/[database][?property1=value1&property2=value2]
jdbc:mysql://: 这是协议头,表示使用 MySQL 的 JDBC 驱动。[host]: 数据库服务器的地址,可以是 IP 地址(如168.1.100)或域名(如localhost或db.example.com),如果连接本机,可以省略,但保留更清晰。[:port]: 数据库服务器的端口号,MySQL 的默认端口是3306,如果使用默认端口,可以省略。/[database]: 要连接的具体数据库名称。这是必需的。[?...]: 这是可选的连接参数部分,用于设置字符集、时区、SSL 等高级配置。
使用 Connector/J 8.x (推荐,适用于 MySQL 8.0+)
这是目前最推荐的方式,因为它支持 MySQL 8.0 的新特性,如 caching_sha2_password 认证插件。
基础 URL
// 连接到本地(localhost)的 3306 端口上的 'testdb' 数据库 String url = "jdbc:mysql://localhost:3306/testdb";
添加关键参数(强烈推荐)
在实际开发中,强烈建议在 URL 中添加一些关键参数,以避免常见问题。
useSSL=false: 在开发环境中禁用 SSL 连接(MySQL 8.0+ 默认启用)。注意:在生产环境中,为了安全,应该配置正确的 SSL 证书,而不是简单地禁用。serverTimezone=UTC: 设置服务器时区,防止因时区问题导致的时间错误。UTC是一个通用的选择,你也可以设置为Asia/Shanghai等。characterEncoding=UTF-8: 设置字符集为UTF-8,以避免中文等特殊字符乱码。
组合后的 URL 示例:
String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8";
完整代码示例
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class MySQLConnectorExample {
// 数据库连接 URL
private static final String DB_URL = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8";
// 数据库用户名
private static final String USER = "root";
// 数据库密码
private static final String PASS = "your_password";
public static void main(String[] args) {
// try-with-resources 语句,可以自动关闭资源
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement()) {
System.out.println("数据库连接成功!");
// --- 在这里执行你的 SQL 查询 ---
String sql = "SELECT 'Hello, MySQL!' AS message";
// stmt.executeUpdate(sql); // 用于执行 INSERT, UPDATE, DELETE
// ResultSet rs = stmt.executeQuery(sql); // 用于执行 SELECT
// ... 处理结果集 ...
} catch (SQLException e) {
System.err.println("数据库连接失败!");
e.printStackTrace();
}
}
}
使用 Connector/J 5.x (适用于 MySQL 5.7 及更早版本)
如果你使用的是旧版本的 MySQL(如 5.7),或者项目依赖旧版驱动,可以使用这种格式。

基础 URL
String url = "jdbc:mysql://localhost:3306/testdb";
添加关键参数
对于旧版驱动,参数略有不同,但核心思想一致。
useUnicode=true&characterEncoding=UTF-8: 字符集设置方式。autoReconnect=true: 自动重连,对于长时间运行的应用很有用。failOverReadOnly=false: 连接失败后,以非只读模式重连。
组合后的 URL 示例:
String url = "jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true";
通过 SSL 连接(生产环境推荐)
在生产环境中,为了保证数据安全,强烈建议启用 SSL/TLS 加密连接。
URL 格式
只需在 URL 中添加 useSSL=true。

String url = "jdbc:mysql://localhost:3306/testdb?useSSL=true&serverTimezone=UTC";
完整示例(需要服务器证书)
如果你的 MySQL 服务器配置了自签名证书或 CA 签名的证书,你需要让客户端信任它。
URL 参数说明:
useSSL=true: 启用 SSL。verifyServerCertificate=true: 验证服务器证书的有效性。requireSSL=true: 强制使用 SSL。clientCertificateKeyStoreUrl: 客户端证书库的路径(URL)。clientCertificateKeyStorePassword: 客户端证书库的密码。trustCertificateKeyStoreUrl: 信任证书库(存放 CA 证书)的路径。
示例:
假设你有一个 truststore.jks 文件来存放服务器的 CA 证书。
String url = "jdbc:mysql://localhost:3306/testdb" +
"?useSSL=true" +
"&verifyServerCertificate=true" +
"&requireSSL=true" +
"&trustCertificateKeyStoreUrl=file:/path/to/your/truststore.jks" +
"&trustCertificateKeyStorePassword=your_truststore_password";
// 在加载驱动后,需要设置系统属性来指定 truststore
// System.setProperty("javax.net.ssl.trustStore", "/path/to/your/truststore.jks");
// System.setProperty("javax.net.ssl.trustStorePassword", "your_truststore_password");
总结与最佳实践
| 特性 | Connector/J 8.x (推荐) | Connector/J 5.x (旧版) |
|---|---|---|
| 适用 MySQL 版本 | 0, 8.1, 8.2+ | 1, 5.5, 5.7 |
| 认证插件 | 支持 caching_sha2_password |
默认支持 mysql_native_password |
| SSL 参数 | useSSL=true/false |
useSSL=true/false |
| 字符集参数 | characterEncoding=UTF-8 |
useUnicode=true&characterEncoding=UTF-8 |
| 时区参数 | serverTimezone=UTC |
不需要,或用 jdbc:mysql://.../?useTimezone=true |
最佳实践清单:
- 使用最新的驱动:始终从 MySQL 官网 下载最新的 Connector/J 驱动。
- 使用 Maven/Gradle:不要手动下载 JAR 包,使用依赖管理工具可以自动处理版本和下载。
- Maven:
<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> <!-- 使用最新版本 --> </dependency> - Gradle:
implementation 'com.mysql:mysql-connector-j:8.0.33' // 使用最新版本
- Maven:
- URL 必须包含关键参数:对于 8.x 版本,至少包含
serverTimezone和characterEncoding,根据环境决定是否禁用 SSL。 - 不要硬编码凭据:不要将用户名和密码直接写在代码里,应该使用配置文件(如
application.properties)、环境变量或密钥管理服务。 - 使用
try-with-resources:确保Connection,Statement,ResultSet等资源在使用后能被正确关闭,防止资源泄露。
