JDBC URL 是一个标准化的字符串,它告诉 Java 数据库驱动程序如何连接到特定的数据库,其基本格式如下:

jdbc:mysql://[host][:port]/[database][?propertyName1=propertyValue1][&propertyName2=propertyValue2]
下面我们逐一解析这个格式的每个部分,并提供详细的说明和示例。
URL 结构详解
jdbc:mysql://
这是协议和子协议部分,是固定的。
jdbc::表示这是一个 JDBC URL。mysql::表示要使用 MySQL 的 JDBC 驱动。
[host]
这是数据库服务器的地址。
- 可以是 IP 地址,
168.1.100 - 可以是 主机名,
localhost或db.example.com - 如果连接的是 本地数据库,通常使用
localhost。
[:port]
这是数据库服务器监听的端口号。

- MySQL 的默认端口号是
3306。 - 如果你的 MySQL 服务运行在默认端口上,这部分可以省略。
- 如果使用了自定义端口(
3307),则必须指定,格式为3307。
/[database]
这是你要连接的 数据库名称。
- 这是必需的部分,你必须指定要连接到哪个数据库。
/my_test_db
[?propertyName1=propertyValue1]
这部分是 连接参数,用于配置连接的各种属性,它以 开始,多个参数之间用 & 分隔。
常用连接参数
这些参数非常重要,可以极大地影响连接的性能、行为和安全性。
| 参数 | 描述 | 推荐值/示例 |
|---|---|---|
user |
数据库用户名 | user=root |
password |
数据库密码 | password=your_password |
useSSL |
是否使用 SSL 加密连接 | false (旧版) 或 true (新版) 注意: MySQL 8+ 推荐使用 useSSL=false 或 sslMode=DISABLED,因为 useSSL 已被废弃。 |
serverTimezone |
设置服务器时区,避免时区警告 | serverTimezone=Asia/Shanghai |
useUnicode |
是否使用 Unicode 字符集 | true |
characterEncoding |
设置字符编码,防止乱码 | characterEncoding=UTF-8 |
allowPublicKeyRetrieval |
允许从服务器获取公钥,用于密码交换 | true (在特定情况下需要) |
useSSL |
(已废弃) 是否使用 SSL | false |
sslMode |
(推荐) SSL 模式 | DISABLED, REQUIRED, VERIFY_CA, VERIFY_IDENTITY |
完整示例
下面是几个在不同场景下使用的完整 URL 示例。

示例 1:本地连接(最常见)
连接到本机、默认端口、名为 my_test_db 的数据库。
String url = "jdbc:mysql://localhost:3306/my_test_db";
示例 2:远程连接
连接到 IP 地址为 168.1.100、端口为 3306 的远程服务器上的 production_db 数据库。
String url = "jdbc:mysql://192.168.1.100:3306/production_db";
示例 3:带用户名和密码的本地连接
注意:在现代 Java 开发中,通常推荐在 DriverManager.getConnection() 方法中直接传递用户名和密码,而不是将它们放在 URL 中,这样更安全,也更容易管理。
// 不推荐在URL中写密码 String url = "jdbc:mysql://localhost:3306/my_test_db?user=root&password=123456"; // 推荐的方式 String url = "jdbc:mysql://localhost:3306/my_test_db"; String user = "root"; String password = "123456";
示例 4:包含常用参数的连接(防止乱码和时区问题)
这是一个非常推荐的配置,可以解决大多数初学者遇到的字符集和时区问题。
String url = "jdbc:mysql://localhost:3306/my_test_db" +
"?useSSL=false" +
"&serverTimezone=Asia/Shanghai" +
"&useUnicode=true" +
"&characterEncoding=UTF-8";
不同 MySQL 版本的 URL 差异
MySQL 5.x
对于 MySQL 5.x 版本,上面的示例基本都适用,SSL 参数 useSSL 仍然被广泛使用。
MySQL 8.x
从 MySQL 8.0 开始,默认的身份验证插件从 mysql_native_password 变成了 caching_sha2_password,这可能会导致一些旧的 JDBC 驱动(如 mysql-connector-java-5.1.x)连接失败。
解决方案:
- 升级 JDBC 驱动:使用
mysql-connector-java-8.x.x或更高版本的驱动,这是最佳实践。 - 在 URL 中添加参数:如果你暂时无法升级驱动,可以在 URL 中添加参数来指定使用旧的认证方式:
String url = "jdbc:mysql://localhost:3306/my_test_db?user=root&password=your_password&useSSL=false&allowPublicKeyRetrieval=true";
allowPublicKeyRetrieval=true是关键,它允许驱动在不使用 SSL 的情况下获取公钥。
完整的 Java 连接代码示例
下面是一个完整的、可运行的 Java 类,展示了如何使用上述 URL 连接到 MySQL 数据库。
准备工作:
-
确保你已经安装了 MySQL 数据库,并创建了一个测试数据库和表。
-
下载 MySQL JDBC 驱动(
.jar文件),并将其添加到你的项目的类路径中,如果你使用 Maven,请在pom.xml中添加以下依赖:<!-- For MySQL 8.x --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> <!-- 使用最新的稳定版本 --> </dependency> <!-- For MySQL 5.x --> <!-- <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency> -->
Java 代码 (JdbcExample.java):
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcExample {
// 数据库连接 URL (根据你的环境修改)
// 这是一个针对 MySQL 8.x 的推荐配置
private static final String URL = "jdbc:mysql://localhost:3306/my_test_db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
private static final String USER = "root"; // 你的数据库用户名
private static final String PASSWORD = "your_password"; // 你的数据库密码
public static void main(String[] args) {
// 使用 try-with-resources 语句,确保连接、语句和结果集在使用后自动关闭
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD)) {
System.out.println("数据库连接成功!");
// --- 示例1:查询数据 ---
queryData(conn);
// --- 示例2:插入数据 ---
// insertData(conn);
} catch (SQLException e) {
System.err.println("数据库连接失败!");
e.printStackTrace();
}
}
private static void queryData(Connection conn) throws SQLException {
String sql = "SELECT id, name, email FROM users";
try (PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery()) {
System.out.println("\n--- 查询用户列表 ---");
while (rs.next()) {
// 通过列名获取数据,更具可读性
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
System.out.printf("ID: %d, Name: %s, Email: %s%n", id, name, email);
}
}
}
private static void insertData(Connection conn) throws SQLException {
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
// 设置参数
pstmt.setString(1, "张三");
pstmt.setString(2, "zhangsan@example.com");
// 执行插入
int affectedRows = pstmt.executeUpdate();
System.out.println("\n--- 插入数据成功,影响了 " + affectedRows + " 行。");
}
}
}
| 连接场景 | URL 示例 |
|---|---|
| 本地默认端口 | jdbc:mysql://localhost:3306/your_database |
| 远程指定端口 | jdbc:mysql://192.168.1.100:3307/your_database |
| MySQL 8.x 推荐配置 | jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true |
| 防止乱码配置 | jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=UTF-8 |
URL 的核心是提供连接所需的基本信息,而参数则用于优化和配置连接行为,在实际开发中,请务必使用推荐的安全配置和最新的 JDBC 驱动。
