Mybatis的SqlSession执行sql过程

上一篇分析了SqlSession的创建过程,接下来就来到最后一步执行sql的过程了。

执行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的优势所在。不过先分梳理清楚了主流程,接下来再来分析具体的流程。

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

(0)

相关推荐

  • MyBatis执行SQL的两种方式

    本节主要介绍 MyBatis 执行 SQL 语句的两种方式和它们的区别. MyBatis 有两种执行 SQL 语句的方式,如下: 1.通过 SqlSession 发送 SQL 2.通过 SqlSess ...

  • 阿里面试:Mybatis中方法和SQL是怎么关联起来的呢?

    回复"面试"获取全套面试资料 本文:3126字 | 阅读时长:4分10秒 今天是Mybatis源码分析第四篇,也是最后一篇. 老规矩,先上案例代码: public class My ...

  • 图解MyBatis

    回复"面试"获取全套面试资料 在以前文章中,我们对Mybatis进行了入门级的介绍教小师妹快速入门Mybatis,看这篇就够了,今天我们来从一个全局的角度看看Mybatis. 本文 ...

  • 02:MyBatisCRDU及配置解析

    一:select select标签是mybatis中最常用的标签之一 select语句有很多属性可以详细配置每一条SQL语句 resultTypeSQL:语句返回值类型.[完整的类名或者别名] par ...

  • 一周学完MyBatis源码,万字总结

    回复"000"获取优质面试资料 大家好,我是老田. 之前,我给大家分享给很多MyBatis源码分析的一系列文章.今天,就自己的感受来做一个整体的总结. 众所周知,MyBatis是对 ...

  • Mybatis 动态执行SQL语句

    有很多的接口都只是执行个SQL查询之后就直接返回给前端,那么我们能不能把这些SQL保存在数据库中,调用一个固定的接口就能根据传参查询出想要的数据呢?或者当为了加减个字段就得修改代码重启服务的痛苦能不能 ...

  • Mybatis的SqlSession创建过程详解

    前面mybatis的初始化过程分析完成,接下来是第二步SqlSession的创建. 创建过程总览 SqlSession创建过程如下图: 创建过程还是比较简单的,首先是之前分析的SqlSessionFa ...

  • EF 学习系列三 数据操作数据加载及EF中执行Sql

    EF 学习系列三 数据操作数据加载及EF中执行Sql

  • 用Python执行SQL、Excel常见任务?10个方法全搞定!

    数据从业者有许多工具可用于分割数据.有些人使用 Excel,有些人使用SQL,有些人使用Python.对于某些任务,使用 Python 的优点是显而易见的.以更快的速度处理更大的数据集.使用基于 Py ...

  • 李子清:团队领导在执行的过程中,那些词语不能讲?

    在古时候,那些有能量的词语被称作:咒语!而领导者的核心工作之一就是给员工传递能量! 那么我们应该给员工传递正能量,还是负能量呢? 哈哈,有些词语是具有负能量的或者微能力的,那么如何替换呢? 激发执行力 ...

  • Mybatis 开启控制台打印sql语句

    springboot mybatis整合过程中,开启控制台sql语句打印的多种方式: 附:mybatis官方文档 方法一: 1.在mybatis的配置文件中添加: <settings> & ...

  • 不要苛求完美计划,所有的计划都是在执行的过程中逐步完善的

    没有完美的计划,计划都是在行动执行的过程中,逐步完善的. 晚上在给团队核心层开会的时候,了解到一个很大的共性的情况,就是对制定计划的误导.就是有些核心层,总是想着制定一个完美的计划,为制定计划煞费苦心 ...

  • 10个方法:用Python执行SQL、Excel常见任务

    数据从业者有许多工具可用于分割数据.有些人使用 Excel,有些人使用SQL,有些人使用Python.对于某些任务,使用 Python 的优点是显而易见的.以更快的速度处理更大的数据集.使用基于 Py ...