Bridge mode source parsing (jdk)

现在我们来看一下桥接模式在源码中的一些应用,首先我们说一下,我们先看一个接口,首先我们看一下Driver的实现类,

我们看到com.mysql.jdbc实现了Driver,添加了ORACLE的驱动,或者SQLServer的驱动的话,那具体的MySQL的Driver,还有

ORACLE的Driver,就是桥接模式的一部分,那JDBC如何获取数据库的连接呢,很简单,我们打开DriverManager,也是sql包下的,

private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers 

= new CopyOnWriteArrayList<>();

这里是一个CopyOnWriteArrayList,里面的类型是DriverInfo,是驱动信息,我们看一下,这个类型里边是如何封装的,点开他,

那在这里就可以看到,其实他是对Driver的具体封装,包括他的hashCode,还有呢,构造器,只不过把Driver作为DriverInfo的

一个属性,hashCode返回也是具体Driver的hashCode,那我们接着回来,那我们就可以理解DriverInfo就是一个Driver,

DriverManager里面主要就是一个registerDriver这么一个方法,注册驱动,

public static synchronized void registerDriver(java.sql.Driver driver,
		DriverAction da)
	throws SQLException {

	/* Register the driver if it has not already been added to our list */
	if(driver != null) {
		registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
	} else {
		// This is for compatibility with the original DriverManager
		throw new NullPointerException();
	}

	println("registerDriver: " + driver);

}

在Mysql里边,我们通过classForName,然后com..mysql.jdbc.Driver,然后直接看一下Driver这个类,如果通过Class.forName

的话,直接调用mysql里面的驱动静态块

static {   
       try {   
                java.sql.DriverManager.registerDriver(new Driver());   
            } catch (SQLException E) {   
               throw new RuntimeException("Can't register driver!");   
           }   
      }   

然后调用DriverManager,这样又回到这里边了,这样又回到这里边了,具体又添加到了registeredDrivers注册的驱动里边

private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers 

= new CopyOnWriteArrayList<>();

那驱动完成之后,我们再看一下这个类的getConnection方法,获取具体的连接,那我们平时简写的时候,最多的就是

getConnection,三个String的这么一个方法,这里面 要传URL,用户名,还有具体的密码,通过这个静态方法,来获取数据库的连接,

那JDBC通过DriverManager对外提供了操作了数据库的统一接口,getConnection,当然这里也包含多个方法重载,那这个方法就可以

获取不同的数据库连接,并且通过这个返回值,Connection这个类呢,里面提供方法对数据库进行操作,我们现在进来了,我们看一下

这里面有很多方法,执行各种SQL语句使用的,那JDBC用不同的数据库,提供了相同的接口,也就是我们这里边的各种方法,

无论是操作mysql,还是操作ORACLE,里面的方法是一样的,只不过看一下他的实现类,第一个是Mysql的Connection接口,

第二个是Mysql的具体的实现,当然我们可以发现,DBDP的连接池,也实现了JDK原生下边的Connection,如果pom里边加载了

ORALCE的驱动,还有SQLServer的驱动,也会找到对应驱动实现的,JDK中的Connection接口的,具体实现类,也就是针对不同的

数据库,通过DriverManager里的getConnection方法,获取的都是相同的Connection接口的,也就是在JDBC最初设计的时候呢,

设计了一套接口,再由各个数据库公司自己来实现,实现这个接口,我们再调用的过程中,只需要使用接口来定义就可以了,

那在具体的DriverManager里面,registerDriver这个方法,

public static synchronized void registerDriver(java.sql.Driver driver,
		DriverAction da)
	throws SQLException {

	/* Register the driver if it has not already been added to our list */
	if(driver != null) {
		registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
	} else {
		// This is for compatibility with the original DriverManager
		throw new NullPointerException();
	}

	println("registerDriver: " + driver);

}

那在这个方法中,就会找到接口真正的实现类,以此来实现数据库真正的连接,而且DriverManager里面获得的Connection,里面获得

PreparedStatement对象,等等呢,都是由Connection接口来进行调用,但是底层返回的肯定是具体的,加载了mysql,那就返回具体的

MYSQL的preparedStatement,他们所实现的实现类,那用这种桥接的模式呢,我们只需要修改Driver所修改的类,就可以了,例如

com.mysql.jdbc.Driver,还有com.oracle,就可以很方便的在不同的数据库之间,进行转化,那这个模式呢,正是桥接模式在JDK中的

一些使用,而且还可以看出来,通过这种JDK中桥接模式的接口,设计,很好的实现了开闭原则,无论有什么数据库厂商,只要具体实现了

JDBC接口的话,都可以接入到JAVA的数据库操作当中,所以在DriverManager这个类里边,我们看一下,这个Driver是一个集合,

而集合里面的元素呢,DriverInfo是对Driver的封装,所以我们可以认为,他就是Driver,所以DriverManager和具体的Driver之间,

就实现了桥接模式,而Driver还有具体的Mysql Driver,Oracle Driver,等具体的Driver实现,那希望你们对这块呢,能加深印象,

理解透彻

 

Guess you like

Origin blog.csdn.net/Leon_Jinhai_Sun/article/details/91041869