如果我想连接到数据库,我应该编写如下代码:
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/mysidorservicename", "sysdba", "password123");
Run Code Online (Sandbox Code Playgroud)
为什么要在连接数据库之前加载具体驱动程序?该Class.forName语句的结果被忽略 - 加载的类显然与DriverManager. 我可以在启动应用程序时加载用于不同数据库的所有驱动程序,并且不会Class.forName在每次连接之前编写代码吗?
较旧的DriverManager实现(在 JDBC 4.0 之前,它是 JDK 6 的一部分),要求驱动程序有一个静态块来将它们注册到DriverManager. 当驱动程序管理器加载该类时,静态块将被调用一次。对于您的问题 - 只要您在尝试使用驱动程序之前加载驱动程序,在哪里加载这些类并不重要。
不过,从 JDBC 4.0(如上所述,它是 JDK 6 的一部分)开始,您根本不必调用Class.forName。引用 的DriverManagerjavadoc:
这些
DriverManager方法getConnection已getDrivers得到增强,可以支持 Java 标准版服务提供者机制。JDBC 4.0 驱动程序必须包含文件 META-INF/services/java.sql.Driver。该文件包含 java.sql.Driver 的 JDBC 驱动程序实现的名称。例如,要加载 my.sql.Driver 类,META-INF/services/java.sql.Driver 文件将包含条目 [etc..]
用外行的话来说,驱动程序需要注册自己来声明它为给定的连接字符串提供 JDBC 服务,并且您只需Class.forName从代码中删除这些调用即可。