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




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值