首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

ibatis源码学习1_通体设计和核心流程

2012-08-08 
ibatis源码学习1_整体设计和核心流程转自http://www.iteye.com/topic/1121467?本文主要从ibatis框架的基本

ibatis源码学习1_整体设计和核心流程

转自http://www.iteye.com/topic/1121467

?

本文主要从ibatis框架的基本代码骨架进行切入,理解ibatis框架的整体设计思路,各组件的实现细节将在后文进行分析。

背景
介绍ibatis实现之前,先来看一段jdbc代码:




    2. SqlMapTransactionManager
    该接口是对事务行为的抽象,提供了事务执行过程中的涉及的所有方法。
    ibatis源码学习1_通体设计和核心流程

    3. SqlMapClient
    该接口定位是SQL执行客户端,是线程安全的,用于处理多个线程的sql执行。它继承了上面两个接口,这意味着该接口具有SQL执行、批处理和事务处理的能力,如果你拥有该接口的实现类,意味着执行任何SQL语句对你来说是小菜一碟。该接口的核心实现类是SqlMapClientImpl。

    4. SqlMapSession
    该接口在继承关系上和SqlMapClient一致,但它的定位是保存单线程sql执行过程的session信息。该接口的核心实现类是SqlMapSessionImpl。

    5. MappedStatement
    该接口定位是单条SQL执行时的上下文环境信息,如SQL标识、SQL、参数信息、返回结果、操作行为等。

    6. ParameterMap/ResultMap
    该接口用于在SQL执行的前后提供参数准备和执行结果集的处理。

    以上接口的类图关系如下(部分):
    ibatis源码学习1_通体设计和核心流程

    这里必须要强调SqlMapExecutorDelegate这个类,他是一个执行代理类,在ibatis框架中地位非常重要,因为他耦合了用户端的操作行为和执行环境,他持有执行操作的所需要的所有数据,同时管理着执行操作依赖的环境。

    初始化过程
    1. 读取和解析sqlmap配置文件。
    2. 注册Statement对象。
    3. 创建SqlMapClientImpl对象。

    下面是一个Spring中sqlMapClient的bean配置:

                          public?void?executeQuery(RequestScope?request,?Connection?conn,?String?sql,?Object[]?parameters,?int?skipResults,?int?maxResults,?RowHandlerCallback?callback)?throws?SQLException?{????...????PreparedStatement?ps?=?null;????ResultSet?rs?=?null;????setupResultObjectFactory(request);????try?{??????errorContext.setMoreInfo("Check?the?SQL?Statement?(preparation?failed).");??????Integer?rsType?=?request.getStatement().getResultSetType();??????//初始化PreparedStatement,设置sql、参数值等??????if?(rsType?!=?null)?{????????ps?=?prepareStatement(request.getSession(),?conn,?sql,?rsType);??????}?else?{????????ps?=?prepareStatement(request.getSession(),?conn,?sql);??????}??????setStatementTimeout(request.getStatement(),?ps);??????Integer?fetchSize?=?request.getStatement().getFetchSize();??????if?(fetchSize?!=?null)?{????????ps.setFetchSize(fetchSize.intValue());??????}??????errorContext.setMoreInfo("Check?the?parameters?(set?parameters?failed).");??????request.getParameterMap().setParameters(request,?ps,?parameters);??????errorContext.setMoreInfo("Check?the?statement?(query?failed).");??????ps.execute();?//执行??????errorContext.setMoreInfo("Check?the?results?(failed?to?retrieve?results).");????????//?ResultSet处理??????rs?=?handleMultipleResults(ps,?request,?skipResults,?maxResults,?callback);????}?finally?{??????try?{????????closeResultSet(rs);??????}?finally?{????????closeStatement(request.getSession(),?ps);??????}????}????}??


                        上面这段代码大家会非常熟悉,和本文开始处的代码很相似,ibatis归根到底,是对JDBC操作一定程度上的封装而已。

                        下面在总体上概括sql的一般执行过程:
                        SqlMapClientImpl接到请求后,创建SqlMapSessionImpl对象(ThreadLocal,保证线程安全),SqlMapSessionImpl交由内部的代理类SqlMapExecutorDelegate执行,代理类获取相应的MappedStatement,交由MappedStatement对象执行,MappedStatement交由SqlExecutor执行,最终使用JDBC方式执行sql。

                        小结
                        ibatis源码规模较小,整体设计思路清晰,阅读ibatis源码可以按以下思路进行:
                        1. 了解ibatis框架的整体目标,用于解决哪些问题。
                        2. ibatis如何解决这些问题,带着问题去学习。
                        3. 了解ibatis框架的核心接口和整体设计思路。
                        4. 抓住ibatis核心流程: 初始化和请求处理流程。
                        5. 详细ibatis框架的关键细节实现,如ibatis中的配置文件解析,参数和结果映射等。

热点排行