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字符串以获得与这些数据库的连接的不同示例。
0 评论