mybatis 主流程时序图(一)

以下是生成SqlSession的调用链:

 

SqlSessionManager的类
    field:
        sqlSessionFactory:sqlSession工厂类
        sqlSessionProxy:sqlSession代理类
        localSqlSession:线程变量

    method:
        newInstance(...) :实例化SqlSessionManager,构造函数私有化
        startManagedSession(...):将sqlSession存入线程变量中
        openSession(...):创建sqlSession
        select/update/delete/insert:使用sqlSessionProxy执行
        getConnection/clearCache/commit/rollback/close:localSqlSession.get()获取的sqlSession执行

    SqlSessionInterceptor:创建sqlSessionProxy的InvocationHandler;
                                         当localSqlSession.get()有值时,执行invoke方法;
                                         反之,调用openSession方法,并主动执行commit方法;
SqlSessionFactory的类
    field:
        configuration:sqlSessionFactoryBuilder中将xml进行解析获取到到Configuration对象

    method:
        openSession(...):创建SqlSession所需要的参数
            execType: 执行器的类型(SIMPLE, REUSE, BATCH),通过调用方传入 or 配置类中获取
            TransactionIsolationLevel: 事务隔离级别
            autoCommit:是否自动提交
            connection:数据库连接
        
        openSessionFromDataSource:
        openSessionFromConnection:
                1.通过配置文件中获取Environment,以获取TransactionFactory;
                2.TransactionFactory获取事务可通过两种方式,
                    connection:数据库连接
                    (dataSource、level、autoCommit):数据源/事务隔离级别/自动提交
                    通过以上两种方式创建事务,其实事务其实就是建立在connection基础上的,第二种方式是通过                                                      
                    dataSource创建connection,然后设置connection的隔离级别和自动提交标记
                3.通过execType和Transaction创建Executor执行器
                4.通过executor、configuration、autoCommit构造SqlSession对象
       
SqlSession类
    field:
        configuration:配置对象
        executor:执行器
        autoCommit:是否自动提交

    method:
        selectList/selectOne/selectMap:调用executor.query(...),默认Executor.NO_RESULT_HANDLER
        select:调用executor.query(...),传入的ResultHandler;
        insert/update/delete:调用executor.update方法
        commit:executor.commit
        rollback:executor.rollback
        flushStatements:executor.flushStatements
        close:executor.close
        closeCursors:executor.closeCursors
SimpleExecutor:
    field:
        transaction:事务
        configuration:配置对象

    method:
        doQuery:
        doUpdate:
        doQueryCursor:
                1.通过MappedStatement获取configuration
                2.创建StatementHandler
                3.调用prepareStatement方法
                4.调用StatementHandler.query/update/queryCursor方法
        prepareStatement:
                1.获取connnection;
                2.调用StatementHandler.prepare初始化prepareStatement对象并返回
                3.调用StatementHandler.parameterize填充占位符
StatementHandler类
    field:
        parameterHandler:参数处理器
        resultSetHandler:返回值处理器

    method:
        update/batch/query/queryCursor:调用Statement.execute方法
        instantiateStatement:初始化Statement
        parameterize:填充占位符值

以上是调用链涉及到的类属性和方法;后续会针对调用链中的每个流程进行分析;