整体架构

整体架构

基础支持层

反射、类型、日志、io、解析器、数据源、事务、缓存、Binding、注解、异常

以后细看

核心处理层

配置解析

mybatis-config.xml 解析~
Mapper.xml 配置文件解析~

SQL解析

~

SQL执行

~

插件、

接口层

SqlSession 接口~


MyBatis 编程步骤

  1. 创建 SqlSessionFactory 对象。
  2. 通过 SqlSessionFactory 获取 SqlSession 对象。
  3. 通过 SqlSession 获得 Mapper 代理对象。
  4. 通过 Mapper 代理对象,执行数据库操作。
  5. 执行成功,则使用 SqlSession 提交事务。
  6. 执行失败,则使用 SqlSession 回滚事务。
  7. 最终,关闭会话。

动态sql其执行原理为,使用 OGNL 的表达式,从 SQL 参数对象中计算表达式的值,根据表达式的值动态拼接 SQL ,以此来完成动态 SQL 的功能。

Mapper 接口的实现类,通过 MyBatis 使用 JDK Proxy 自动生成其代理对象 Proxy ,而代理对象 Proxy 会拦截接口方法,从而“调用”对应的 MappedStatement 方法,最终执行 SQL ,返回执行结果

流程

Mapper 接口里的方法,是不能重载的,因为是全限名 + 方法名的保存和寻找策略。

Mybatis 有四种 Executor 执行器,分别是 SimpleExecutor、ReuseExecutor、BatchExecutor、CachingExecutor 。

  • SimpleExecutor :每执行一次 update 或 select 操作,就创建一个 Statement 对象,用完立刻关闭 Statement 对象。
  • ReuseExecutor :执行 update 或 select 操作,以 SQL 作为key 查找缓存的 Statement 对象,存在就使用,不存在就创建;用完后,不关闭 Statement 对象,而是放置于缓存 Map<String, Statement> 内,供下一次使用。简言之,就是重复使用 Statement 对象。
  • BatchExecutor :执行 update 操作(没有 select 操作,因为 JDBC 批处理不支持 select 操作),将所有 SQL 都添加到批处理中(通过 addBatch 方法),等待统一执行(使用 executeBatch 方法)。它缓存了多个 Statement 对象,每个 Statement 对象都是调用 addBatch 方法完毕后,等待一次执行 executeBatch 批处理。实际上,整个过程与 JDBC 批处理是相同
  • CachingExecutor :在上述的三个执行器之上,增加二级缓存的功能。

在 Mybatis 配置文件中,可以配置 <setting name="lazyLoadingEnabled" value="true" /> 来启用延迟加载的功能。默认情况下,延迟加载的功能是关闭的。

编写一个 MyBatis 插件的步骤如下:

  1. 首先,实现 Mybatis 的 Interceptor 接口,并实现 #intercept(...) 方法。
  2. 然后,在给插件编写注解,指定要拦截哪一个接口的哪些方法即可
  3. 最后,在配置文件中配置你编写的插件。

Mybatis 的 XML 映射文件和 Mybatis 内部数据结构之间的映射关系

Mybatis 将所有 XML 配置信息都封装到 All-In-One 重量级对象Configuration内部