今天在复习Spring整合Mybatis的时候,在编写例子期间,比较了主流的三种数据库连接池(dbcp、c3p0和druid)的数据源配置,发现在druid的配置中不需要声明使用的是哪个数据库驱动Driver。
以下是Spring的数据源的配置:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="jdbc:h2:~/test" />
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
在对com.alibaba.druid.pool.DruidDataSource进行断点调试之后,发现:
PS:参考的druid源码版本是1.0.9
- 数据库的基本配置其实是在com.alibaba.druid.pool.DruidDataSource的父类com.alibaba.druid.pool.DruidAbstractDataSource中的属性。
- 可以通过driverClass属性显式配置数据库驱动类(要使用全限定类型)
- 在com.alibaba.druid.pool.DruidDataSource的init()方法中:
public void init(){
//省略部分不相关的代码
...
if (this.driver == null) {
if (this.driverClass == null || this.driverClass.isEmpty()) {
this.driverClass = JdbcUtils.getDriverClassName(this.jdbcUrl);
}
if (MockDriver.class.getName().equals(driverClass)) {
driver = MockDriver.instance;
} else {
driver = JdbcUtils.createDriver(driverClassLoader, driverClass);
}
} else {
if (this.driverClass == null) {
this.driverClass = driver.getClass().getName();
}
}
...
}
在这个方法中,Druid是通过使用com.alibaba.druid.util.JdbcUtils的getDriverClassName()方法通过url去获取到对应的数据驱动类的全限定名。
PS:JdbcUtils的getDriverClassName()方法一大堆if else