Class.forname()有什么作用?
作用:
1、用于在JVM中查找并加载指定的类到内存中
2、初始化这个类
连接代码:
1 | try { |
将”com.mysql.jdbc.Driver”作为参数传入,是让JVM到”com.mysql.jdbc”路径下,找到Driver类并将其加载到内存中。
Driver类的详细代码:
1 | public class Driver extends NonRegisteringDriver implements java.sql.Driverb { |
Class.forName(“com.mysql.jdbc.Driver”)的作用实际上就是调用DriverManager的 registerDriver方法注册一个mysql的JDBC驱动(Driver)而已(简而言之,就是将mysql驱动注册到DriverManager中去)。
调用的DriverManager的 registerDriver方法中的关键代码有:
1 | private static final CopyOnWriteArrayList<DriverInfo> registeredDrivers = |
它的底层利用了一个CopyOnWriteArrayList作为容器(这是一个线程安全的容器,不过每次add的时候都会对底层数组进行一次新的复制,所以在读远多于写的时候建议可以使用这个),放那些注册进去的DriverInfo。最终getConnection(…)的时候就拿registerDrivers里面注册进去的具体的某个数据库的DriverInfo(像MySql的Driver就在DriverInfo里面)去连接具体的数据库。
整个流程:
JDK不负责和数据库连接打交道,也没必要,只提供一个具体的接口Driver,告诉所有第三方,要连接数据库,就去实现这个接口,然后通过DriverManager注册一下,到时候连接某个数据库的时候,你已经在我这里注册了,我会调用你注册进来的Driver里面的方法去对指定数据库进行连接的。然后Mysql就实现自己的Driver,Oracle就实现自己的Driver,通过static块注册一下,再然后,就没有然后了。
import不执行静态代码块,而class.forname会执行静态代码块。