mybatis的SQL执行流程

379 阅读1分钟

今天通过一个demo, 来了解一下mybatis的SQL执行流程

  1. Configuration构建

第一步,通过资源加载模块加载配置文件,解析器模块解析XML文件,生成Configuration对象。详见源码:org.apache.ibatis.builder.xml.XMLConfigBuilder#parse

Configuration 对象中缓存了 mybatis-config.xml 配置文件以及映射配置文件的所有内容。

 2. SqlSession构建

通过 SqlSessionFactory 创建 SqlSession,SqlSession 是 MyBatis 暴露给外部使用的统一接口层。参见源码:org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSessionFromDataSource

3. MapperProxy

通过 SqlSession 获得 Mapper 对象

  • Mapper 的真实对象是 MapperProxy;
  • MapperProxy 继承 InvocationHandler,实现 invoke 方法;
  • MapperProxyFactory 的 newInstance 方法,通过 JDK 动态代理的方式创建了一个 MapperProxy 的代理类;

MyBatis 的 Mapper 是通过动态代理实现的,调用 Mapper 的任何方法都会执行 MapperProxy 的 invoke 方法。

4. 具体Mapper方法执行

参见源码:org.apache.ibatis.binding.MapperProxy#invoke

参见源码:org.apache.ibatis.binding.MapperMethod#execute

通过上面的分析,简单总结一下,我们可以抽象出 MyBatis 在执行一条 SQL 查询的过程中涉及到的主要类:**Configuration、SqlSession、MapperProxy、MapperMethod、**Exector

5. Exector构建