以前做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);方法么,只有注册了驱动,系统才知道你连接的是什么数据库,用哪个驱动程序.