Java操作数据库⽅式(六)DataSource详解
##概述
在java世界⾥操作数据库有很多⽅式,在众多⽅式中除了JDBC外都有DataSource对象。
DataSource可以看作数据源,它封装了数据库参数,连接数据库,程序中操作DataSource对象即可对数据库进⾏增删改查操作。
不同⽅式中使⽤的DataSource对象不同。列举如下:
1,DBCP框架
dbcp框架中的DataSource类是:s.dbcp.BasicDataSource
这是commons-dbcp.jar包中的类。
2,C3P0框架
c3p0框架的DataSource类是:hange.v2.c3p0.ComboPooledDataSource
这是c3p0.jar包中的类。
3,MyBatis框架
MyBatis框架的DataSource类是:org.apache.ibatis.datasource.pooled.PooledDataSource
这是mybatis.jar包中的类。
4,Druid框架
Druid框架的DataSource类是:com.alibaba.druid.pool.DruidDataSource
这是druid.jar包中的类。
值得注意的是:
1. 以上框架中的DataSource虽然类不同,但可以混合使⽤,即在MyBatis框架中可以使⽤DBCP中的DataSource类,也可以使⽤
Druid框架中的DataSource类。
2. Druid并不是⼀个独⽴操作数据库的框架,它只提供了DataSource,必须与其他框架配合使⽤。
3. 只所以这些DataSource对象可以通⽤,是因为他们都实现了同⼀个接⼝:javax.sql.DataSource。实现DataSource接⼝即必须重新
getConnection⽅法,即可以获得Connection对象,有了Connection对象即可以对数据库操作。
下⾯分别对不同框架的DataSource类及⼯作原理做详细讲解。
##DBCP框架的BasicDataSource
⼀,使⽤
DBCP框架的具体使⽤参见:
⼆,源码分析
由于篇幅有限,对源码不做详细分析,只分析使⽤BasicDataSource操作数据库的流程。
下⾯以查询⽅法为例说明。
查询调⽤的是QueryRunner类的query⽅法。⾸先是创建QueryRunner对象,代码如下:
QueryRunner queryRunner = new QueryRunner(dataSource);
此时把DataSource对象传递给了QueryRunner对象,此时可以接收DataSource接⼝的任意实现类对象。
QueryRunner类的query⽅法源码如下:
public <T> T query(String sql, ResultSetHandler<T> rsh, params) throws SQLException {
Connection conn = this.prepareConnection();
return this.query(conn, true, sql, rsh, params);
}
这⾥⾯⾸先通过prepareConnecton()⽅法获取connection对象,⽅法的源码如下:
protected Connection prepareConnection() throws SQLException {
if (DataSource() == null) {
throw new SQLException("QueryRunner requires a DataSource to be invoked in this way, or a Connection should be pasd in");
} el {
DataSource().getConnection();
}
}
三,总结
从上⾯的源码中我们会发现,对于QueryRunner来说,DataSource是哪个实现类并不重要,重要的是得到Connection对象,有了Connection对象就可以继续下⾯的操作。这也是不同框架中的DataSource对象可以互相使⽤的原因,更是java中⾯向接⼝编程的强⼤优势。
##C3P0框架的ComboPooledDataSource
⼀,使⽤
在spring-data-jpa框架中使⽤的是ComboPooledDataSource,具体参见:
⼆,源码分析
三,总结
##MyBatis框架的PooledDataSource
⼀,使⽤
⼆,源码分析
三,总结
##Druid框架的DruidDataSource
⼀,使⽤
⼆,源码分析
三,总结
##不同DataSource对象优缺点对⽐分析
##总结
未完待续。。。