`

复习JDBC

 
阅读更多
先回顾一下最原始的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
分享到:
评论

相关推荐

    java复习题,jdbc,DAO模式,oracle复习题

    在复习JDBC时,会涉及到连接池的使用,事务管理,以及预编译SQL语句以提高性能。 DAO模式是软件设计中的一个重要概念。它通过将数据访问逻辑封装到专门的对象中,使得业务逻辑代码与数据存储细节分离。在实际应用中...

    2013-05-27-jdbc.rar

    标题中的“2013-05-27-jdbc.rar”表明这是一个关于JDBC(Java Database Connectivity)技术的压缩文件,可能包含了2013年5月27日某个项目或教学材料...对于初学者或想复习JDBC的人来说,这些代码将提供宝贵的参考资料。

    JDBC动力节点老杜的精华,用于复习回顾

    JDBC动力节点老杜的精华,用于复习回顾

    simplejdbc_demo

    "simplejdbc_demo"是一个关于Java JDBC(Java Database Connectivity)的基础示例项目,它可能是...如果你想要学习或复习JDBC,这个"simplejdbc_demo"项目会是一个很好的起点,因为它提供了从基础到实践的完整示例。

    JDBC复习导图,自制复习资料

    JDBC复习导图,自制复习资料

    jdbc 学习 笔记 代码例子1

    jdbc学习用笔记和代码例子jdbc学习用笔记和代码例子jdbc学习用笔记和代码例子

    2022年自考互联网数据库知识点复习:JDBC.docx

    JDBC(Java Database Connectivity)是Java编程语言中用于访问数据库的一套标准API,它为Java程序员提供了一种与各种数据库交互的能力,无论数据库管理系统是何种类型。JDBC的核心理念在于提供一种统一的接口,使得...

    Java JDBC由浅入深.pdf

    当今 orm 等全自动针对对象持久化的框架越来越...分清楚,所以就啰理啰嗦的整理出一份学习笔记,第一作为自己对 jdbc 重新的复习, 第二如果有可能希望给初学 jdbc 的朋友带来一定的便利,这样也不枉我点点滴滴的记 录

    广州巨匠培训][Hibernate培训课件

    在学习Hibernate之前,复习JDBC是必要的。JDBC提供了连接数据库、执行SQL语句、处理结果集等功能。主要接口包括: - `Connection`: 提供了数据库信息,如表、SQL语法等。 - `Driver`: 数据库驱动实现的接口。 - `...

    JDBC实验手册.doc

    本实验手册旨在帮助学生巩固 Java 语言,复习 Java 图形化用户界面的开发过程和主要技术,学习数据库编程,了解 Java 数据库编程机制,能够利用 JDBC 开发实用的数据库应用程序。 知识点一:JDBC 概念 JDBC(Java ...

    JDBC DAO模式 (复习)

    DAO JDBC 模式

    达内学习用的jdbc与struts笔记.pdf

    1. Struts复习 - 第一天:可能涵盖了Struts的基本概念,如MVC模式、Struts架构、配置文件(struts-config.xml)等。 - 第二天:可能深入讲解了Action类、Form Beans、ActionMapping和ActionForward等关键概念。 -...

    JSP之JDBC数据库开发

    在【实验目的】中,学习者需要复习数据库操作的基础知识,并通过JDBC实践数据库的增删改查(CRUD)操作。同时,掌握JSP和JavaBean模式的联合使用,这是Java Web开发中常见的设计模式,其中JavaBean作为业务逻辑组件...

    传智播客 李勇老师 JDBC代码全部和ppt

    同时,"所有源码与ppt"的提供,意味着学习者不仅可以观看视频,还能直接查看和实践配套的代码,加深对理论知识的理解,同时通过PPT可以系统地复习和整理课程内容。 【标签】"传智播客 李勇 JDBC代码 ppt"进一步明确...

    javaJDBC.rar_jdbc

    综合以上内容,这个压缩包中的资源应该可以帮助初学者了解并实践Java通过JDBC进行数据库操作的基本步骤和技巧,同时对于有经验的开发者来说,也是复习和查找示例的好资料。通过阅读和理解这些示例代码,可以加深对...

    java代码笔记 2010-06-21:一,GUI,操作,完成一个类似于QQ登录界面的小窗口。二,就是JDBC 的小运用:输入姓名和密码,进入数据库进行判断.

    这篇Java代码笔记主要涵盖了两个核心知识点:一是使用Java GUI(图形用户界面)构建一个类似QQ登录界面的小窗口,二是利用JDBC(Java Database Connectivity)进行数据库的交互。 首先,我们来详细探讨Java GUI的...

    2.2-JDBC思维导图 .emmx

    大数据学习之第二阶段Hadoop(第二篇)--JDBC思维导图+复习知识点总结

    JSP复习笔记——第10章 连接数据库 之 JDBC相关 - 堕落天使 - JavaEye技术网站.mht

    JSP复习笔记——第10章 连接数据库 之 JDBC相关 - 堕落天使 - JavaEye技术网站.mhtJSP复习笔记——第10章 连接数据库 之 JDBC相关 - 堕落天使 - JavaEye技术网站.mht

    Login-Register-design-and-insert-control-login-via-database-javadb-jdbc

    标题中的"Login-Register-design-and-insert-control-login-via-database-javadb-jdbc"表明了这是一个关于使用Java数据库连接(JDBC)实现登录注册功能...对于更高级的开发者,它可以作为复习JDBC和GUI编程的一个起点。

    java语言程序设计 进阶版 第十版 复习题答案

    10. **JDBC数据库连接**:Java Database Connectivity (JDBC) API用于连接和操作数据库。复习题可能涵盖数据库连接、执行SQL查询、处理结果集,以及事务管理。 通过这些复习题,学习者不仅可以加深对Java语言核心...

Global site tag (gtag.js) - Google Analytics