说到MyBatis,如果您是Java开发者,对于其一定不陌生,MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
在互联网应用开发中,对于持久层框架的选择,MyBatis是大多数情况下首先考虑被选择的框架,它凭借着使用简单、性能良好等优点,从诸多持久层框架中脱颖而出,那么,关于MyBatis背后的实现原理,你是否有过深入了解呢?
本系列文章,就带您深入探析MyBatis的实现原理,从源码层面来一起理解MyBatis。
本系列文章采用MyBatis 3.4.6版本,MyBatis项目GitHub地址:https://github.com/mybatis/mybatis-3/tree/3.4.x
我们在使用MyBatis时,基本上都会与Spring集成使用,因此需要mybatis-spring集成的项目,mybatis-spring项目GitHub地址:https://github.com/mybatis/spring
根据我个人学习开源项目的经验,学习源码的过程最好还是要自己下载项目源码,可以跟着笔者的思路一起走,避免纸上谈兵,因此建议您先下载MyBatis的项目源代码。
我们首先来对MyBatis3的项目结构进行一个大体的概览,首先来看Mybatis3项目:
如上图所示,MyBatis的项目结构非常的清晰,其复杂度相对于Spring项目,也是简单明了很多,我们对其中几个重要的目录进行简要的介绍。
1、annotations:存放MyBatis注解,包括最为常用的注解@Mapper
、@Param
、@Insert
等。
2、binding:存放MapperProxy
与MapperRegistry
,可能现在你对这两个类不太熟悉,在后面的章节中,我们会重点介绍这两个类,它们是组装Mapper Interface
与Mapper xml配置
文件映射关系的核心类。
3、builder:存在构造器类,项目中用到的大量核心对象是基于构造器来构建出来的。
4、cache:存放MyBatis的一级缓存实现。
5、datasource:存放数据库连接实现。
6、executor:存放各种执行器,是MyBatis的核心实现,SQL的具体执行就是在执行器中进行执行的。
7、io:存放I/O操作工具类,用于读取Mapper xml
配置文件。
8、logging:存放各种日志输出实现,可以适配多种日志类库,例如log4j
、log4j2
、JDK stdout
等。
9、mapping:存放处理映射关系类,即如何将Mapper xml
配置文件中的配置与Java类进行关系映射,查询结果如何与Java类型进行映射。
10、parsing:存放xml
配置文件解析工具类。
11、plugin:存放MyBatis插件的主键以及配置,但具体的插件实现,并不在此处。
12、session:存放SqlSessionFactory
等相关类,是MyBatis的核心实现所在。
13、transaction:存放事务控制相关类。
在实际开发中,我们使用MyBatis大多是与Spring项目配合使用,MyBatis开发了独立的项目,来与Spring进行集成,mybatis-spring项目的目录结构大体如下:
mybatis-spring的项目目录结构如上,目录结构相对简单,我就不一一介绍了,比较重点关注的有两个类:MapperScannerRegistrar
和SqlSessionTemplate
,后续的章节中我们也会重点介绍。
我们在项目中使用MyBatis的时候,配置非常简单,配置一个xml
的配置文件与Mapper Interface
进行映射,然后直接@Autowired
,就可以使用了,像这样:
那么这里就会引申出几个问题:
1、为什么仅仅注入了一个interface
,并没有对应的实现,也可以正常执行呢?
2、我配置的xml
配置文件是怎么与mapper interface
关联起来的呢?
3、Spring
是如何找到我的mapper interface
与xml
配置文件的呢?
4、一个简单的select
操作,是怎么执行的呢?
从源码角度看:
1、MyBatis使用了哪些设计模式?
2、MyBatis如何做到出色的执行性能?
3、MyBatis的设计有哪些我们可以参考借鉴的地方?
接下来的系列文章中,我们就对上面的几个问题,进行详细的解读,一起来探究MyBatis的核心工作原理。
本篇,我们简单介绍了MyBatis的项目目录结构以及系列文章要去探究的问题点,接下来的文章中,我们会对MyBatis的核心源代码进行深入剖析,让您做到知其然,也知其所以然,敬请期待!
更多精彩文章, 请关注我的个人公众号:老宣说
让我们一起共同学习成长!
感谢您的支持!