执行sql总览
首先还是来看下目前剖析的代码所处的地位,具体的代码如下:
之前也说过要应用mybatis操作数据库,在代码外面与mybatis相干的代码只须要三步:创立SqlSessionFactory对象,利用SqlSessionFactory对象创立SqlSession,最初利用SqlSession执行sql。到目前为止曾经剖析到最初一步,接下来详细分析sql是如果失去并执行的。
SqlSession执行局部
上图能够看到即便调用的selectOne办法还是依赖的是selectList办法,而后依据查问后果的数量来判断,如果超过一条则间接抛出异样。我通过在sql中加1=1 or测试的确是可能查出所有的数据而后报错。
这里实际上是我感觉不太好的实现,如果程序员不小心写错了sql在某种状况下能够查出多条甚至是全表,可能在测试环境没有测进去,而在线上环境呈现,那么将是对数据库和程序都是劫难,当然这种状况呈现的可能性特地小。而mybatis没有思考这种状况不晓得是不是因为是我了解不到位。
接下来看DefaultSqlSession的selectList办法,DefaultSqlSession重载了三个selectList办法,最终都会调用参数最全的那个办法。这个办法只有两个要害步奏:首先通过参数statement从全局配置configuration获取到对应的MappedStatement对象,而后应用失去的对象和参数parameter调用executor的query办法。其中参数statement就是最开始传递的参数“com.itlezhi.mybatis.mapper.MemberMapper.getById”,parameter对应参数5。
通过这个办法应该可能彻底分明全局配置configuration的属性Map<String, MappedStatement> mappedStatements中key对应的是什么货色了。
executor的query办法
执行器executor上一篇文章有剖析,默认是SimpleExecutor这个类,其中蕴含有全局配置configuration和事务Transaction,而事务Transaction中有从configuration中失去的DataSource,而DataSource中蕴含有数据库的连贯信息。他封装了一些数据库查问。不过下面说到的query办法属于根底办法,在BaseExecutor类中代码如下图:
最终还是来到SimpleExecutor这个类中,具体代码如下图:
外面的代码还是比较简单的,旁边我还写了一个间接应用jdbc查问的demo进行比拟,能够看到主流程曾经差不多统一,不同的点在于获取connection和对后果的解决。
获取connection是通过BaseExecutor的getConnection办法实现,实际上是调用的属性transaction实现,而transaction是通过属性dataSource来实现,这些都在上一篇文章中。
另外一个不同点就是对后果的封装,这个前面细说,这两个不同点也是应用mybatis的劣势之一。
总结
明天剖析的sql执行过程能够说是只从宏观下面进行了剖析,具体的实现细节并没有仔细分析,比方sql是如何失去的,参数如何设置的,后果又是如何封装了,能够说这些细节才是真正mybatis对应jdbc的劣势所在。不过先分梳理分明了主流程,接下来再来剖析具体的流程。
参考: 《2020最新Java根底精讲视频教程和学习路线!》
链接:https://juejin.cn/post/691225...