mybatis 主流程時序圖(一)

mybatis經過sqlSessionManager管理器對SqlSession進行管理,SqlSession包含了與數據庫鏈接、事務和全部映射的配置信息;java

如下是生成SqlSession的調用鏈:sql

 

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:填充佔位符值

以上是調用鏈涉及到的類屬性和方法;後續會針對調用鏈中的每一個流程進行分析;數據庫

相關文章
相關標籤/搜索