【Mybatis源码学习】概述
最近复习享学课堂lison大佬讲解的mybatis源码,深有感触。在此记一笔,遗留青史。
1.怎样下载源码
1.1 下载地址
源码下载地址为:https://github.com/MyBatis/MyBatis-3,本学习笔记以3.5.x的版本进行解读和笔记,是对当前学习课程的总结,也是对以后进行复习打下参考的基础以及提供优化空间的前提。
1.2 导入Idea
1.2.1 环境
maven: 3.5.3
jdk: 1.8.0_191
idea: 2019.3
1.2.2 部署与打包
1)将pom文件中所有的true,全部改为 false;
2)在当前工程目录下执行以下命令:mvn install -DskipTests 或 mvn install -Dmaven.test.skip=true
3)若其他demo需要运用当前mybatis,记得对应上版本号,方便调试。
2.源码架构
-
API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。面向SQLSession编程。
-
数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
-
基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
2.1 核心流程三大阶段
2.1.1 初始化
读取XML配置文件和注解中的配置信息,创建配置对象(MappedStatement对象,包括了传入参数映射配置、执行的SQL语句、结果映射配置,存储在内存中),并完成各个模块的初始化的工作。这里面有很多工厂模式、建造者模式的身影。
2.1.2 代理
调用Mybatis提供的API,封装iBatis的编程模型,使用mapper接口开发的初始化工作。
2.1.3 数据读写
通过SqlSession完成SQL的解析,参数的映射、SQL的执行、结果的解析过程:
A) 根据SQL的ID查找对应的MappedStatement对象。
B) 根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。
C) 获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。
D) 根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
E) 释放连接资源。
2.2 面向对象设计遵循的七大设计原则
设计原则名称 | 定 义 | 使用频率 |
---|---|---|
单一职责原则(Single Responsibility Principle, SRP) | 一个类只负责一个功能领域中的相应职责 | ★★★★☆ |
开闭原则(Open-Closed Principle, OCP) | 软件实体应对扩展开放,而对修改关闭 | ★★★★★ |
里氏代换原则(Liskov Substitution Principle, LSP) | 所有引用基类对象的地方能够透明地使用其子类的对象 | ★★★★★ |
依赖倒转原则(Dependence Inversion Principle, DIP) | 抽象不应该依赖于细节,细节应该依赖于抽象 | ★★★★★ |
接口隔离原则(Interface Segregation Principle, ISP) | 使用多个专门的接口,而不使用单一的总接口 | ★★☆☆☆ |
合成复用原则(Composite Reuse Principle, CRP) | 尽量使用对象组合,而不是继承来达到复用的目的 | ★★★★☆ |
迪米特法则(Law of Demeter, LoD) | 一个软件实体应当尽可能少地与其他实体发生相互作用 | ★★★☆☆ |
2.2.1 单一职责
XMLConfigBuilder:主要负责解析mybatis-config.xml。
XMLMapperBuilder: 主要负责解析映射配置文件,包括*mapper.java,*mapper.xml;
XMLStatementBuilder: 主要负责解析映射配置文件中的SQL节点,*mapper.xml,包括select, update, insert, delete这些标签的解析;.
另外还有重要的应用:Sqlsession
2.2.2 合成复用原则
XMLMapperBuilder和XMLStatementBuilder都有一个“秘书”:MapperBuilderAssistant,组合使用。