当您在应用程序服务器之外使用 JDBC 时,DriverManager
类管理连接的建立。
指定 DriverManager
要尝试使用哪些 JDBC 驱动程序来建立连接。最简单的方法是使用 Class.forName()
在实现 java.sql.Driver
接口的类上调用。对于 MySQL Connector/J,此类的名称是 com.mysql.cj.jdbc.Driver
。使用这种方法,您可以使用外部配置文件来提供驱动程序类名和在连接到数据库时要使用的驱动程序参数。
以下 Java 代码片段展示了如何在应用程序的 main()
方法中注册 MySQL Connector/J。如果测试此代码,请先阅读 第 4 章,Connector/J 安装 中的安装部分,以确保您已正确安装连接器并设置了 CLASSPATH
。另外,请确保 MySQL 已配置为接受外部 TCP/IP 连接。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
// Notice, do not import com.mysql.cj.jdbc.*
// or you will have problems!
public class LoadDriver {
public static void main(String[] args) {
try {
// The newInstance() call is a work around for some
// broken Java implementations
Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
} catch (Exception ex) {
// handle the error
}
}
}
在驱动程序向 DriverManager
注册后,您可以通过调用 DriverManager.getConnection()
获得连接到特定数据库的 Connection
实例。
示例 7.1 Connector/J:从 DriverManager
获取连接
如果您尚未这样做,请在处理以下示例之前查看上面的 第 7.1 节,“使用 JDBC DriverManager
接口连接到 MySQL” 部分。
此示例展示了如何从 DriverManager
获取 Connection
实例。getConnection()
方法有几个不同的签名。请查阅 JDK 附带的 API 文档,以获取有关如何使用它们的更具体信息。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
Connection conn = null;
...
try {
conn =
DriverManager.getConnection("jdbc:mysql://127.0.0.1/test?" +
"user=minty&password=greatsqldb");
// Do something with the Connection
...
} catch (SQLException ex) {
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
一旦建立了 Connection
,就可以使用它来创建 Statement
和 PreparedStatement
对象,以及检索有关数据库的元数据。这将在后面的部分中进行解释。
当连接的用户未指定时,Connector/J 的身份验证插件实现默认使用运行应用程序的操作系统用户的名称来与 MySQL 服务器进行身份验证(除非使用 Kerberos 身份验证插件;有关详细信息,请参见 第 6.12.2 节,“使用 Kerberos 连接”)。
只有在满足以下所有条件时,用户名才被认为未指定
没有使用
DriverManager.getConnection(String url, String user, String password)
方法。例如,在连接 URL 或其他地方,没有使用连接属性
user
。连接 URL 的权限中没有提及用户,例如
jdbc:mysql://127.0.0.1:3306/test
或jdbc:mysql://@localhost:3306/test
。
请注意,如果 (1) 或 (2) 不成立,并且传递了一个空字符串,那么用户名就是一个空字符串,并不被认为是未指定的。