JAVA之模拟JDBC工作原理

本文详细解析了JDBC的连接机制,包括Sun公司提供的Connection接口和DriverManager类,以及各数据库厂商如何实现这些接口和编写驱动。通过App类的实例演示了如何利用Class.forName()动态加载驱动,并获取数据库连接。

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

下图为整个项目的结构构图
在这里插入图片描述

一、Connection接口

sun公司提供Connection接口,代码如下

package bridge;
/** 
 * Sun提供 
 */
public interface Connection 
{
	public void f1(); 

}

二、各厂商实现Connection接口

package bridge;

public class ConnectionOracle implements Connection
{
	public void f1()
	{
		System.out.println("Oracle Connec6tion");
	}
}

三、Sun公司提供DriverManager类

package bridge;

public class DriverManager 
{
	private static Connection conn=null;
	public static Connection getConnection()
	{
		return conn;
	}
	public static void setConnection(Connection con)
	{
		 conn=con;
	}
}

四、各厂商编写驱动

package bridge;

public class OracleDriver 
{

	static
	{
		DriverManager.setConnection(new ConnectionOracle());
	}
	
}

五、程序调用

package bridge;

public class App {

	public static void main(String[] args) throws ClassNotFoundException 
	{
		//Class.forName(xxx.xx.xx)作用是要求JVM查找并加载指定的类
		//即,调用厂商编写的驱动OracleDriver(详见四)
		//OracleDrivaer里的static块以及static变量会自动
		Class.forName("bridge.OracleDriver");
		Connection conn=DriverManager.getConnection();
		conn.f1();

	}

}

Class.forName()用法详解
Class.forName(xxx.xx.xx)返回的是一个类。
Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段。
Class.forName( )静态方法的目的是为了动态加载类。
Class.forName("")返回的是类
Class.forName("").newInstance()返回的是object


通常编码过程中,在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。 因此,单使用Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。

相关英文参考文献如下:
we just want to load the driver to jvm only, but not need to user the instance of driver,
so call Class.forName(xxx.xx.xx) is enough, if you call Class.forName(xxx.xx.xx).newInstance(),
the result will same as calling Class.forName(xxx.xx.xx),
because Class.forName(xxx.xx.xx).newInstance() will load driver first,
and then create instance, but the instacne you will never use in usual,
so you need not to create it.


为什么没有调用Class下的newInstance( )静态方法来实例化对象以便操作?
Class.forName(xxx.xx.xx)的一个作用会执行该类的静态代码段(详见四)
既然在静态初始化器的中已经进行了注册,所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了。


new 和Class.forName()有什么区别?

  • A a = (A)Class.forName(“pacage.A”).newInstance();
    这和 A a = new A(); 是一样的效果。
  • newInstance( )是一个方法,而new是一个关键字;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值