MyBatis源码分析篇---session.selectOne(statement,param)的源码实现

源起

我们已经分析过了会话工厂类实例SqlSessionFactory ,以及初始化配置文件加载的源码;没看过的童鞋,可以点下面传送门查看:

SqlSessionFactory会话工厂

初始化文件解析

这一篇我们来分析一下SQL执行流程。

1、创建会话&操作数据库

  • 通过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,创建StatementHandlerParameterHandlerResultHandler;创建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)
    
  • 如若有遗漏部分,还请指正。

公众号推荐

微信公众号:从demo到折腾源码
微信号:albert_ztym
从demo到手撕源码

下期预告

  • org.apache.ibatis.session.SqlSession#getMapper的源码分析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值