我对JDBC非常陌生,所以我写了一个小程序来检查已注册的驱动程序。我想要做到以下几点:
在没有加载任何驱动程序的情况下检查注册的数量:
我本来以为它会什么都不显示,但惊讶地发现它显示了3个已注册的驱动程序。
使用Class.forName()加载一个驱动程序:
我本来期望它会再次显示四个驱动程序,但惊讶地发现它只显示了3个驱动程序。
最后,使用DriverManager注册驱动程序
现在它显示了四个驱动程序。
请问有谁可以帮助我理解这里发生了什么。我的问题如下:
- 这三个驱动程序是默认加载/注册的吗?
- 使用Class.forName加载类不会自动注册驱动程序吗?(从我的经验来看,我猜答案是否定的,但我想确认一下)如果不是,那么加载类只是寻找接口的实现,例如(DriverManager等)吗?
- 最后,加载驱动和注册驱动之间有什么区别?
我列出了程序和输出供您参考。
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import oracle.jdbc.driver.OracleDriver;
class Test3{
public static void main(String[] args) throws Exception{
//checking for registered drivers
System.out.println("Drivers registered initially");
Enumeration enumm = DriverManager.getDrivers();
int count=1;
while(enumm.hasMoreElements()){
Driver dr=(Driver)enumm.nextElement();
System.out.println(count+" "+dr);
count++;
}
//loading the driver
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("\n\nDrivers after class loading");
enumm = DriverManager.getDrivers();
count=1;
while(enumm.hasMoreElements()){
Driver dr=(Driver)enumm.nextElement();
System.out.println(count+" "+dr);
count++;
}
//After Registering driver
OracleDriver odr= new OracleDriver();
DriverManager.registerDriver(odr);
System.out.println("\nAfter registering oracle driver");
enumm = DriverManager.getDrivers();
count=1;
while(enumm.hasMoreElements()){
Driver dr=(Driver)enumm.nextElement();
System.out.println(count+" "+dr);
count++;
}
}
}
输出:
Drivers registered initially
1 sun.jdbc.odbc.JdbcOdbcDriver@2c84d9
2 oracle.jdbc.OracleDriver@8bdcd2
3 com.mysql.jdbc.Driver@1f31ad9
这些是数据库驱动程序的名称和版本号。在Java编程中使用这些驱动程序,可以帮助连接不同类型的数据库。Drivers after class loading
1 sun.jdbc.odbc.JdbcOdbcDriver@2c84d9
2 oracle.jdbc.OracleDriver@8bdcd2
3 com.mysql.jdbc.Driver@1f31ad9
这些是不同的数据库驱动程序。每个驱动程序都有一个唯一标识符,以便在连接到数据库时进行识别和使用。After registering oracle driver
1 sun.jdbc.odbc.JdbcOdbcDriver@2c84d9
2 oracle.jdbc.OracleDriver@8bdcd2
3 com.mysql.jdbc.Driver@1f31ad9
4 oracle.jdbc.driver.OracleDriver@167acf2
这是四个不同数据库所使用的驱动程序名称和ID。