1. 概述

在 Java 中操作数据库时,我们通常会通过 JDBC 来建立与数据库的连接。

JDBC URL 是连接 Java 应用程序和数据库的关键参数。然而,不同的数据库系统,其 JDBC URL 的格式也不尽相同。

本文将深入探讨几种主流数据库的 JDBC URL 格式,包括 OracleMySQLMicrosoft SQL ServerPostgreSQL

2. Oracle 数据库的 JDBC URL 格式

在企业级 Java 应用中,Oracle 数据库使用广泛。在连接 Oracle 数据库之前,首先要确保项目中引入了 Oracle Thin 驱动。

以 Maven 项目为例,我们需要在 pom.xml 中添加 ojdbc8 依赖

<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>21.1.0.0</version>
</dependency>

Oracle Thin 驱动支持多种 JDBC URL 格式:

接下来我们逐一介绍。

2.1. 通过 SID 连接 Oracle 数据库

在一些旧版本的 Oracle 数据库中,数据库以 SID 的形式存在。通过 SID 连接的 JDBC URL 格式如下:

jdbc:oracle:thin:[<user>/<password>]@<host>[:<port>]:<SID>

例如,假设 Oracle 数据库服务器地址为 myoracle.db.server:1521,SID 为 my_sid,可以按照以下方式构建连接 URL:

@Test
public void givenOracleSID_thenCreateConnectionObject() {
    String oracleJdbcUrl = "jdbc:oracle:thin:@myoracle.db.server:1521:my_sid";
    String username = "dbUser";
    String password = "1234567";
    try (Connection conn = DriverManager.getConnection(oracleJdbcUrl, username, password)) {
        assertNotNull(conn);
    } catch (SQLException e) {
        System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
    }
}

2.2. 通过 Service Name 连接 Oracle 数据库

通过 Service Name 连接的格式与 SID 类似,但稍有不同:

jdbc:oracle:thin:[<user>/<password>]@//<host>[:<port>]/<service>

连接示例:

@Test
public void givenOracleServiceName_thenCreateConnectionObject() {
    String oracleJdbcUrl = "jdbc:oracle:thin:@//myoracle.db.server:1521/my_servicename";
    ...
    try (Connection conn = DriverManager.getConnection(oracleJdbcUrl, username, password)) {
        assertNotNull(conn);
        ...
    }
    ...
}

2.3. 使用 tnsnames.ora 配置连接 Oracle 数据库

也可以使用 tnsnames.ora 文件中的配置项来连接数据库:

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<host>)(PORT=<port>))(CONNECT_DATA=(SERVICE_NAME=<service>)))

连接示例:

@Test
public void givenOracleTnsnames_thenCreateConnectionObject() {
    String oracleJdbcUrl = "jdbc:oracle:thin:@" +
      "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" +
      "(HOST=myoracle.db.server)(PORT=1521))" +
      "(CONNECT_DATA=(SERVICE_NAME=my_servicename)))";
    ...
    try (Connection conn = DriverManager.getConnection(oracleJdbcUrl, username, password)) {
        assertNotNull(conn);
        ...
    }
    ...
}

3. MySQL 数据库的 JDBC URL 格式

连接 MySQL 数据库前,需要先添加 JDBC 驱动 mysql-connector-java 依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.22</version>
</dependency>

MySQL JDBC URL 的通用格式如下:

protocol//[hosts][/database][?properties]

示例:连接到 mysql.db.server 上的数据库 my_database

@Test
public void givenMysqlDb_thenCreateConnectionObject() {
    String jdbcUrl = "jdbc:mysql://mysql.db.server:3306/my_database?useSSL=false&serverTimezone=UTC";    
    String username = "dbUser";
    String password = "1234567";
    try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) {
        assertNotNull(conn);
    } catch (SQLException e) {
        System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
    }
}

URL 的组成部分如下:

  • protocoljdbc:mysql:
  • hostmysql.db.server:3306
  • databasemy_database
  • propertiesuseSSL=false&serverTimezone=UTC

3.1. 协议(Protocol)

除了普通的 jdbc:mysql: 协议,MySQL 还支持以下特殊协议:

3.2. 主机(Hosts)

可以指定多个主机,用逗号分隔:

jdbc:mysql://myhost1:3306,myhost2:3307/db_name

也可以使用方括号包裹:

jdbc:mysql://[myhost1:3306,myhost2:3307]/db_name

负载均衡示例:

jdbc:mysql:loadbalance://myhost1:3306,myhost2:3307/db_name?user=dbUser&password=1234567&loadBalanceConnectionGroup=group_name&ha.enableJMX=true

3.3. 属性与用户凭证(Properties and Credentials)

属性以 ? 开头,多个属性用 & 分隔:

jdbc:mysql://myhost1:3306/db_name?prop1=value1&prop2=value2

用户凭证可以放在 URL 中:

jdbc:mysql://myhost1:3306/db_name?user=root&password=mypass

也可以写在主机前:

jdbc:mysql://root:mypass@myhost1:3306/db_name

多个主机使用相同凭证时:

jdbc:mysql://root:mypass[myhost1:3306,myhost2:3307]/db_name

当然,也可以在调用 DriverManager.getConnection() 时传入用户名和密码。

4. Microsoft SQL Server 的 JDBC URL 格式

连接 SQL Server 数据库需要引入 mssql-jdbc 依赖

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>8.4.1.jre11</version>
</dependency>

JDBC URL 格式如下:

jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]

各部分说明:

  • serverName – 服务器地址(域名或 IP)
  • instanceName – 实例名(可选)
  • portNumber – 端口号(默认 1433)
  • properties – 连接属性(以分号分隔)

示例:

@Test
public void givenMssqlDb_thenCreateConnectionObject() {
    String jdbcUrl = "jdbc:sqlserver://mssql.db.server\\mssql_instance;databaseName=my_database";
    String username = "dbUser";
    String password = "1234567";
    try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) {
        assertNotNull(conn);
    } catch (SQLException e) {
        System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
    }
}

5. PostgreSQL 的 JDBC URL 格式

PostgreSQL 是一个开源数据库,连接时需要引入 postgresql 依赖

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.18</version>
</dependency>

JDBC URL 格式如下:

jdbc:postgresql://host:port/database?properties

各部分说明:

  • host – 数据库服务器地址(IPv6 需用方括号包裹)
  • port – 端口号(默认 5432)
  • database – 数据库名
  • properties – 属性(以 & 分隔)

示例:

@Test
public void givenPostgreSqlDb_thenCreateConnectionObject() {
    String jdbcUrl = "jdbc:postgresql://postgresql.db.server:5430/my_database?ssl=true&loglevel=2";
    String username = "dbUser";
    String password = "1234567";
    try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) {
        assertNotNull(conn);
    } catch (SQLException e) {
        System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
    }
}

URL 中包含:

  • host:portpostgresql.db.server:5430
  • databasemy_database
  • propertiesssl=true&loglevel=2

6. 总结

本文详细介绍了 Oracle、MySQL、Microsoft SQL Server 和 PostgreSQL 四种主流数据库的 JDBC URL 格式,并提供了相应的连接示例。

掌握这些格式有助于在实际开发中快速配置数据库连接。

完整源码可参考 GitHub 项目


原始标题:Jdbc URL Format for Different Databases