连接数据库前都要调用一下class.forname("driverName");然后使用DriverMnager获取连接,这是为什么呢?

首先jdbc标准要求,每个驱动必须向DriverManager注册一下,这样才能让其知道使用的什么驱动,因为jdbc统一了操作关系数据库的接口,程序员统一使用jdk中的接口调用相关方法实现功能,其中的多态调用就不详述了。为了能顺利连接并操作数据库,驱动必须向DriverManager注册才OK。

所以,Class.forName方法会加载该类,而加载类的时候,以oracle为例,oracle的oracle.jdbc.driver.OracleDriver类有个静态块:

 static
/* */ {
/* */ Timestamp localTimestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");
/* */ try
/* */ {
/* */ if (defaultDriver == null)
/* */ {
/* */ defaultDriver = new OracleDriver();
/* */
/* */ DriverManager.registerDriver(defaultDriver);
/* */ }
/* */
/* */ }
/* */ catch (RuntimeException localRuntimeException)
/* */ {
/* */ }
/* */ catch (SQLException localSQLException)
/* */ {
/* */ }
/* */
/* */ _Copyright_2004_Oracle_All_Rights_Reserved_ = null;
/* */ }
/* */ }

其中该行“DriverManager.registerDriver(defaultDriver);”就是注册,查看注册的代码:

 public static synchronized void registerDriver(java.sql.Driver driver)
throws SQLException {
if (!initialized) {
initialize();
} DriverInfo di = new DriverInfo(); di.driver = driver;
di.driverClass = driver.getClass();
di.driverClassName = di.driverClass.getName(); // Not Required -- drivers.addElement(di); writeDrivers.addElement(di);
println("registerDriver: " + di); /* update the read copy of drivers vector */
readDrivers = (java.util.Vector) writeDrivers.clone(); }

会先设置好驱动的class类型,class名称,Driver对象类型等等,以备后续获取连接等等使用。

可见,不一定非得class.forName,直接这样也可以:

defaultDriver = new OracleDriver();
DriverManager.registerDriver(defaultDriver);

只是通过class.forName可以直接加载并注册驱动程序。

看看spring的DriverManagerDataSource中,也是这么做的:

    public void setDriverClassName(String driverClassName) throws CannotGetJdbcConnectionException {
if (!StringUtils.hasText(driverClassName)) {
throw new IllegalArgumentException("driverClassName must not be empty");
}
this.driverClassName = driverClassName.trim();
try {
Class.forName(this.driverClassName, true, ClassUtils.getDefaultClassLoader());
}
catch (ClassNotFoundException ex) {
throw new CannotGetJdbcConnectionException(
"Could not load JDBC driver class [" + this.driverClassName + "]", ex);
}
if (logger.isInfoEnabled()) {
logger.info("Loaded JDBC driver: " + this.driverClassName);
}
}

最新文章

  1. What is Away3D
  2. Could not instantiate bean class [java.util.List]: Specified class is an interface] with root cause
  3. Android 项目框架
  4. js 数组 var arr=[] 的用法总结
  5. python模块中的特殊变量
  6. uva 10051 Tower of Cubes(DAG最长路)
  7. 【转】Shell编程
  8. idea找不到package下的mapper.xml文件
  9. Openssh版本升级修复漏洞
  10. 服务消费和负载(Feign)
  11. git 配置提交过滤文件
  12. 转:ECharts图表组件入门教程之Theme:ECharts图表的皮肤是什么?如何给图表换主题(皮肤)Theme?
  13. Haskell语言学习笔记(49)ByteString Text
  14. 【Codechef】Random Number Generator(多项式除法)
  15. &和&&的一点区别
  16. JIRA licence crack and etc
  17. nginx grpc 试用
  18. JavaScript:验证输入
  19. php使用memcached详解
  20. D. Minimum Diameter Tree 思维+猜结论

热门文章

  1. android夜间模式切换
  2. fiddler一些高级用法
  3. servlet中地址详细分析
  4. Android 7.0 Gallery图库源码分析1 - 初识Gallery源码
  5. Django配置MariaDB数据库
  6. python之类的组合
  7. 【NOI2001】食物链
  8. BZOJ 2820 luogu 2257 yy的gcd (莫比乌斯反演)
  9. [剑指offer] 7. 斐波那契数列 (递归 时间复杂度)
  10. W10子系统UBantu命令安装Redis及其启动