• 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提供的三种数据源类型各有作用,其中非池型数据源是作为基础存在的,一般也不会直接使用,常用的是池型数据源,而池型数据源是以非池型数据源为基础的,第三种托管型数据源的意思就是采用外部的数据源。

      有关这三种数据源的源码解析详见下一文。

      

  • 相关阅读:
    看所访问网站的IP
    FLEX是什么及与FLASH的关系的介绍
    [设计模式]Head First Design Patterns[转]
    ASP.NET 2.0移动开发入门之使用模拟器
    在一篇文章的基础上总结了一下(接口,组合,继承,组件)
    抽象类与接口的区别 Java描述(转)
    C#:代表(delegate)和事件(event) (转)
    C#分页控件(自己做的)
    一个站点控制另一个站点的文件(添加,删除)用Webservices
    .net remoting程序开发入门篇
  • 原文地址:https://www.cnblogs.com/V1haoge/p/6634880.html
Copyright © 2020-2023  润新知