今天通过一个demo, 来了解一下mybatis的SQL执行流程
-
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构建