1. 概述
在 Java 中操作数据库时,我们通常会通过 JDBC 来建立与数据库的连接。
JDBC URL 是连接 Java 应用程序和数据库的关键参数。然而,不同的数据库系统,其 JDBC URL 的格式也不尽相同。
本文将深入探讨几种主流数据库的 JDBC URL 格式,包括 Oracle、MySQL、Microsoft SQL Server 和 PostgreSQL。
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 格式:
- 通过 SID 连接
- 通过 Service Name 连接
- 使用 tnsnames.ora 配置项连接
接下来我们逐一介绍。
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 的组成部分如下:
- protocol –
jdbc:mysql:
- host –
mysql.db.server:3306
- database –
my_database
- properties –
useSSL=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:port –
postgresql.db.server:5430
- database –
my_database
- properties –
ssl=true&loglevel=2
6. 总结
本文详细介绍了 Oracle、MySQL、Microsoft SQL Server 和 PostgreSQL 四种主流数据库的 JDBC URL 格式,并提供了相应的连接示例。
掌握这些格式有助于在实际开发中快速配置数据库连接。
完整源码可参考 GitHub 项目。