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:填充佔位符值
以上是調用鏈涉及到的類屬性和方法;後續會針對調用鏈中的每一個流程進行分析;數據庫