Ibatis的工作流程主要分为两个部分,配置文件解析和数据库操作,下面分别对两部分分别进行分析
[b]一.配置文件解析[/b]
[b]二.数据库操作[/b]
[b]1.先看几个重要的接口定义[/b]
SqlMapTransactionManager接口定义了数据源的获取,数据库链接的获取,事务开启,事务提交,事务结束等方法.
SqlMapExecutor接口定义了一系列的数据库操作方法,如增删改查等.
这两个接口也是最顶端,最核心的接口.
SqlMapSession接口继承了SqlMapExecutor接口和SqlMapTransactionManager接口,并定义了一个close方法,
其实现类是SqlMapSessionImpl,在SqlMapSessionImpl中有两个重要属性SqlMapExecutorDelegate和SessionScope,
且只有三个方法有意义,一是构造方法,二是close方法,三是getCurrentConnection方法,
在其构造方法中需要SqlMapClient参数,其它的事务相关的方法和数据库操作方法,则完全委托SqlMapExecutorDelegate来实现(且传递SessionScope参数).
SqlMapClient接口也继承了SqlMapExecutor接口和SqlMapTransactionManager接口,并定义了openSession等方法,
它的实现类是SqlMapClientImpl,同SqlMapSessionImpl一样有一个SqlMapExecutorDelegate属性,
并在其openSession方法中new了SqlMapSessionImpl,同时开启事务或指定数据库链接.
还有一个重要的方法getLocalSqlMapSession,在此方法中new了SqlMapSessionImpl并保存ThreadLocal中,因此是线程安全的.
而其它的和事务相关的方法及数据库操作方法则调用从getLocalSqlMapSession方法返回的SqlMapSessionImpl执行.
再来看看真正做事情的类SqlMapExecutorDelegate,在此类中,有几个重要的HashMap属性,分别保存从配置文件解析出来的sqlmap-config,
mappedStatements,resultMaps,parameterMaps,还有一个事务管理的TransactionManager和执行数据库操作的sqlExecutor,这两个属性都是在SqlMapClientImpl的构造方法中set的.
在它的数据库操作方法增删改查中,先从mappedStatements获取要执行的sql,再从SessionScope中获取并开始事务,接着调用MappedStatement的excuteXxx方法操作数据库,然后结束事务.
在MappedStatement的excuteXxx方法中,先验证参数validateParameter,然后将参数对象转换为sql参数列表parameterMap.getParameterObjectValues,再调用SqlExecutor对应的方法执行数据库操作,再将数据库操作结果转换为sqlmap对应返回对象.
[b]2.源码分析[/b]
[b]一.配置文件解析[/b]
[b]二.数据库操作[/b]
[b]1.先看几个重要的接口定义[/b]
SqlMapTransactionManager接口定义了数据源的获取,数据库链接的获取,事务开启,事务提交,事务结束等方法.
SqlMapExecutor接口定义了一系列的数据库操作方法,如增删改查等.
这两个接口也是最顶端,最核心的接口.
SqlMapSession接口继承了SqlMapExecutor接口和SqlMapTransactionManager接口,并定义了一个close方法,
其实现类是SqlMapSessionImpl,在SqlMapSessionImpl中有两个重要属性SqlMapExecutorDelegate和SessionScope,
且只有三个方法有意义,一是构造方法,二是close方法,三是getCurrentConnection方法,
在其构造方法中需要SqlMapClient参数,其它的事务相关的方法和数据库操作方法,则完全委托SqlMapExecutorDelegate来实现(且传递SessionScope参数).
SqlMapClient接口也继承了SqlMapExecutor接口和SqlMapTransactionManager接口,并定义了openSession等方法,
它的实现类是SqlMapClientImpl,同SqlMapSessionImpl一样有一个SqlMapExecutorDelegate属性,
并在其openSession方法中new了SqlMapSessionImpl,同时开启事务或指定数据库链接.
还有一个重要的方法getLocalSqlMapSession,在此方法中new了SqlMapSessionImpl并保存ThreadLocal中,因此是线程安全的.
而其它的和事务相关的方法及数据库操作方法则调用从getLocalSqlMapSession方法返回的SqlMapSessionImpl执行.
再来看看真正做事情的类SqlMapExecutorDelegate,在此类中,有几个重要的HashMap属性,分别保存从配置文件解析出来的sqlmap-config,
mappedStatements,resultMaps,parameterMaps,还有一个事务管理的TransactionManager和执行数据库操作的sqlExecutor,这两个属性都是在SqlMapClientImpl的构造方法中set的.
在它的数据库操作方法增删改查中,先从mappedStatements获取要执行的sql,再从SessionScope中获取并开始事务,接着调用MappedStatement的excuteXxx方法操作数据库,然后结束事务.
在MappedStatement的excuteXxx方法中,先验证参数validateParameter,然后将参数对象转换为sql参数列表parameterMap.getParameterObjectValues,再调用SqlExecutor对应的方法执行数据库操作,再将数据库操作结果转换为sqlmap对应返回对象.
[b]2.源码分析[/b]