mybatis查看流程:
1-3是项目启动时进行初始化的过程。4是我们进行查询时真正的执行过程。
1 全局配置文件加载:
1.SqlSessionFactoryBuilder创建SqlsessionFactory时,需要传入一个Configuration 对象。2.XMLConfigBuilder对象会去实例化Configuration。
3.XMLConfigBuilder对象会去初始化Configuration对象。
通过XPathParser去解析全局配置文件,形成Document对象
通过XPathParser去获取指定节点的XNode对象。
解析Xnode对象的信息,然后封装到Configuration对象中
2 加载映射文件:
就是把如userMapper.xml中的各种标签(如:resultMap,ParameterMap,select,insert等)进行解析封装。 方法为:XMLConfigBuilder#mapperElement(root.evalNode(“mappers”));
//构造方法:专门用来解析映射文件的
XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());
//创建MappedStatement对象的,并封装到configration中
mapperParser.parse();
3 sqlSource创建:
|–XMLLanguageDriver#createSqlSource:创建SqlSource
通过对sql进行解析,
3.1 带有 ${}和动态标签的sql使用DynamicSqlSource封装;
3.2 带有#{}使用RawSqlSource(raw:未处理)封装。
3.3 最后通过结合parameterMapping(传入参数)解析封装到StaticSqlSource中。
4 sqlSession执行流程。
入口:DefaultSqlSession#selectList(),中间会通过BoundSql进行获取sql语句。BoundSql会返回处理过的sql语句
|--DefaultSqlSession#selectLIst
|--CachingExecutor#query
|--BaseExecutor#query
|--BaseExecutor#queryFromDatabase
|--SimpleExecutor#doQuery
|--Configuration#newStatementHandler:创建 StatementHandler,用来执行MappedStatement对象
|--RoutingStatementHandler#构造方法:根据路由规则,设置 不同的StatementHandler
|--SimpleExecutor#prepareStatement:主要是设置 PreparedStatement的参数
|--SimpleExecutor#getConnection:获取数据库连接
|--PreparedStatementHandler#prepare:创建 PreparedStatement对象
|--PreparedStatementHandler#parameterize:设置 PreparedStatement的参数
|--PreparedStatementHandler#query:主要是用来执行SQL语句, 及处理结果集
|--PreparedStatement#execute:调用JDBC的api执行 Statement
|--DefaultResultSetHandler#handleResultSets:处理 结果集
其中:下面两个就如同jdbc原生代码中的设置参数和处理结果集的操作。
|–PreparedStatementHandler#parameterize:设置 PreparedStatement的参数
|–DefaultResultSetHandler#handleResultSets:处理 结果集