复习JDBC

本文深入解析JDBC代码中的关键部分,包括Class.forName(driverName)的作用和DriverManager.getConnection()的功能,通过实例代码演示并解释其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先回顾一下最原始的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中( :cry: 对于为什么要拷贝一份一直没搞懂)。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值