浩哥解析MyBatis源码(四)——DataSource数据源模块
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6634880.html
1、回顾
上一文中解读了MyBatis中的事务模块,其实事务操作无非就是提交和回滚。整个事务模块采用了抽象工厂模式进行设计,将具体的事务实例的生成对使用方隐藏,使用工厂中提供的生产方法来获取。
事务模块分为两类:JDBC类型和MANAGED类型,前者多用于单独使用MyBatis框架的情况下(比如测试学习MyBatis功能),后者则表示托管于其他框架,比如Spring来完成事务功能。
这一回我们来看看环境设置中的另一项内容:数据源DataSource。
(其实应该先解读DataSource,在解读Transaction的,但是...失误啊...)
2、数据源模块
数据源模块位于org.apache.ibatis.datasource包下,其架构结构为:
org.apache.ibatis.datasource
----org.apache.ibatis.datasource.jndi
--------JndiDataSourceFactory.java
----org.apache.ibatis.datasource.pooled
--------PooledConnection.java
--------PooledDataSource.java
--------PooledDataSourceFactory.java
--------PoolState.java
----org.apache.ibatis.datasource.unpooled
--------UnpooledDataSource.java
--------UnpooledDataSourceFactory.java
----DataSourceException.java
----DataSourceFactory.java
和事务模块类似,数据源模块同样采用了工厂模式。
2.1 数据源接口
org.apache.ibatis.datasource包下的DataSourceFactory是数据源工厂接口,至于数据源接口沿用JDK中给出的javax.sql包下的数据源接口DataSource,下面给出JDK中DataSource接口的源码:
package javax.sql;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Wrapper;
public interface DataSource extends CommonDataSource,Wrapper {
Connection getConnection() throws SQLException;
Connection getConnection(String username, String password)
throws SQLException;
}
从源码中可以看出,在数据源接口中定义了两个获取数据库连接Connection的方法,可见数据源的目的所在,不论其使用什么原理实现,其目的就是为了对外提供数据库连接的获取接口。我们千方百计创建数据源实例,就是为外方通过getConnection()方法来获取数据库连接做基础准备工作。下面看数据源工厂接口源码:
数据源工厂接口源码:
package org.apache.ibatis.datasource;
import java.util.Properties;
import javax.sql.DataSource;
/**
* 数据源工厂
* 有三种内建的数据源类型 UNPOOLED POOLED JNDI
*/
public interface DataSourceFactory {
//设置属性,被XMLConfigBuilder所调用
void setProperties(Properties props);
//生产数据源,直接得到javax.sql.DataSource
DataSource getDataSource();
}
数据源工厂接口中定义了两个方法,一个是设置属性的方法,与事务模型中的设置属性方法类似,也是需要在构建Configuration配置类时由XMLConfigBuilder来进行调用的,调用的目的是为了将配置文件中配置的数据源属性信息填充到DataSource中(然后在填充到Environment中,在填充到Configuration中,这是后话)。
这些Properties属性配置正是第二节列举过的Configuration配置文件中的一部分:
1 <dataSource type="POOLED">
2 <property name="driver" value="com.mysql.jdbc.Driver"/>
3 <property name="url" value="jdbc:mysql://localhost:3306/mbtest"/>
4 <property name="username" value="root"/>
5 <property name="password" value="123456"/>
6 </dataSource>
这一段配置内容中<dataSource>标签表明这是数据源的配置信息,type属性表示这个数据源是POOLED(池型)类型的数据源,然后在其内部设置property子标签用于指定数据源的具体信息:驱动器、数据库URL、用户名、密码四项内容。
另一个方法是DataSource实例的生产方法,这也是工厂的主要作用:用来生产对应类的实例。
这里插播一条信息:Connection与DataSource的关系,Connection(连接)是包含在DataSource(数据源)之内的,我们可以通过DataSource来得到其中的Connection,反之不可能,所以我们需要先创建DataSource实例,以此来获取Connection数据库连接,所有DataSource是基础,Connection是目的。
2.2 Mybatis数据源类型
MyBatis为我们提供了三种具体的数据源类型:
unpooled:非池型数据源
pooled:池型数据源
jndi:托管型
MyBatis提供的三种数据源类型各有作用,其中非池型数据源是作为基础存在的,一般也不会直接使用,常用的是池型数据源,而池型数据源是以非池型数据源为基础的,第三种托管型数据源的意思就是采用外部的数据源。
有关这三种数据源的源码解析详见下一文。
浩哥解析MyBatis源码(四)——DataSource数据源模块的更多相关文章
- 浩哥解析MyBatis源码(五)——DataSource数据源模块之非池型数据源
1 回顾 上一篇中我解说了数据源接口DataSource与数据源工厂接口DataSourceFactory,这二者是MyBatis数据源模块的基础,包括本文中的非池型非池型数据源(UnpooledDa ...
- 浩哥解析MyBatis源码(十)——Type类型模块之类型处理器
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...
- 浩哥解析MyBatis源码(六)——DataSource数据源模块之池型数据源
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675674.html 1 回顾 上一文中解读了MyBatis中非池型数据源的源码,非池型也 ...
- 浩哥解析MyBatis源码(七)——DataSource数据源模块之托管数据源
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675700.html 1 回顾 之前介绍的非池型与池型数据源都是MyBatis自己定义的内 ...
- 浩哥解析MyBatis源码(八)——Type类型模块之TypeAliasRegistry(类型别名注册器)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6705769.html 1.回顾 前面几篇讲了数据源模块,这和之前的事务模块都是enviro ...
- 浩哥解析MyBatis源码(二)——Environment环境
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6625612.html 本应该先开始说Configuration配置类的,但是这个类有点过于 ...
- 浩哥解析MyBatis源码(十一)——Parsing解析模块之通用标记解析器(GenericTokenParser)与标记处理器(TokenHandler)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6724223.html 1.回顾 上面的几篇解析了类型模块,在MyBatis中类型模块包含的 ...
- 浩哥解析MyBatis源码(十二)——binding绑定模块之MapperRegisty
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6758456.html 1.回顾 之前解析了解析模块parsing,其实所谓的解析模块就是为 ...
- 浩哥解析MyBatis源码(九)——Type类型模块之类型处理器注册器(TypeHandlerRegistry)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6709157.html 1.回顾 上一篇研究的是类型别名注册器TypeAliasRegist ...
随机推荐
- Odd Numbers of Divisors
给出一个正奇数K,两个正整数low,high. 有多少整数属于[low, high],且包含K个因子. 数据 C(0 < C < 1e5),测试样例数. (1 < K < 10 ...
- 读书笔记 effective c++ Item 21 当你必须返回一个对象的时候,不要尝试返回引用
1. 问题的提出:要求函数返回对象时,可以返回引用么? 一旦程序员理解了按值传递有可能存在效率问题之后(Item 20),许多人都成了十字军战士,决心清除所有隐藏的按值传递所引起的开销.对纯净的按引用 ...
- collectionView布局
关于 collectionView的layout布局方法: 设置cell的间距,行间距,组与组之间的间距,都是在layout里面来设置. 包括,滚动方向. -(void)prepareLayout [ ...
- 每天一个linux命令(41)--ping命令
Linux系统的 ping 命令是常用的网络命令,它通常用来测试与目标主机的连通性,它通过发送 ICMP ECHO_REQUEST数据包到网络主机(send ICMP ECHO_REQUEST t ...
- iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解
iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解 iOS开发中,我们常常将一块View封装起来,以便于统一管理内部的子控件.如iOS回顾笔记(02)中的"书" ...
- .NET 知识整理笔记
本文纯属自己理解着写的,如果有什么错误或者不全面希望读者能够加以补充!~ 1.Web.Config配置文件的节点操作. 在Web.Config中写入. <configuration> &l ...
- 利用内核cgroup机制轻松实现类似docker的系统资源管控
近几年,以docker为代表的容器技术异常火热,它的轻量.高效让人欣喜若狂,它被赋予了改变传统IT运维的使命.相信随着时间推移,以容器云为落地形式的产品将真正实现这一使命. 我们都知道docker能够 ...
- 小白该怎么学《马哥Linux从入门到精通》
首先,必须说明我已经不是小白啦~现在的我在国内某独角兽担任运维工程师,带着一个四人小团队,在运维方面也算是有些心得,勉强过来回答一下这个问题,就算抛砖引玉了. 所有人都是从小白阶段过来的,我=也经历过 ...
- ajax详细讲解和封装包括HTTP状态码
AJAX(异步的JavaScript和XML,用异步的形式去操作xml) 主要的作用:数据交互 好处: 1.节省用户的操作时间 2.提高用户 ...
- 超出父视图无法点击问题hitTest
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c91b13 } p.p2 { margin: 0.0px 0. ...