MyBatis 源码共 16 个模块,可以分成三层,如下图:
源码分层 - 图1

源码分层 - 图2



基础支撑层:技术组件专注于底层技术实现,通用性较强无业务含义;

基础支撑层根技术相关,但是跟业务无关的模块,不管是做什么功能,基础支撑层的东西都需要有的.这个层的东西如果你觉得好的话,你也可以直接拿出去到自己的项目里面去用.

核心处理层:业务组件专注 MyBatis 的业务流程实现,依赖于基础支撑层;

和Mybatis的业务有关了,主要支撑着Mybatis的功能.


接口层:MyBatis 对外提供的访问接口,面向 SqlSession 编程;

对外提供服务的一层,客户端只需要跟这个接口层打交道就行了. 接收到客户端的指令之后就会给执行传递到核心层,核心层开始对数据库进行增删改查操作.


(一)系统为什么要分层

1代码和系统的可维护性更高。
系统分层之后,每个层次都有自己的定位,每个层次内部的组件都有自己的分工,系统就会变得很清晰,维护起来非常明确;

2. 方便开发团队分工和开发效率的提升;
举个例子,mybatis 这么大的一个源码框架不可能是一个人开发的,他需要一个团队,团队之间肯定有分工,既然有了层次的划分,分工也会变得容易,开发人员可以专注于某一层的某一个模块的实现,专注力提升了,开发效率自然也会提升;

3. 提高系统的伸缩性和性能。
系统分层之后,我们只要把层次之间的调用接口明确了,那我们就可以从逻辑上的分层变成物理上的分层。当系统并发量吞吐量上来了,怎么办?为了提高系统伸缩性和性能,我们可以把不同的层部署在不同服务器集群上,不同的组件放在不同的机器上,用多台机器去抗压力,这就提高了系统的性能。压力大的时候扩展节点加机器,压力小的时候,压缩节点减机器,系统的伸缩性就是这么来的;

假如接口层放一个集群,核心处理层放一个集群,基础支撑层放一个集群.每个组件可以放在不同的机器上面,用多台机器去抗压力,提高整个系统的性能.


(二)源码结构

org.apache.ibatis.annotations
包含所有mapper 接口中用到的注解
例如常用的 @Param,@Update、@Select、@Delete 等

ü org.apache.ibatis.binding
生成mapper 接口的动态代理并进行管理

比如说:

TUserTestMapper mapper = sqlSession.getMapper(TUserTestMapper.class);

等号前面是没有实现类的,但是可以在等号后面拿到实现类,这个功能是封装到org.apache.ibatis.binding包的.

ü org.apache.ibatis.builder

是解析Mybatis的核心配置文件的,

包含Configuration对象所有构建器,主要包括XML、注解2种方式配置解析
BaseBuilder 构建器基类
XMLConfigBuilder 解析configuration.xml配置文件
XMLMapperBuilder 解析Mapper.xml配置文件
XMLStatementBuilder 解析elect\update\delete 标签
MapperAnnotationBuilder 注解式Mapper



ü org.apache.ibatis.cache
缓存功能实现、包含各种缓存装饰器
TransactionalCache 二级缓存功能实现

ü org.apache.ibatis.cursor

实现游标的方式查询数据、游标非常适合处理百万级别的数据查询,通常情况下不适合一次性加载到内存中
这种方式类似使用SAX解析XML文件

ü org.apache.ibatis.datasource

mybatis自带的数据源 包括jndi数据源、连接池功能

ü org.apache.ibatis.executor

包含SQL语句执行器,核心功能包

功能包括:
主键生成功能
执行参数解析功能
执行结果集解析功能
SQL执行器
缓存执行器

ErrorContext 错误上下文对象,跟踪所有执行流程

ü org.apache.ibatis.exceptions

Mybatis框架自己的异常,常见异常:TooManyResultsException

ü org.apache.ibatis.io

负责读取配置文件

ü org.apache.ibatis.jdbc

专门执行一些sql脚本的.

JDBC一些操作
SqlRunner SQL执行
ScriptRunner 脚本执行,可以执行建库语句,在执行测试用例时候用的非常多
ü
ü org.apache.ibatis.lang

这个包只有2个注解 @UsesJava7 @UsesJava8 使用这个两个注解标识哪些可以使用JDK7 API 哪些可以使用JDK8 API

ü org.apache.ibatis.logging

日志功能,实现多种日志框架的对接
org.apache.ibatis.logging.jdbc 代理所有功能JDBC 操作,实现了在debug模式下能够输出SQL

控制台打印日志就是通过这个来的.

ü org.apache.ibatis.mapping

参数映射的,比如哪个字段对应我的JavaBean的Pojo的哪个属性.

配置文件与实体对象的映射功能,Mapper映射、参数映射、结果映射等



ü org.apache.ibatis.parsing

解析sql参数的解析工具包:

GenericTokenParser:解析#{} ${} 这种占位符
XPathParser:XPath形式解析XML
PropertyParser: properties解析器
org.apache.ibatis.plugin

ü org.apache.ibatis.plugin

拦截器功能实现,使用代理模式实现拦截

ü org.apache.ibatis.reflection

反射器功能,这个包下实现元数据编程
通过把Java对象转换成 元数据对象MetaObject,然后就可以对元数据对象进行赋值操作,数据库查询结果到Java对象映射就是通过元对象实现

ü org.apache.ibatis.scripting

对动态SQL语言实现,配置文件中 功能就是在这个包实现,借助OGNL表达式,你也可以扩展自己的语言实现功能

ü org.apache.ibatis.session

会话相关的所有实现都在这里

主要实现SqlSession功能,非常核心包
官方注释:SqlSession包含了MyBatis工作的所有的Java接口,通过这些接口你可以 执行SQL命令(insert\delete\update\select),获取Mapper,管理实务

ü org.apache.ibatis.transaction

事务功能实现,包装了数据库连接,处理数据库连接生命周期包括:连接创建,预编译,提交\回滚和关闭

ü org.apache.ibatis.type

类型处理器,包括所有数据库类型对应Java类型的处理器,如果要实现自己类型处理器就需要实现包下的基础接口