Mybatis的执行流程,写的也太全了吧!(中)

简介: Mybatis的执行流程,写的也太全了吧!

事实上如果我们通过接口的方式来编程的话,最后来getStatement的时候,都是根据全限定名来取的,所以即使有重名对我们也没有影响,而之所以要这么做的原因其实还是为了兼容早期版本的用法,那就是不通过接口,而是直接通过方法名的方式来进行查询

session.selectList("com.lonelyWolf.mybatis.mapper.UserMapper.listAllUser");

这里如果shortName没有重复的话,是可以直接通过简写来查询的:

session.selectList("listAllUser");

但是通过简写来查询一旦shortName重复了就会抛出以下异常:

image.png

这里的异常其实就是StrickMap的get方法抛出来的:

image.png

sql执行流程分析

上面我们讲到了,获取到的Mapper接口实际上被包装成为了代理对象,所以我们执行查询语句肯定是执行的代理对象方法,接下来我们就以Mapper接口的代理对象MapperProxy来分析一下查询流程。

整个sql执行流程可以分为两大步骤:

  • 一、寻找sql
  • 二、执行sql语句

寻找sql

首先还是来看一下寻找sql语句的时序图:

image.png

1、了解代理模式的应该都知道,调用被代理对象的方法之后实际上执行的就是代理对象的invoke方法

image.png

2、因为我们这里并没有调用Object类中的方法,所以肯定走的else。else中会继续调用MapperProxy内部类MapperMethodInvoker中的方法cachedInvoker,这里面会有一个判断,判断一下我们是不是default方法,因为Jdk1.8中接口中可以新增default方法,而default方法是并不是一个抽象方法,所以也需要特殊处理(刚开始会从缓存里面取,缓存相关知识我们这里先不讲,后面会单独写一篇来分析一下缓存))。

image.png

3、接下来,是构造一个MapperMethod对象,这个对象封装了Mapper接口中对应的方法信息以及对应的sql语句信息:

image.png

这里面就会把要执行的sql语句,请求参数,方法返回值全部解析封装成MapperMethod对象,然后后面就可以开始准备执行sql语句了

执行sql语句

还是先来看一下执行Sql语句的时序图:

image.png

1、我们继续上面的流程进入execute方法:

image.png

2、这里面会根据语句类型以及返回值类型来决定如何执行,本人这里返回的是一个集合,故而我们进入executeForMany方法:

image.png

3、这里面首先会将前面存好的参数进行一次转换,然后绕了这么一圈,回到了起点SqlSession对象,继续调用selectList方法:

image.png

3、接下来又讲流程委派给了Execute去执行query方法,最终又会去调用queryFromDatabase方法:

image.png

4、到这里之后,终于要进入正题了,一般带了这种do开头的方法就是真正做事的,Spring中很多地方也是采用的这种命名方式:

image.png

注意,前面我们的sql语句还是占位符的方式,并没有将参数设置进去,所以这里在return上面一行调用prepareStatement方法创建Statement对象的时候会去设置参数,替换占位符。参数如何设置我们先跳过,等把流程执行完了我们在单独分析参数映射和结果集映射。

5、继续进入PreparedStatementHandler对象的query方法,可以看到,这一步就是调用了jdbc操作对象PreparedStatement中的execute方法,最后一步就是转换结果集然后返回。

image.png

到这里,整个SQL语句执行流程分析就结束了,中途有一些参数的存储以及转换并没有深入进去,因为参数的转换并不是核心,只要清楚整个数据的流转流程,我们自己也可以有自己的实现方式,只要存起来最后我们能重新解析读出来就行。

目录
相关文章
|
12月前
|
SQL XML Java
MyBatis的动态SQL执行流程
MyBatis的动态SQL执行流程
137 0
|
2月前
|
Java 关系型数据库 数据库连接
MyBatis 执行流程分析
MyBatis 执行流程分析
28 2
|
9月前
|
Java 关系型数据库 数据库连接
MyBatis 执行流程分析
MyBatis 执行流程分析
|
12月前
|
SQL 存储 缓存
二.吃透Mybatis源码-Mybatis执行流程
上一篇文章我们分析了一下Mybatis的初始化流程,跟踪了一下Mybatis的配置解析过程,SqlSessionFactory和SqlSession的创建过程,这篇文章我们来分析一下SqlSession的执行流程
|
11月前
|
SQL XML 缓存
mybatis执行流程
mybatis执行流程
91 0
|
2月前
|
SQL 缓存 Java
MyBatis Plus插件机制与执行流程原理分析
MyBatis Plus插件机制与执行流程原理分析
261 0
|
11月前
|
SQL XML Java
MyBatis -- 执行流程
MyBatis的执行流程可以概括为: 读取核心配置文件 - 创建会话工厂 - 创建会话 - 将Mapper接口和Mapper映射文件做映射,获取Mapper实例对象 - 执行Mapper对象方法
96 0
|
12月前
|
SQL 缓存 Java
MyBatis执行流程
MyBatis执行流程
44 0
|
SQL XML 缓存
【MyBatis系列3】MyBatis SQL执行流程(一)
在《【MyBatis系列1】基础知识(上)》中,我们讲解了MyBaits的工作原理,以及它的四大核心组件的使用姿势,包括SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession和SQL Mapper。在《【MyBatis系列1】基础知识(下)》中,通过完整的MayBatis使用示例,详细讲解了MyBatis的XML配置文件。
218 0
【MyBatis系列3】MyBatis SQL执行流程(一)
|
SQL XML 存储
Mybatis源码剖析之Mybatis执行流程(传统方式)
Mybatis在设计上,分为三层:接口层,数据处理层,框架支持层 在接口层中,分为 传统模式:通过sqlSession + statementId。 接口代理模式:sqlSession+mapper接口
116 0
Mybatis源码剖析之Mybatis执行流程(传统方式)