先回顾一下最原始的JDBC代码
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
String driverName = "oracle.jdbc.driver.OracleDriver";
String userName = "xiaoqingp";
String password = "test";
Class.forName(driverName);
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:XE", userName, password);
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery("select name from p_user");
while (rs.next()) {
System.out.println(rs.getString("name"));
}
stm.close();
conn.close();
}
这里先提两个问题:
1、Class.forName(driverName) 为什么要这样写
2、DriverManager.getConnection()做了哪些事情。
首先 Class.forName JDK文档的解释是:返回与带有给定字符串名的类或接口相关联的 Class 对象。顾名思义就是java虚拟机去加载这个类的字节码文件了,并生成了一个java.lang.Class对象。
目前对培训java时讲解加载class还有点印象:当程序中第一次遇到一个class时,jvm会把这个类加载到内存中,代码放到代码段中,字段放到堆栈中。实际的效果就是会初始化static字段,运行static代码块。
下面是一个测试例子:
package org.xiaoqingp.test.dao;
public class TestStatic {
private static int count;
static {
count = 100;
System.out.println("执行了static块=" + count);
}
public int getCount() {
return count;
}
}
public class TestClassForName {
public static void main(String[] args) throws ClassNotFoundException {
Class.forName("org.xiaoqingp.test.dao.TestStatic");
}
}
实际运行的结果是:
执行了static块=100
接着我们看oracle.jdbc.driver.OracleDriver的源码。
可以发现里面有这样的static代码块:
Timestamp timestamp = Timestamp.valueOf("2000-01-01 00:00:00.0");
try {
if (m_defaultDriver == null) {
m_defaultDriver = new OracleDriver();
DriverManager.registerDriver(m_defaultDriver);
}
} catch (RuntimeException _ex) {
} catch (SQLException _ex) {
}
DriverManager 很眼熟啊,第二个问题就是关于这个的。
看一下这个DriverManager的源码,了解这个registerDriver就是把Driver对象放到名为writeDrivers 的Vector对象中,并深拷贝到readDrivers中(
对于为什么要拷贝一份一直没搞懂)。
Class.forName(driverName)和DriverManager.registerDriver(Driver)本质是一样的
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
String driverName = "oracle.jdbc.driver.OracleDriver";
String userName = "xiaoqingp";
String password = "test";
//Class.forName(driverName);
DriverManager.registerDriver(new OracleDriver());
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:XE", userName, password);
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery("select name from p_user");
while (rs.next()) {
System.out.println(rs.getString("name"));
}
stm.close();
conn.close();
}
这个代码也是能运行的,效果是一样的。
接着在回答第二个问题:
看一下下面这个循环就明白了:
for (int i = 0; i < drivers.size(); i++) {
DriverInfo di = (DriverInfo) drivers.elementAt(i);
// If the caller does not have permission to load the driver then
// skip it.
if (getCallerClass(callerCL, di.driverClassName) != di.driverClass) {
println(" skipping: " + di);
continue;
}
try {
println(" trying " + di);
Connection result = di.driver.connect(url, info);
if (result != null) {
// Success!
println("getConnection returning " + di);
return (result);
}
} catch (SQLException ex) {
if (reason == null) {
reason = ex;
}
}
}
循环所有知道的driver,用driver获取连接。
这代码并没有想象的那么高级。
对classloader 和 jvm 不懂,记录是为了复习java基础。
这里感谢网上的各位牛人,
下面是我学习时参考的博客地址:
http://www.ticmy.com/?p=249
分享到:
相关推荐
JDBC动力节点老杜的精华,用于复习回顾
里面有java复习题,jdbc的相关知识,DAO模式,和oracle的复习题目。
JDBC复习导图,自制复习资料
2022年自考互联网数据库知识点复习:JDBC.docx
jdbc学习用笔记和代码例子jdbc学习用笔记和代码例子jdbc学习用笔记和代码例子
当今 orm 等全自动针对对象持久化的框架越来越...分清楚,所以就啰理啰嗦的整理出一份学习笔记,第一作为自己对 jdbc 重新的复习, 第二如果有可能希望给初学 jdbc 的朋友带来一定的便利,这样也不枉我点点滴滴的记 录
一、 巩固Java语言,复习Java图形化用户界面的开发过程和主要技术 二、 学习数据库编程,了解Java数据库编程机制 三、 能够利用JDBC开发实用的数据库应用程序
大数据学习之第二阶段Hadoop(第二篇)--JDBC思维导图+复习知识点总结
JSP复习笔记——第10章 连接数据库 之 JDBC相关 - 堕落天使 - JavaEye技术网站.mhtJSP复习笔记——第10章 连接数据库 之 JDBC相关 - 堕落天使 - JavaEye技术网站.mht
当今orm等全自动针对对象持久化的框架越来越多并且也越来越...所以就啰理啰嗦的整理出一份学习笔记,第一作为自己对jdbc重新的复习,第二如果有可能希望给初学jdbc的朋友带来一定的便利,这样也不枉我点点滴滴的记录。
请选出微软公司提供的连接SQL Server 2000的JDBC驱动程序()。 A. oracle.jdbc.driver.OracleDriver B. sun.jdbc.odbc.JdbcOdbcDriver C. com.microsoft.jdbc.sqlserver.SQLServerDriver D. ...
Jdbc技术的基础详细学习笔记,总结了Jdbc技术的各个知识点,可以用来复习以及对基础知识的巩固,对新人的学习很有帮助。
-仅用于个人代码记录学习和复习。
jdbc大总结,jdbc疑问解答,最佳复习资料
传智播客JDBC技术全面课程学习复习笔记,很经典,提供多种连接和优化数据库的技术!值得学习!
包括有corejava,jdbc,hibernate,ejb,c++,servlet,spring,struts,jsp等的学习笔记,个人以前复习时经常看的,非常棒!!下了后请给个留言!!谢谢!!
关于java对面对象的自己总复习 关于1继承。封装 多态、异常、接口 JDBC有关总结
Java通过JDBC链接SQLServer2012.pdf 学习资料 复习资料 教学资源
《软件平台与中间技术》——复习资料,可适用于课程学习资料、期末复习资料、自主学习资料等等,复习资料共108页,内容丰富,干货十足! 主要内容包括: 一、中间件技术概述 二、Application Server and Java EE 三...
写在开头:本文是学习Java后端开发的个人笔记,便于自己复习。如果只是想快速学会使用jdbc的朋友可以直接跳转至JDBC(三)的二三四部分。文章内容引用了尚硅谷的jdbc教学,有兴趣的朋友可以上B站搜索学习。 JDBC(一) ...