如果我想连接数据库,我应该编写如下代码:
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/mysidorservicename", "sysdba", "password123");
在连接数据库之前,为什么要加载具体的驱动程序?忽略Class.forName
语句的结果 - 加载的类显然与DriverManager
无关。我可以在启动应用程序时加载用于不同数据库的所有驱动程序,并且在每次连接之前不会写入Class.forName
代码吗?
答案 0 :(得分:3)
较早的DriverManager
实现(在JDBC 4.0之前,它是JDK 6的驻留),要求驱动程序有一个静态块,将它们注册到DriverManager
。当驱动程序管理器加载类时,会调用静态块一次。对于您的问题 - 只要在尝试使用它们之前加载驱动程序,加载这些类的位置并不重要。
自JDBC 4.0(如上所述,JDK 6的一部分)以来,您根本不必调用Class.forName
。引用DriverManager
's javadoc:
DriverManager
方法getConnection
和getDrivers
已得到增强,可支持Java Standard Edition Service Provider机制。 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
调用。