mybatis 3.4.2 DataSourceFactory与DataSource
来源:互联网 发布:云计算和分布式计算 编辑:程序博客网 时间:2024/05/24 02:26
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的内容会比较丰富,后面有机会在展开介绍。
- mybatis 3.4.2 DataSourceFactory与DataSource
- DataSourceFactory
- 模仿与学习MyBatis - 1.2 DataSource与Session
- Mybatis中dataSource
- Mybatis的数据源 DataSource
- MyBatis-dataSource(数据源)
- MyBatis数据源DataSource分类
- Mybatis DataSource Connection 相关源码
- MyBatis Unknown DataSource property:name
- MyBatis源代码--数据源(dataSource)
- mybatis与spring整合报错NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataSour
- XA Datasource 与 Non-XA Datasource 区别
- ibatis自定义DataSourceFactory
- JDBC与DataSource
- JDBC与DataSource
- 控制器与dataSource
- <transactionManager>与<datasource>元素
- maven+springmvc+mybatis案例---遇到的2个问题:dataSource、方法找不到
- 【React Native】React Native 的开发路(Windows 开发环境配置)
- Python爬虫模拟登陆知乎
- ubuntu14下配置静态ip地址
- 分块の基础,(例题)HDU1556
- jzoj 4243. 【五校联考6day1】c 分块
- mybatis 3.4.2 DataSourceFactory与DataSource
- Codeforces-546D Soldier and Number Game 【质因子分解+打表+DP】
- 什么是JSON
- Oulipo_poj3461_kmp
- 基于Spring的AOP实现自定义annotation操作日志
- C++泛型编程2——类模板,容器适配器,仿函数
- 为何计算机人应该懂一点编译知识?
- Handler线程学习心得
- android异常捕获,上线前的操作