mybatis 3.4.2 DataSourceFactory与DataSource

mybatis 是 SQL Mapper framework,JDBC是建立在mybatis和数据库之间的通道。mybatis 将对JDBC的操作封装和抽象。

将mybatis使用JDBC的过程与用代码直接使用JDBC比较,就可以很清楚的理解mybatis所做的哪些事情和代码,知道为什么这么做以及如何实现的。

而DataSourceFactory是这一过程的起点。

一、不同的连接数据源工厂 DataSourceFactory

mybatis提供了三种 DataSourceFactory :
* JndiDataSourceFactory
* UnPooledDataSourceFactory
* PooledDataSourceFactory

二、不同数据源类型 DataSource

mybatis提供了三种类型的数据源分别与上面的DataSourceFactory相对应:
一是jndi的数据源;
二是非连接池方式数据源UnpooledDataSource;
三是连接池方式的数据源PooledDataSource。

DataSourceFactory提供获取数据源getDataSource()和设置DataSource属性的方法setProperties(Properties props)。

setProperties(Properties props)在XMLConfigBuilder类中被调用。将mybatis-config.xml中的 dataSource元素中的属性配置保存到DataSourceFactory的dataSource变量中。

setProperties(Properties props)用的是反射机制完成属性值的设置。

三、不同的类型的连接 Connection

三种数据源提供了三种不同的连接 Connection。

  • JNDI的数据源DataSource和连接类型Connection可以查看 JndiDataSourceFactory.java;

  • UnpooledDataSource的连接类型Connection 可以查看UnpooledDataSource.java

  • PooledDataSource的连接类型可以查看PooledDataSource.java

这里写图片描述

四、DataSource的配置

DataSourceFactory的选择通过mybatis-config.xml中的dataSource元素的type属性设置。

<environments default="development">
    <environment id="development">
       <transactionManager type="JDBC" />
       <dataSource type="POOLED">
            <property name="driver" value="${db.driver}" />
            <property name="url" value="${db.url}" />
            <property name="username" value="${db.username}" />
            <property name="password" value="${db.password}" />
            <property name="poolPingQuery" value="SELECT NOW()" />
            <property name="poolPingEnabled" value="true" />
      </dataSource>
   </environment>
</environments>

type属性的取值有三个:JNDI、POOLED和UNPOOLED。
分别对应上面的JndiDataSourceFactory、UnpooledDataSourceFactory和PooledDataSourceFactory。

这个可以在Configuration类的无参数构造方法中看到:

  public Configuration() {
    typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);
    typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);

    typeAliasRegistry.registerAlias("JNDI", JndiDataSourceFactory.class);
    typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class);
    typeAliasRegistry.registerAlias("UNPOOLED", UnpooledDataSourceFactory.class);

...
  }

五、DataSource 与 SqlSession 的关系

根据 mybatis 3.4.2 DefaultSqlSession的配置 的介绍,只要获取了 SqlSessionManager 就可以进行数据库操作。因此,可以从这段代码可以看出,在创建DefaultSqlSession的时候:

  • 把数据源DataSource赋予了Transaction;
  • 把Transaction赋予了Executor;
  • 把Executor赋予了 DefaultSqlSession;
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
      final Environment environment = configuration.getEnvironment();
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
      final Executor executor = configuration.newExecutor(tx, execType);
      return new DefaultSqlSession(configuration, executor, autoCommit);
    } catch (Exception e) {
      closeTransaction(tx); // may have fetched a connection so lets call close()
      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

因此,只要获得了DefaultSqlSession就获得了相应的DataSource、Transaction和Executor来执行SQL。

每个DataSource、Transaction和Executor可以通过mybatis-config.xml进行设置调整。

DefaultSqlSession和Executor的内容会比较丰富,后面有机会在展开介绍。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值