为什么要 Class.forName( driverClass );
以前做jdbc的连接的时候都提前一部使用 Class.forName( 来加载对应的数据库驱动包。
Class.forName("oracle.jdbc.driver.OracleDriver");
以下的代码是正确的jdbc连接,之后的实验都以此为对照。
package test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import javax.sql.DataSource; public class test { public static void main(String[] argv) { try { Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = null; Statement stmt = null; ResultSet rs = null; String url ="jdbc:oracle:thin:@10.185.15.183:1521:gxmc2"; String user="gxpm5"; String pwd="gxpm5"; try { con = DriverManager.getConnection(url,user,pwd); stmt = con.createStatement(); rs = stmt.executeQuery("select count(*) from bo_designone "); while (rs.next()) System.out.println(rs.getString(1)); } finally { // i try to be neurotic about ResourceManagement, // explicitly closing each resource // but if you are in the habit of only closing // parent resources (e.g. the Connection) and // letting them close their children, all // c3p0 DataSources will properly deal. attemptClose(rs); attemptClose(stmt); attemptClose(con); } } catch (Exception e) { e.printStackTrace(); } } static void attemptClose(ResultSet o) { try { if (o != null) o.close(); } catch (Exception e) { e.printStackTrace(); } } static void attemptClose(Statement o) { try { if (o != null) o.close(); } catch (Exception e) { e.printStackTrace(); } } static void attemptClose(Connection o) { try { if (o != null) o.close(); } catch (Exception e) { e.printStackTrace(); } } private void UsePoolBackedDataSource() { } }
如果不写Class.forName("oracle.jdbc.driver.OracleDriver");这段代码那后面执行sql是会报错的。
java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@10.185.15.183:1521:gxmc2 at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at test.test.main(test.java:25)
但是如果把这段代码替换成 oracle.jdbc.driver.OracleDriver od=new oracle.jdbc.driver.OracleDriver();也是可以正常运行的
我们现在来讨论
Class.forName("oracle.jdbc.driver.OracleDriver");与new oracle.jdbc.driver.OracleDriver();的区别
1 Class.forName("oracle.jdbc.driver.OracleDriver"); 通过 2 oracle.jdbc.driver.OracleDriver od; 报错 3 oracle.jdbc.driver.OracleDriver od=new oracle.jdbc.driver.OracleDriver();通过 4 new oracle.jdbc.driver.OracleDriver(); 通过 5 import oracle.jdbc.driver.OracleDriver; 不可以3和4其实对于此次实验是没有区别的
1和2还有5究竟有什么区别,他们又干了些什么事情。
Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段;
而new 一个对象之前是会把该类加载到jvm
而import只是把关联的class文件预先加载到内存中,形成一个与本地一样的副本。
oracle.jdbc.driver.OracleDriver od是只创建了一个引用,该地址将来会指向一个
OracleDriver
的对象。
是为了声明当前用的是哪个数据库驱动,以及将驱动注册到驱动管理器里面以sqlserver为例 你除了可以用Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance()来实现对数据库驱动的声明,你还可以用DriverManager.registerDriver(new com.microsoft.jdbc.sqlserver.SQLServerDriver());来实现同样的效果 你可以反编译SQLServerDriver.class来看一下,他在被实例化的时候会调用BaseDriver.registerDriver(new SQLServerDriver());方法,来将自己注册到驱动管理器 里面 然后你取得数据库连接的时候不是需要调用DriverManager.getConnection(url,username,password);方法么,只有注册了驱动,系统才知道你连接的是什么数据库,用哪个驱动程序.