Mybatis源码解析

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

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

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

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

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

其实会new一个RoutingStatementHandler

Mybatis源码解析

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

然后
Mybatis源码解析
Mybatis源码解析

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