初始化机制
配置初始化
MyBatis初始化的过程,就是创建 Configuration对象的过程
初始化方式
基于XML配置文件:基于XML配置文件的方式是将MyBatis的所有配置信息放在XML文件中,<br>MyBatis通过加载并XML配置文件,将配置文信息组装成内部的Configuration对象<br>
基于Java API:这种方式不使用XML配置文件,需要MyBatis使用者在Java代码中,<br>手动创建Configuration对象,然后将配置参数set 进入Configuration对象中<br>
mybatis初始化流程
数据源和连接池
Mybatis数据源DataSource分类
UNPOOLED 不使用连接池的数据源
POOLED 使用连接池的数据源
JNDI 使用JNDI实现的数据源
DataSource UML图
数据源DataSource的创建过程
1.MyBatis在初始化时,解析此文件,根据<dataSource>的type属性来创建相应类型的的数据源DataSource
2. MyBatis是通过工厂模式来创建数据源DataSource对象的,MyBatis定义了抽象的工厂接口:org.apache.ibatis.datasource.DataSourceFactory,通过其getDataSource()方法返回数据源DataSource
3.MyBatis创建了DataSource实例后,会将其放到Configuration对象内的Environment对象中, 供以后使用
DataSouceFactoryUML图
DataSource什么时候创建Connection对象
当我们需要创建SqlSession对象并需要执行SQL语句时,这时候MyBatis才会去调用dataSource对象来创建java.sql.Connection对象
不使用连接池的UnpooledDataSource
UnpooledDataSouce时序图
为什么要使用连接池
创建一个java.sql.Connection对象的代价是如此巨大,是因为创建一个Connection对象的过程,<br>在底层就相当于和数据库建立的通信连接,在建立通信连接的过程,消耗了这么多的时间,<br>而往往我们建立连接后(即创建Connection对象后),就执行一个简单的SQL语句,然后就要抛弃掉,这是一个非常大的资源浪费<br>
解决方案
对于需要频繁地跟数据库交互的应用程序,可以在创建了Connection对象,并操作完数据库后,可以不释放掉资源,而是将它放到内存中,<br>当下次需要操作数据库时,可以直接从内存中取出Connection对象,不需要再创建了,这样就极大地节省了创建Connection对象的资源消耗<br>
PooledDataSource连接池
PoolState 连接池
连接池中获取connection
Connection对象的回收
使用池化思想,怎样实现Connection对象调用了close()方法,而实际是将其添加到连接池中
要使用代理模式<br>为真正的Connection对象创建一个代理对象,代理对象所有的方法都是调用相应的真正Connection对象的方法实现。<br>当代理对象执行close()方法时,要特殊处理,不调用真正Connection对象的close()方法,而是将Connection对象添加到连接池中。<br>
MyBatis的PooledDataSource的PoolState内部维护的对象是PooledConnection类型的对象,<br>而PooledConnection则是对真正的数据库连接java.sql.Connection实例对象的包裹器。<br>
事务管理
概述
数据库事务:创建(create)、提交(commit)、回滚(rollback)、关闭(close)
MyBatis将事务抽象成了Transaction接口
MyBatis的事务管理形式
一、使用JDBC的事务管理机制:即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等
二、使用MANAGED的事务管理机制:这种机制MyBatis自身不会去实现事务管理,<br>而是让程序的容器如(JBOSS,Weblogic)来实现对事务的管理<br>
<br>
事务的配置、创建和使用
事务的配置
事务工厂TransactionFactory
事务工厂的创建
事务工厂Transaction定义了创建Transaction的两个方法:<br>与JDBC 和MANAGED两种Transaction相对应<br>
通过指定的Connection对象创建Transaction。<br>
通过数据源DataSource来创建Transaction。<br>
<br>
事务Transaction的创建
JdbcTransaction
就是JdbcTransaction是使用的java.sql.Connection 上的commit和rollback功能,<br>JdbcTransaction只是相当于对java.sql.Connection事务处理进行了一次包装(wrapper),<br>Transaction的事务管理都是通过java.sql.Connection实现的<br>
ManagedTransaction
ManagedTransaction让容器来管理事务Transaction的整个生命周期,<br>意思就是说,使用ManagedTransaction的commit和rollback功能不会对事务有任何的影响,<br>它什么都不会做,它将事务管理的权利移交给了容器来实现。<br>