JDBC连接中的Class.forName()解惑

本文解释了在Java中使用Class.forName加载JDBC驱动的过程及原理,揭示了为何仅加载类而不需实例化即可建立数据库连接。

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

      有过JDBC连接经验的朋友都知道,连接时首先需要加载数据库驱动,一般都是用Class.forName("xxx.xxx.xxx")来加载的。Class描述的是类信息,forName()是Class的静态方法,用来将字符串指定的类动态加载进来,它返回的是一个Class对象,查看API知道其方法为  

    Class forName(String className);

    className是完整的类名,如mysql的驱动名"com.mysql.jdbc.Driver"。很奇怪的是,驱动加载进来之后,我们并没有对它进行操作实例化出一个对象,因为一般类加载进来之后,都需要调用Class类的newInstance()静态方法来创建一个对象,以便进行各种操作。因此,单单使用Class.forName()动态加载类是没有用的,往往都需要实例化出一个对像来。

    Class.forName("")返回的是Class

    Class.forName("").newInstance()返回的是object

    为什么我们在加载驱动包的时候,往往只需要Class.forName("")就已经足够了,而不需要再newInstance()一下呢?很多人觉得很奇怪,这样加载之后,又没有实例化出一个对象,我们怎么来创建数据库连接等等呢,我们要根据这个驱动创建与之匹配的连接啊。

     刚才提到,Class.forName("");的作用是要求JVM查找并加载指定的类,如果在类中有静态初始化器的话,JVM必然会执行该类的静态代码段。而在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个 JDBC Driver的Driver类的代码都必须类似如下:

     这里面有一个静态代码块,在JVM加载类的时候,会执行这段代码,并向DriverMananger注册自己,这样DriverManager 就知道这个驱动了。因此,在这里并不需要再newInstance()一下,这样做是多余的,这样创建的对象可能永远都不会被用到。 这里给出一个实际的Driver例子源代码,mysql的Driver类:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值