不同數據庫的JDBC URL格式
1.概述
當我們使用Java處理數據庫時,通常我們使用JDBC連接到數據庫。
JDBC URL是在Java應用程序和數據庫之間建立連接的重要參數。但是,對於不同的數據庫系統,JDBC URL格式可以不同。
在本教程中,我們將仔細研究幾種廣泛使用的數據庫的JDBC URL格式: Oracle , MySQL , Microsoft SQL Server和PostgreSQL 。
2. Oracle的JDBC URL格式
Oracle數據庫系統廣泛用於企業Java應用程序中。在查看用於連接Oracle數據庫的JDBC URL格式之前,我們首先應確保Oracle Thin數據庫驅動程序在我們的類路徑中。
例如,如果我們的項目由Maven管理,則需要在pom.xml添加ojdbc14依賴項:
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
</dependency>
由於某些許可證問題,Maven Central存儲庫僅指向此工件的POM文件。因此,我們需要下載jar並將其手動安裝到我們的Maven存儲庫中。
Thin驅動程序提供了幾種JDBC URL格式:
- 連接到SID
- 連接到Oracle服務名稱
- 帶有
tnsnames.ora條目的URL
接下來,我們將介紹每種格式。
2.1。連接到Oracle數據庫SID
在某些舊版本的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。連接到Oracle數據庫服務名稱
通過服務名稱連接Oracle數據庫的JDBC URL格式與我們以前通過SID連接的格式非常相似:
jdbc:oracle:thin:[<user>/<password>]@//<host>[:<port>]/<service>
我們可以連接到Oracle數據庫服務器“ myoracle.db.server:1521 ”上的服務“ my_servicename ”:
@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數據庫
我們還可以在JDBC URL中包含tnsnames.ora條目以連接到Oracle數據庫:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<host>)(PORT=<port>))(CONNECT_DATA=(SERVICE_NAME=<service>)))
讓我們看看如何使用tnsnames.ora文件中的條目連接到“ my_servicename ”服務:
@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格式
在本節中,我們討論如何編寫JDBC URL以連接到MySQL數據庫。
要從Java應用程序連接到MySQL數據庫,首先讓我們在pom.xml添加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 ”上連接到MySQL數據庫“ 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());
}
}
上面示例中的JDBC URL看起來很簡單。它具有四個組成部分:
-
protocol–jdbc:mysql: -
host–mysql.db.server:3306 -
database–my_database -
properties–useSSL=false&serverTimezone=UTC
但是,有時,我們可能會遇到更複雜的情況,例如不同類型的連接或多個MySQL主機,等等。
接下來,我們將仔細研究每個構建基塊。
3.1。協議
除了普通的“ jdbc:mysql: ”協議, connector-java JDBC驅動程序仍然支持某些特殊連接的協議:
- 負載平衡JDBC連接–
jdbc:mysql:loadbalance: - JDBC複製連接–
jdbc:mysql:replication:
當我們談論負載平衡和JDBC複製時,我們可能會意識到應該有多個MySQL主機。
接下來,讓我們檢查連接URL另一部分的詳細信息hosts 。
3.2 多域名
在上一節中,我們已經看到了定義單個主機的JDBC URL示例,例如mysql.db.server:3306.
但是,如果需要處理多個主機,則可以用逗號分隔的列表列出主機: host1, host2,…,hostN 。
我們也可以用方括號括[host1, host2,…,hostN]用逗號分隔的主機列表: [host1, host2,…,hostN] 。
讓我們看幾個連接到多個MySQL服務器的JDBC URL示例:
-
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。屬性和用戶憑證
有效的全局屬性將應用於所有主機。屬性前面帶有問號“ ? ” ? ”,並寫成key=value對,並用“ & ”**符號**分隔:
jdbc:mysql://myhost1:3306/db_name?prop1=value1&prop2=value2
我們也可以將用戶憑據放在屬性列表中:
jdbc:mysql://myhost1:3306/db_name?user=root&password=mypass
同樣,我們可以為每個主機添加用戶憑據的前綴,格式為“ user:[email protected] ” :
jdbc:mysql://root:[email protected]:3306/db_name
此外,如果我們的JDBC URL包含主機列表,並且所有主機都使用相同的用戶憑據,則可以在主機列表前添加前綴:
jdbc:mysql://root:mypass[myhost1:3306,myhost2:3307]/db_name
畢竟,也可以在JDBC URL之外提供用戶憑證。
當我們調用方法以獲得連接時DriverManager.getConnection(String url, String user, String password)可以將用戶名和密碼傳遞給DriverManager.getConnection(String url, String user, String password)方法。
4. Microsoft SQL Server的JDBC URL格式
Microsoft SQL Server是另一種流行的數據庫系統。要從Java應用程序連接MS SQL Server數據庫,我們需要將mssql-jdbc依賴項添加到我們的pom.xml :
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>8.4.1.jre11</version>
</dependency>
接下來,讓我們看看如何構建JDBC URL以獲得與MS SQL Server的連接。
用於連接到MS SQL Server數據庫的JDBC URL的一般格式為:
jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]
讓我們仔細看看格式的每個部分。
-
serverName –我們將連接到的服務器的地址;這可能是指向服務器的域名或IP地址 -
instanceName –要在serverName上連接的實例;這是一個可選字段,如果未指定該字段,則將選擇默認實例 -
portNumber–這是要在serverName上連接的端口(默認端口為1433) -
properties–可以包含一個或多個可選的連接屬性,必須用分號分隔,並且不允許重複的屬性名稱
現在,假設我們有一個在主機“ mssql.db.server ”上運行的MS SQL Server數據庫,服務器上的instanceName是“ mssql_instance ”,而我們要連接的數據庫的名稱是“ my_database ”。
讓我們嘗試獲得與此數據庫的連接:
@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,應該在我們的pom.xml中將JDBC驅動程序postgresql添加為依賴項:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.18</version>
</dependency>
連接到PostgreSQL的JDBC URL的一般形式是:
jdbc:postgresql://host:port/database?properties
現在,讓我們研究以上JDBC URL格式的每個部分。
host參數是數據庫服務器的域名或IP地址。
如果要指定IPv6地址,則host參數必須用方括號括起來,例如jdbc:postgresql://[::1]:5740/my_database .mysql
port參數指定PostgreSQL正在監聽的端口號。 port參數是可選的,默認端口號是5432 。
顧名思義, database參數定義了我們要連接的數據庫的名稱。
properties參數可以包含由“ & ”符號分隔的一組key=value對。
了解了JDBC URL格式的參數後,讓我們看一下如何獲取與PostgreSQL數據庫的連接的示例:
@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());
}
}
在上面的示例中,我們使用以下命令連接到PostgreSQL數據庫:
-
host:port – postgresql.db.server:5430 -
database–my_database - 屬性–
ssl=true&loglevel=2
六,結論
本文討論了四種廣泛使用的數據庫系統的JDBC URL格式:Oracle,MySQL,Microsoft SQL Server和PostgreSQL。
我們還看到了構建JDBC URL字符串以獲得與這些數據庫的連接的不同示例。