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 评论