##概述

在java世界里操作数据库有很多方式,在众多方式中除了JDBC外都有DataSource对象。

DataSource可以看作数据源,它封装了数据库参数,连接数据库,程序中操作DataSource对象即可对数据库进行增删改查操作。

不同方式中使用的DataSource对象不同。列举如下:

1,DBCP框架

dbcp框架中的DataSource类是:org.apache.commons.dbcp.BasicDataSource

这是commons-dbcp.jar包中的类。

2,C3P0框架

c3p0框架的DataSource类是:com.mchange.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框架的具体使用参见:Java操作数据库方式二DBCP使用详解

二,源码分析

由于篇幅有限,对源码不做详细分析,只分析使用BasicDataSource操作数据库的流程。

下面以查询方法为例说明。

查询调用的是QueryRunner类的query方法。首先是创建QueryRunner对象,代码如下:

            QueryRunner queryRunner = new QueryRunner(dataSource);

此时把DataSource对象传递给了QueryRunner对象,此时可以接收DataSource接口的任意实现类对象。

QueryRunner类的query方法源码如下:

    public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {Connection conn = this.prepareConnection();return this.query(conn, true, sql, rsh, params);}

这里面首先通过prepareConnecton()方法获取connection对象,方法的源码如下:

    protected Connection prepareConnection() throws SQLException {if (this.getDataSource() == null) {throw new SQLException("QueryRunner requires a DataSource to be invoked in this way, or a Connection should be passed in");} else {return this.getDataSource().getConnection();}}

三,总结

从上面的源码中我们会发现,对于QueryRunner来说,DataSource是哪个实现类并不重要,重要的是得到Connection对象,有了Connection对象就可以继续下面的操作。这也是不同框架中的DataSource对象可以互相使用的原因,更是java中面向接口编程的强大优势。

##C3P0框架的ComboPooledDataSource

一,使用

在spring-data-jpa框架中使用的是ComboPooledDataSource,具体参见:Java操作数据库方式四Spring data jpa的使用

二,源码分析

三,总结

##MyBatis框架的PooledDataSource

一,使用

二,源码分析

三,总结

##Druid框架的DruidDataSource

一,使用

二,源码分析

三,总结

##不同DataSource对象优缺点对比分析

##总结

未完待续。。。

Java操作数据库方式(六)DataSource详解相关推荐

  1. Java操作数据库方式二DBCP使用详解

    ##概述 DBCP的全称是:DataBase connection pool,翻译是:数据库连接池. 在Java操作数据库方式一JDBC使用详解中说到直接使用JDBC非常消耗资源.为了避免频繁关闭链接 ...

  2. Java操作数据库方式五MyBatis使用入门

    ##概述 ##MyBatis是什么 MyBatis是一个持久层框架,作用是在java项目中操作数据库. ##MyBatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年 ...

  3. java内部类实现方式_Java内部类详解

    一 内部类是什么 Java类中不仅可以定义变量和方法,还可以定义类,这样定义在类内部的类就被称为内部类.根据定义的方式不同,内部类分为静态内部类,成员内部类,局部内部类,匿名内部类四种. Java为什 ...

  4. mongodb java查询_java操作mongoDB查询的实例详解

    java操作mongo查询的实例详解 前言: MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库 ...

  5. java 文件下载详解_Java 从网上下载文件的几种方式实例代码详解

    废话不多说了,直接给大家贴代码了,具体代码如下所示: package com.github.pandafang.tool; import java.io.BufferedOutputStream; i ...

  6. idea 执行java maven,IDEA的run maven方式启动步骤详解

    安装jetty插件 1. 找到Plugins,查找jetty插件,安装"IDEA Jetty Runner",安装好后重启IDEA 安装插件:Maven Helper 方法同Jet ...

  7. 一文快速回顾 Java 操作数据库的方式-JDBC

    前言 数据库的重要性不言而喻,不管是什么系统,什么应用软件,也不管它们是 Windows 上的应用程序,还是 Web 应用程序,存储(持久化)和查询(检索)数据都是核心的功能. 大家学习数据库时,比如 ...

  8. 2016年 第07届 蓝桥杯 Java B组 决赛真题详解及小结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  9. 2018年 第09届 蓝桥杯 Java B组 决赛真题详解及小结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

最新文章

  1. 七天入门linux,RHCE认证学习笔记-第七天
  2. 实例介绍Cocos2d-x开关菜单
  3. Ardino基础教程 21_LCD1602液晶屏
  4. 谋定国家5G战略的基石-工信部韦乐平:经信研究网络领先
  5. C#IList 取区间数据
  6. Mac平台下安装与配置MySQL
  7. 线性回归算法数学原理_线性回归算法-非数学家的高级数学
  8. 《解剖PetShop》系列之三
  9. 企业实战_01_ Mycat 主要作用_01
  10. 重置gitlab管理员密码
  11. Java项目实战教程分享
  12. 22条最常用Python代码,快收藏
  13. NLTK(自然语言工具包)
  14. oracle去除字段值的所有英文
  15. 什么是列联表分析(Contingency table analysis)?
  16. 高端存储“四十不惑”
  17. C语言零基础——简单门票费程序
  18. github配置SSH keys
  19. 国家一级建造师—工程经济—第一章—第四节
  20. IKEv2协议报文分片处理

热门文章

  1. 理想电压源的内阻是0,理想电流源的内阻是无穷大
  2. Oracle 从入门到精通系列 - 思维导图计划
  3. TDD-FDD语音分层
  4. project2016设置项目更新与监控方法
  5. 查看搜狗浏览器插件的本地安装位置
  6. JDK8 ThreadLocal 源码解析与最佳实践
  7. 人工智能应用的细分领域有哪些
  8. 内网安全,站在十年的路口
  9. 克隆一个自己的 AI 来上网课,
  10. 关闭占用指定端口的进程