文章目录

mybatis虽然设计思路很简单,但是要把内部的一些东西看明白,并不是简单的事情。 空闲之余还了解了下mybatis的历史,原来其前身ibatis早在2001年就开始启动了,估计比hibernate还早,2010年脱离了Apache,重新设计的mybatis更加简洁灵活好使。由于mybatis官方并没有给出一个大概的设计图,只有从代码层面入手去分析了,早在Googlecode的时候,mybatis官方还有个大概的映射图,参考如下:

mybatis映射图

该图非常简洁明了的说明了mybatis的整体结构,大方向按照这个思路去分析,mybatis的底层实现就明白了。根据上图的理解,mybatis的大概流程就是,初始化配置文件完成文件的解析,然后执行SQL,最后结果集映射处理。通过一段时间的代码阅读,把mybatis源代码各个包之间的关系,画了一个组件图,参考下图:
包组件图

mybatis的主要执行流程如下:

从上图也可以看出,mybatis的设计是非常简单的,只要搞明白包之间的关系,分析起来就容易多了。简单说明下各个包主要实现了哪些功能:
parsing:解析xml以及properties文件
io:读取mybatis的配置文件
datasource:mybatis自己实现的数据库连接池
builder:根据sqlmapConfig.xml,sqlmap.xml,初始化SQL执行环境,如实例化Configuration、参数对象、结果集对象等,包含注解与xml两种实现
binding:通过类名+方法名的形式去找到对应的SqlSession方法实现
session:SQL语句执行的入口,主要创建session相关的实现
type:初始化sqlmapConfig.xml的别名注册,以及类型处理注册
plugin:拦截器相关类,要对SQL特殊处理就可以实现该包中的Interceptor,如分页查询
executor:sql执行的核心,获取配置文件的,实现可以执行的sql,最终处理结果集,这些过程都在executor中实现
cache:各种缓存实现
mapping:sqlmapConfig.xml,sqlmap.xml中的标签映射类

后期会单独对这些核心模块进行分析,以及在实际项目中常见的问题分析,如:执行器流程、动态SQL、事务、缓存、延时加载、批量处理、主键生成策略、读写分离、锁机制等等

文章目录