我们已经分析过了会话工厂类实例 SqlSessionFactory
,以及初始化配置文件加载的源码;没看过的童鞋,可以点下面传送门查看:
SqlSessionFactory会话工厂
初始化文件加载分析
这一篇我们来分析一下 SQL
执行流程。
sqlMapper.openSession()
获取一个可操作数据的“工具” SqlSession
,其中 sqlMapper
则指的是会话工厂 SqlSessionFactory
; 1.1、 session.selectOne(statement,param)
接下来,我们调用 session.selectOne
方法,由此我们开始源码旅途;
方法全路径: org.apache.ibatis.session.defaults.DefaultSqlSession#selectOne(java.lang.String, java.lang.Object)
statementId
获取到一个 MappedStatement
,看过初始化篇的童鞋,应该一下就能反应过来,这个 MappedStatement
是在初始化解析的过程中初始化保存的,该对象中包含了 SQL
执行需要的所有信息: MappedStatement
之后,调用执行器执行 SQL
; org.apache.ibatis.session.SqlSessionTest#shouldSelectOneAuthor
,如下图: Excutor
使用的是责任链模式,(设计模式相关的信息会在后面的博文中详细说明) 1.2、 CachingExecutor#query
通过上图我们可以直观的看出,这里调用执行器执行 SQL
的时候,首先调用的是缓存执行器中的 query
方法;
方法全路径: org.apache.ibatis.executor.CachingExecutor#query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql)
CachingExecutor#query
方法之后调用的是 BaseExcutor#query
方法,之后的调用过程,可参考下图 BaseEexcutor
处理一级缓存,获取 BoundSql
等操作; SimpleExecutor
获取到 Configuration
,创建 StatementHandler
、 ParameterHandler
、 ResultHandler
;创建 Connection
,调用 handler.parameterize(stmt)
处理参数; PreparedStatementHandler
预编译 SQL
,调用 ps.execute();
执行 SQL
; DefaultResultSetHandler
处理结果集,最终返回数据。 至此我们就完成了 SqlSessionFactory
的创建, SqlSession
的获取,以及 session.selectOne(statement,param)
的全部执行流程。
下篇我们将着重分享一下我们经常使用的方式操作数据库 org.apache.ibatis.session.SqlSession#getMapper
;
下属方法疏通同归,我们就不一一分享了;
org.apache.ibatis.session.SqlSession#selectOne(java.lang.String) org.apache.ibatis.session.SqlSession#selectOne(java.lang.String, java.lang.Object) org.apache.ibatis.session.SqlSession#selectList(java.lang.String) org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object) org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds) //上面的5个方法最终间接或直接的都会调用到,之后的源码执行流程同上图 org.apache.ibatis.session.defaults.DefaultSqlSession#selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds) 复制代码
如若有遗漏部分,还请指正。