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源码解析(四) —— SqlSession是如何实现数据库操作的?
Mybatis源码解析(四) -- SqlSession是如何实现数据库操作的? 如果拿一次数据库请求操作做比喻,那么前面3篇文章就是在做请求准备,真正执行操作的是本篇文章要讲述的内容.正如标题一 ...
- Mybatis源码解析,一步一步从浅入深(四):将configuration.xml的解析到Configuration对象实例
在Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们看到了XMLConfigBuilder(xml配置解析器)的实例化.而且这个实例化过程在文章:Mybatis源码解析,一步一步从浅 ...
- mybatis源码-解析配置文件(四-1)之配置文件Mapper解析(cache)
目录 1. 简介 2. 解析 3 StrictMap 3.1 区别HashMap:键必须为String 3.2 区别HashMap:多了成员变量 name 3.3 区别HashMap:key 的处理多 ...
- mybatis源码-解析配置文件(四)之配置文件Mapper解析
在 mybatis源码-解析配置文件(三)之配置文件Configuration解析 中, 讲解了 Configuration 是如何解析的. 其中, mappers作为configuration节点的 ...
- Mybatis源码解析(二) —— 加载 Configuration
Mybatis源码解析(二) -- 加载 Configuration 正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...
- MyBatis 源码分析 - 内置数据源
1.简介 本篇文章将向大家介绍 MyBatis 内置数据源的实现逻辑.搞懂这些数据源的实现,可使大家对数据源有更深入的认识.同时在配置这些数据源时,也会更清楚每种属性的意义和用途.因此,如果大家想知其 ...
- mybatis源码-解析配置文件(三)之配置文件Configuration解析
目录 1. 简介 1.1 系列内容 1.2 适合对象 1.3 本文内容 2. 配置文件 2.1 mysql.properties 2.2 mybatis-config.xml 3. Configura ...
- Mybatis源码解析,一步一步从浅入深(一):创建准备工程
Spring SpringMVC Mybatis(简称ssm)是一个很流行的java web框架,而Mybatis作为ORM 持久层框架,因其灵活简单,深受青睐.而且现在的招聘职位中都要求应试者熟悉M ...
- Mybatis源码解析(一) —— mybatis与Spring是如何整合的?
Mybatis源码解析(一) -- mybatis与Spring是如何整合的? 从大学开始接触mybatis到现在差不多快3年了吧,最近寻思着使用3年了,我却还不清楚其内部实现细节,比如: 它是如 ...
- 【MyBatis源码解析】MyBatis一二级缓存
MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...
随机推荐
- Error resolving template [xxx], template might not exist or might not be exist
Springboot+thymeleaf+mybatis 抛Error resolving template [xxx], template might not exist的异常 原因是我们在pom. ...
- Redis sentinel之集群搭建
环境 由于不太熟悉docker,所以,把docker当虚拟机来用,服务器环境如下: Redis Server 环境搭建 Redis Server 01 搭建 并且制作Redis镜像 容器建立 # do ...
- 与http协作的web服务器--代理、网关、隧道
一台服务器可以搭建多个web站点 代理: 接受客户端发送的请求,转发给其他服务器,然后接受服务器的返回结果(响应)再返回给客户端.每次经过代理服务器,就会追加写入via首部信息. 按两种基准分类.一种 ...
- GET和POST两种请求方法的区别(RFC翻译)
GET和POST方法是HTTP协议规定的.查了HTTP1.1的RFC,原文的专业性极强.下面是白话翻译,欢迎补充和指错. GET方法就是检索(以实体的形式)由请求uri所指定的资源.如果请求的uri指 ...
- es6的几种写法
语法:1.只有一个参数,可以不用写小括号: var single = a => a; //相当于var single = function(a){return a;}console.log(si ...
- 利用正则+requests爬取猫眼电影信息
import json # from multiprocessing import Pool import requests from requests.exceptions import Reque ...
- Oracle ebs 数据脱敏
https://blog.csdn.net/pan_tian/article/details/16120351Data Masking可对数据进行不可逆的去身份化后,再用于非生产环境,同时自动保留引用 ...
- Android-Java-普通类与抽象类(覆盖)&方法重载
覆盖都是子类与父类之间 & 接口与实现类之间 才会产生:覆盖 有很多名称,覆盖,复写,重写 都是一个意思: 注意:重载都是方法之间 方法同名 不同参数,就属于重载: 普通类-覆盖: 描述An ...
- 最强大的跨语言调用生成工具:Swig 快速实用教程
swig是一个生成其他高级语言调用c和C++代码的工具,比如,大家都知道java的jni,可能没写过,因为非常麻烦,swig可以帮助生成这样的代码,编译生成的代码后,它会生成java类和c代码文件.分 ...
- 包建强的培训课程(11):iOS Runtime实战
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...