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接口的源碼:

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提供的三種數據源類型各有作用,其中非池型數據源是作為基礎存在的,一般也不會直接使用,常用的是池型數據源,而池型數據源是以非池型數據源為基礎的,第三種托管型數據源的意思就是采用外部的數據源。

  有關這三種數據源的源碼解析詳見下一文。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM