Mybatis的SQL执行流程源码剖析

Mybatis的SQL执行流程源码剖析

概述

源码就是可以被用来执行,生成机器可以识别的代码,经过开源源码,能够引用其功能。spring

重要性

一、mybatis中的sql执行,不紧要知道返回的结果是什么,还须要知道这结果是怎么来的,通过了怎样的处理,只有知道了这样的原理,碰到问题才能更好的知道问题出在那个环节。
二、能更好的扩展应用程序,能够作到代码的复用,减小开发成本和时间。
三、学习其中的设计思想可以在其余应用得已应用。sql

步骤

源码阅读,能够从测试用例着手,每一个源码,多有大师们写的测试用例,我们能够用大师们写的测试用例进行先关功能的测试,这样就能够知道其中的运行原理及一些设计思想。api

步骤1 测试用例请求

Mybatis的SQL执行流程源码剖析

步骤2 进行MapperProxy对象,MapperProxy代理是jdk动态代理,根据传入的mapper接口,动态生成代理对象,代理对象同时实现了InvocationHandler接口。

Mybatis的SQL执行流程源码剖析

Mybatis的SQL执行流程源码剖析

Mybatis的SQL执行流程源码剖析

步骤3:进行到MapperMethod类,经过构造器初始化SqlCommand静态内部类,跟配置文件的方法签名对比,是否是有对应的方法。

Mybatis的SQL执行流程源码剖析

步骤4 进行execute选择执行的Sqlsession

Mybatis的SQL执行流程源码剖析
Mybatis的SQL执行流程源码剖析

步骤5 进入DefaultSqlsession,选择执行的执行器,先选择缓存执行器,缓存没有选择默认的简单执行器,若是mybatis有配置,就选择配置的执行器,并设置预处理参数。

Mybatis的SQL执行流程源码剖析
Mybatis的SQL执行流程源码剖析

步骤6 进入申明处理对象进行查询,返回结果集

Mybatis的SQL执行流程源码剖析

流程的请求能够总结为:测试用例请求-》MapperPrxoy(invoker)-》MapperMthod(execute)-》Sqlsession(executor.query())-》SimpleExecutor(MappedStatement.doQuery())-》StatementHandler(PreparedStatementHandler)-》ResultsetHandler->返回结果集

-》结束缓存

总结

一、mybatis使用了jdk的动态代理,在程序执行的时候生成一个具体的代理对象,执行相关的逻辑,能够在代理的方法先后执行一些逻辑,不用改变原来类的逻辑,就能加强类方法的功能,在编写底层代码的时候动态代理尤为重要;
二、应用普遍好比事物的管理、spring aop的原理实现,登陆权限拦截、日志的统一输出、统计每一个 api 的请求耗时等等。
三、研究源码并非为了研究而研究,要学习其中的思想,好比动态代理、工厂模式、建造者模式,要利用这些原则来增长程序的可维护性、复用性、灵活性、可靠性。session