Mybatis源码解析

1.mybatis作为SSM中的持久层,我们都知道他是对JDBC的封装,那么他底层是如何实现的呢(新人记录学习,可能分析的不是很到位 各位别喷,下面分析并不是接口绑定的情况)
Mybatis源码解析_第1张图片
先从解析配置文件说起
在这里插入图片描述
先从这个方法作为如果,调用重载方法;类加载器为空,Mybatis源码解析_第2张图片
又调用了classLoaderWrapper.getResourceAsStream
Mybatis源码解析_第3张图片
getClassLoaders里面又创建了新的类加载器:
Mybatis源码解析_第4张图片
Mybatis源码解析_第5张图片
这个方法最终会返回一个InputStream,
下面先介绍一下SqlSessionFactoryBuilder
这个首先会调用 XMLConfigBuilder 类的构造器来创建一个 XML 配置构建器对象,
利用这个构建器对象来调用其解析方法 parse()来完成 Configuration 对象的创建,之后以这
个配置对象为参数调用会话工厂构建者类中的 build(Configuration config)方法来完成
SqlSessionFactory(会话工厂)对象的构建。

Configuration为mybatis上下文对象,每个框架都会又这样的上下文对象,化这个类的目的就是为了使用其对象作为项目全局配置对象,这样通过配置文件配置的信息可以保存在这个配置对象中,而这个配置对象在创建好之后是保存在 JVM 的 Heap 内存中的,方便随时读取。

方法重载调用3个参数的build方法,初始化XMLConfigBuilder对象
Mybatis源码解析_第6张图片
在构造方法里调用了3个参数的构造方法,在下面的构造方法中又通过super关键字调用父类的构造方法创建了Configuration上下文对象
Mybatis源码解析_第7张图片
Mybatis源码解析_第8张图片
下面开始解析
Mybatis源码解析_第9张图片
Mybatis源码解析_第10张图片
parser.evalNode("/configuration")可以看成是找到根节点,作为参数传递给parseConfiguration()方法
在parseConfiguration方法里又定义了很多方法,都是解析对应的节点的,解析完成之后将值set到Configuration对象里,解析完成之后会将Configuration对象返回,执行build方法Mybatis源码解析_第11张图片
build方法会返回一个DefaultSqlSessionFactory对象,SqlSessionFactory其实是一个接口,DefaultSqlSessionFactory才是具体的实现
Mybatis源码解析_第12张图片
Mybatis源码解析_第13张图片
在这里插入图片描述
从工厂里得到sqlsession对象 ,这里又涉及到了Executor ,Executor是一个接口里面定义了他能执行哪些操作的抽象定义
在这里插入图片描述
如update
Mybatis源码解析_第14张图片
Mybatis源码解析_第15张图片
在执行open方法的时候,会给定一个默认的类型,默认是Simple
在这里插入图片描述
继承结构图
Mybatis源码解析_第16张图片
SimpleExecutor:每执行一次 update 或 select,就开启一个 Statement 对象,用完立刻关闭 Statement 对象。(可以是 Statement 或 PrepareStatement 对象)

ReuseExecutor:执行 update 或 select,以 sql 作为 key 查找 Statement 对象,存在就使用,不存在就创建,用完后,不关闭 Statement 对象,而是放置于 Map内,供下一次使用。(可以是 Statement 或 PrepareStatement 对象)

BatchExecutor:执行 update(没有 select,JDBC 批处理不支持 select),将所有 sql 都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个 Statement对象,每个 Statement 对象都是 addBatch()完毕后,等待逐一执行
默认是simple,这里会做一个条件判断 会帮我创建一个simpleExecutor,然后将值在这里插入图片描述封装到DefaultSqlSession DefaultSqlSession实现了在这里插入图片描述接口
Mybatis源码解析_第17张图片
但是到这里并没有执行SQL语句,Mybatis源码解析_第18张图片
Mybatis源码解析_第19张图片
Mybatis源码解析_第20张图片
Mybatis源码解析_第21张图片
Mybatis源码解析_第22张图片
到这里返回一个StatementHandler 这是一个接口 下面有两个实现类
Mybatis源码解析_第23张图片

其实会new一个RoutingStatementHandler

Mybatis源码解析_第24张图片

进来之后可以发现里面有一个switch语句 根据Executor的类型返回对应的
StatementHandler,
Mybatis源码解析_第25张图片

然后
Mybatis源码解析_第26张图片
Mybatis源码解析_第27张图片

得到Statement对象
Mybatis源码解析_第28张图片
Mybatis源码解析_第29张图片
得到SQL语句并执行,由此可见:MyBatis 其实就是将操作数据库的 JDBC 操作封装起来的一个框架,同时还实现了 ORM
Mybatis源码解析_第30张图片
Mybatis源码解析_第31张图片
结果集处理器,如果是查询操作,必定会有返回结果,针对返回结果的操作,就要使用ResultSetHandler 来进行处理,这个是由 StatementHandler 来进行调用的。这个处理器的作用就是对返回结果进行处理。

你可能感兴趣的:(源码解析)