一、MyBatis的运行流程
1、获取SqlSessionFactory对象
根据配置文件创建SqlSessionFactory对象,解析全局配置文件和sql映射文件。最后创建的对象包含了一个Configuration,其中Configuration封装了所有配置文件的详细信息。
总结来说就是,把配置文件的信息解析并保存在Configuration对象中,返回包含了Configuration的DefaultSqlSession对象。
详细过程可看图1所示的时序图:

图1:创建SqlSessionFactory的时序图
在
Configuration对象中有MappedStatement,MappedStatement代表一个增删改查的详细信息。
2、获取SqlSession对象
会返回DefaultSqlSession对象,其是SqlSession的实现类。DefaultSqlSession对象包含了Executor和Configuration对象,Executor对象会在这一步被创建。
详细过程可看图2所示的时序图:

图2:获取SqlSession对象的时序图
3、获取接口的代理对象
使用MapperProxyFactory创建一个MapperProxy代理对象。返回的接口代理对象包含了SqlSession对象。
详细过程可看图3所示的时序图:

图3:获取接口代理对象的时序图
4、执行增删改查

图4:执行增删改查时的时序图
对于产生的几个对象的作用:
-
StatementHandler:处理sql语句预编译,设置参数等相关工作。 -
ParameterHandler:设置预编译参数用的。 -
ResultHandler:处理结果集。 -
TypeHandler:在整个过程中,进行数据库类型和JavaBean类型的映射。
执行增删改查流程总结如下:

图5:执行增删改查流程总结
二、总结
- 根据配置文件(全局配置文件和sql映射文件)初始化出
Configuration对象 - 创建一个
DefaultSqlSession对象,里面包含了Configuration及其Executor(根据全局配置文件中的defaultExecutorType创建出对应的Executor) -
DefaultSqlSession.getMapper()拿到Mapper接口对应的MapperProxy对象。 -
MapperProxy里面有(DefaultSqlSession)。 - 执行增删改查方法
(1)调用DefaultSqlSession的增删改查(Executor)
(2)创建一个StatementHandler对象,同时也会创建出ParameterHandler和ResultSetHandler。
(3)调用StatementHandler预编译参数以及设置参数值,使用ParameterHandler来给sql设置参数。
(4)调用StatementHandler的增删改查方法。
(5)ResultSetHandler封装结果。 - 注意:四大对象创建的时候都有一个
interceptorChain.pluginAll(parameterHandler),后续的插件开发就是用的其原理。