杰瑞科技汇

Java连接MySQL的URL格式怎么写?

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

Java连接MySQL的URL格式怎么写?-图1
(图片来源网络,侵删)
jdbc:mysql://[host][:port]/[database][?propertyName1=propertyValue1][&propertyName2=propertyValue2]

下面我们逐一解析这个格式的每个部分,并提供详细的说明和示例。


URL 结构详解

jdbc:mysql://

这是协议和子协议部分,是固定的。

  • jdbc::表示这是一个 JDBC URL。
  • mysql::表示要使用 MySQL 的 JDBC 驱动。

[host]

这是数据库服务器的地址。

  • 可以是 IP 地址168.1.100
  • 可以是 主机名localhostdb.example.com
  • 如果连接的是 本地数据库,通常使用 localhost

[:port]

这是数据库服务器监听的端口号。

Java连接MySQL的URL格式怎么写?-图2
(图片来源网络,侵删)
  • 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=falsesslMode=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 示例。

Java连接MySQL的URL格式怎么写?-图3
(图片来源网络,侵删)

示例 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)连接失败。

解决方案:

  1. 升级 JDBC 驱动:使用 mysql-connector-java-8.x.x 或更高版本的驱动,这是最佳实践。
  2. 在 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 数据库。

准备工作:

  1. 确保你已经安装了 MySQL 数据库,并创建了一个测试数据库和表。

  2. 下载 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 驱动。

分享:
扫描分享到社交APP
上一篇
下一篇