目录

mybatis运行原理

框架分层架构

https://gitee.com/lienhui68/picStore/raw/master/null/20201010183106.png

引导层:使用mybatis框架获取SqlSessionFactory,可以使用全局配置文件也可以使用功能java api调用的方式。

框架支撑层:sql语句配置 sql映射文件

数据处理层,原生的jdbc组件

接口层:暴露给用户调用的几种方式

运行流程图

https://gitee.com/lienhui68/picStore/raw/master/null/20201010173241.png

Executor执行器

ParameterHandler 参数处理器

ResultSetHandler 结果集处理器

StatementHandler sql语句处理器

第一步 获取SqlSessionFactory对象

解析文件的每一个信息保存在Configuration中,返回包含Configuration的DefaultSqlSessionFactory。

注意:MappedStatement 代表一个增删改查的详细信息,时序图如下:

https://gitee.com/lienhui68/picStore/raw/master/null/20201011114908.png

XPathParser 基于dom4j xpath解析的工具,使用这个解析器解析xml

整个初始化工作都是在往configuration里保存东西

第二步 获取SqlSession对象

返回一个DefaultSqlSession对象,包含Executor和Configuration。

https://gitee.com/lienhui68/picStore/raw/master/null/20201011120542.png

如果有开启二级缓存配置,则会使用装饰者模式创建CachingExecutor(executor)。

使用每一个拦截器插件重新包装executor

第三步 获取接口的代理对象(MapperProxy)

getMapper,使用MapperProxyFactory创建一个MapperProxy的代理对象

代理对象里面包含了,DefaultSqlSession(Executor)

https://gitee.com/lienhui68/picStore/raw/master/null/20201011121509.png

第四步 执行增删改查方法

时序图

https://gitee.com/lienhui68/picStore/raw/master/null/20201011125118.png

查询流程总结

https://gitee.com/lienhui68/picStore/raw/master/null/20201011125139.png

  • StatementHandler:处理sql语句预编译,设置参数等相关工作;
  • ParameterHandler:设置预编译参数用的
  • ResultHandler:处理结果集
  • TypeHandler:在整个过程中,进行数据库类型和javaBean类型的映射

总结

mybatis运行步骤

  1. 根据配置文件(全局,sql映射)初始化出Configuration对象
  2. 创建一个DefaultSqlSession对象,它里面包含Configuration以及Executor(根据全局配置文件中的defaultExecutorType创建出对应的Executor)
  3. DefaultSqlSession.getMapper():拿到Mapper接口对应的MapperProxy;MapperProxy里面有(DefaultSqlSession);
  4. 执行增删改查方法:
    1. 调用DefaultSqlSession的增删改查(Executor);
    2. 会创建一个StatementHandler对象。同时也会创建出ParameterHandler和ResultSetHandler)
    3. 调用StatementHandler预编译参数以及设置参数值,使用ParameterHandler来给sql设置参数
    4. 调用StatementHandler的增删改查方法;
    5. ResultSetHandler封装结果

注意

四大对象(Executor、ParameterHandler、ResultSetHandler)每个创建的时候都有一个interceptorChain.pluginAll(parameterHandler);