原創作品,可以轉載,但是請標注出處地址: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接口的源碼:
1 package javax.sql; 2 import java.sql.Connection; 3 import java.sql.SQLException; 4 import java.sql.Wrapper; 5 public interface DataSource extends CommonDataSource,Wrapper { 6 Connection getConnection() throws SQLException; 7 Connection getConnection(String username, String password) 8 throws SQLException; 9 }
從源碼中可以看出,在數據源接口中定義了兩個獲取數據庫連接Connection的方法,可見數據源的目的所在,不論其使用什么原理實現,其目的就是為了對外提供數據庫連接的獲取接口。我們千方百計創建數據源實例,就是為外方通過getConnection()方法來獲取數據庫連接做基礎准備工作。下面看數據源工廠接口源碼:
數據源工廠接口源碼:
1 package org.apache.ibatis.datasource; 2 import java.util.Properties; 3 import javax.sql.DataSource; 4 /** 5 * 數據源工廠 6 * 有三種內建的數據源類型 UNPOOLED POOLED JNDI 7 */ 8 public interface DataSourceFactory { 9 //設置屬性,被XMLConfigBuilder所調用 10 void setProperties(Properties props); 11 //生產數據源,直接得到javax.sql.DataSource 12 DataSource getDataSource(); 13 }
數據源工廠接口中定義了兩個方法,一個是設置屬性的方法,與事務模型中的設置屬性方法類似,也是需要在構建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提供的三種數據源類型各有作用,其中非池型數據源是作為基礎存在的,一般也不會直接使用,常用的是池型數據源,而池型數據源是以非池型數據源為基礎的,第三種托管型數據源的意思就是采用外部的數據源。
有關這三種數據源的源碼解析詳見下一文。