日期:2014-05-20  浏览次数:20664 次

关于jdbc连接Oracle
Java code
XXXClass.class.getClassLoader().loadClass("oracle.jdbc.driver.OracleDriver");


上面为什么不能成功注册oracle驱动,注册oracle驱动只能用下面的方法吗?
Java code
DriverManager.registerDriver(new OracleDriver());


在注册mysql的驱动的时候,可以用
Java code
XXXClass.class.getClassLoader().loadClass("oracle.jdbc.driver.OracleDriver");



有没有其他的更好的注册oracle驱动的方法?

------解决方案--------------------
ORACLE的一般都是这样吧:Class.forName("oracle.jdbc.driver.OracleDriver"),自动的向DriverManager注册了,不再需要显式的调用DriverManager.registerDriver()方法了,直接就可以利用Connection conn = DriverManager.getConnection(****)连接到数据库了
------解决方案--------------------
首先要根据你的ORACLE 版本加相应的驱动包,然后
Java code

 Class.forName("oracle.jdbc.driver.OracleDriver");
 Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@数据库服务器名:1521:数据库实例名", "用户名", "密码");
  Statement stm=conn.createStatement();

------解决方案--------------------
看看的方法的返回类型不久明白了吗?

------解决方案--------------------
Class.forName("..");
返回值是:Class<?>
表示一个没有具体指定类型的类
------解决方案--------------------
Class.forName 和 ClassLoader.loadClass 两个方法都是用来动态加载类的
区别:
1.Class.forName方法,除非你显式的制定class loader,都是使用当前代码所在类的class loader来加载的。而XXXClass.class.getClassLoader().loadClass,就是指定要用XXXClass的class loader来加载,可能与当前代码所在类的class loader不同

2.直接导致你加载oracle驱动失败的原因是,Class.forName方法会自动初始化类,也就是说会执行类的静态初始化块 static{},但是ClassLoader.loadClass默认不会这么做。而oracle的JDBC驱动的加载就是在该类的静态初始化块里完成的(执行了DriverManager.registerDriver()),因此你用ClassLoader.loadClass会失败
------解决方案--------------------
7楼说得对