MyBatis 源码分析(一)- 整体架构

总结 MyBatis 源码各 package 及其功能

Posted by songjunhao on January 28, 2020

1.MyBatis 整体架构

MyBatis 整体架构 分为三层

  • 1.接口层
  • 2.核心处理层
  • 3.基础支持层

MyBatis 架构如上图所示,从客户端调用开始算以及内部调用顺序,在此我们将其分为三层,,第一层为给咱们客户端使用的 类似对外服务接口 的 接口层。第二层是 MyBatis 的核心功能 供 SqlSession 调用。第三层是 基础支持层,提供一些底层工具,供第二层调用。

2.模块概述

2.1 接口层

package : org.apache.ibatis.session

MyBatis 的代码很规范,所有包下都有 package-info.java 文件,描述当前 package 的功能。

查看源码中 org/apache/ibatis/session/package-info.java 文件

h2HGEom8CIaNrfR

描述很简单,基础包。包含SqlSession。如package-info文件中所说 接口层的核心是 SqlSession 接口,该接口中定义了 MyBatis 暴露给应用程序调用的 API,也就是上层应用与 MyBatis 交互的桥梁。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作。

2.2 核心处理层

核心处理层包含初始化以及数据库交互的所有核心功能

2.2.1 配置解析

package :

  • org.apache.ibatis.builder
  • org.apache.ibatis.mapping

builder 用于 配置解析过程。mapping 用于将SQL相应的操作解析为相应的对象。

2.2.2 SQL解析

package : org.apache.ibatis.scripting

MyBatis 中的 scripting 模块,用于解析 if 、 where 等动态SQL。

2.2.3 SQL 执行

package :

  • org.apache.ibatis.executor
  • org.apache.ibatis.cursor

executor 是 执行SQL 的 执行器。 cursor 是对返回结果 的处理。

2.2.4 插件模块

package : org.apache.ibatis.plugin

MyBatis 提供了插件接口,我们可以通过添加用户自定义插件的方式对 MyBatis 进行扩展,例如,我们可以在记录SQL执行时间记录到数据库 用于监控运维 或者 sql执行过程中拿到具体执行的sql 美化并打印到日志中方便调试。

2.3 基础支持层

基础支持层,包含整个 MyBatis 的基础模块,这些模块为核心处理层的功能提供了良好的支撑。

2.3.1 反射模块

package : org.apache.ibatis.reflection

MyBatis 中专门提供了反射模块,该模块对 Java 原生的反射进行了良好的封装,提了更加简洁易用的 API,方便上层使调用,并且对反射操作进行了一系列优化,例如缓存了类的元数据,提高了反射操作的性能。

2.3.2 类型模块

package : org.apache.ibatis.type

用于转换 数据库中表字段的类型及其对应的Java类型。

SQL 语句绑定实参时,需要将数据由 Java 类型转换成 JDBC 类型。 映射结果集时,需要将数据由 JDBC 类型转换成 Java 类型。

2.3.3 日志模块

package : org.apache.ibatis.logging

用于 集成第三方日志框架。

2.3.4 IO模块

package : org.apache.ibatis.io

资源加载模块,主要是对类加载器进行封装,确定类加载器的使用顺序,并提供了加载类文件以及其他资源文件的功能 。

2.3.5 解析器模块

package : org.apache.ibatis.datasource

Mybatis 本身自带的数据源实现以及与第三方数据源集成的接口。

2.3.6 数据源模块

package : org.apache.ibatis.datasource

Mybatis 本身自带的数据源实现以及与第三方数据源集成的接口。

2.3.7 事务模块

package : org.apache.ibatis.transaction

MyBatis 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。

2.3.8 缓存模块

package : org.apache.ibatis.cache

MyBatis 一级缓存和二级缓存 的具体实现。

2.3.9 Binding模块

package : org.apache.ibatis.binding

MyBatis 通过 Binding 模块,将自定义的 Mapper 接口与映射配置文件关联绑定。

2.3.10 注解模块

package : org.apache.ibatis.annotations

存放 Mybatis 自定义的注解,例如,@Select,@Mapper 等。

2.3.11 异常模块

package : org.apache.ibatis.exceptions

定义 MyBatis 专有的异常。以及异常信息生成工具。

3.总结

本文总结了 MyBatis 整体架构以及其相应模块的功能以及所属包,总体对MyBatis的源码有个大概的了解,后续将按功能模块 具体分析学习 其核心源码~