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:填充占位符值
以上是调用链涉及到的类属性和方法;后续会针对调用链中的每一个流程进行分析;数据库