Mybatis源码学习及自定义持久层框架

Mybatis架构原理

Mybatis源码学习及自定义持久层框架

架构功能分为三层:

(1)接口层:给外部使用的接口api。通过api来操作数据库。mybatis与数据库的交互分为两种:传统的xml和mapper代理。
(2)数据支撑层:负责具体的sql查找,解析,执行以及结果映射。主要目的是:根据调用的请求完成一次数据库的操作。
(3)基础支撑层:负责最基础的功能支撑。包括链接管理,事务管理,配置加载和缓存处理。

主要构件

Mybatis源码学习及自定义持久层框架

Myabaits层次架构

Mybatis源码学习及自定义持久层框架

总体的流程是:

(1)加载配置文件并初始化
加载mybatis-config.xml以及*.xml。将主要配置文件封装到configuration中。将sql的配置信息加载成一个MappedStatement对象,放到configuration中的mapperStatementMap中。以statementId(namespace+"."+方法名为key,生成的MappedStatement对象为value)。
(2)接受调用请求
调用mybatis的api。传入sql的ID和参数。
(3)Mybatis处理操作请求
根据sql的statementId查找对应的MappedStatement对象。
根据参入参数对象,解析MappedStatement对象,得到最终的要执行的sql和执行参入参数。
获取jdbc链接,执行最终的sql并为占位符负值。得到执行结果。
根据MappedStatement对象的结果映射配置,将结果进行转换处理。得到最终结果。
释放链接。
(4)返回处理结果

Myabaits源码解读

1、解析配置文件,封装到configuration中

Mybatis源码学习及自定义持久层框架
Mybatis源码学习及自定义持久层框架
Mybatis初始化是,将配置文件加载成输入流。最终封装到configuration中。
Configuration对象介绍:
Mybatis源码学习及自定义持久层框架
解析configuration跟节点
Mybatis源码学习及自定义持久层框架
然后逐个节点进行解析
Mybatis源码学习及自定义持久层框架
介绍一下MappedStatement;
作用:MappedStatement与Mapper中的一个select/insert/update/delete想对应,解析完成后存储在Configuration对象中的mappedStatements对象,是一个hashMap,statementId(权限定类名 + . + 方法名)为key。

执行sql流程

1、SqlSession

是一个接口,默认实现是:DefaultSqlSession。sqlsession是与数据库交互的顶层类,通常与ThreadLocal绑定。一个回话使用一个sqlSession。使用完毕后要关闭。有两个重要的属性:Configuration和Executor(执行器)。

2、Executor

执行器。有三个实现:
BatchExecutor:(批处理更新)
ReuseExecutor:(重要语句预处理)
SimpleExecutor: (默认)

3、执行sql

(1) 获取sqlSession

Mybatis源码学习及自定义持久层框架
要执行sqlSession中的方法(selectList为例),最终调用的是executor中的query。
Mybatis源码学习及自定义持久层框架

(2)、executor解析

进入SimpleExecutor中跟踪query方法
Mybatis源码学习及自定义持久层框架
Mybatis源码学习及自定义持久层框架
Mybatis源码学习及自定义持久层框架
几经波折,最后会创建一个StatementHandler对象,然后将参数传递给StatementHandler,使用StatementHandler完成对数据的查询,返回最终的结果。
总结下Executor的功能:
(1)根据传递的参数,完成sql的动态解析,生成BoundSql对象,共StatementHandler使用。
(2)为查询创建缓存,提高性能。
(3)创建JDBC的链接对象,传递给StatementHandler对象,返回结果。

3、StatementHandler

StatementHandler对象主要完成两个工作:
(1)对于JDBC的PreparedStatement类型的对象,创建的过程中,我们使用的是包含占位符的sql。然后对占位符进行设值。StatementHandler对象通过parameterize(statement)方法对statement进行设置。
(2)StatementHandler通过query(Statement,Resulthandler)方法来完成执行Statement,并将Statement对象返回的resultSet封装成list.
Mybatis源码学习及自定义持久层框架
StatementHandler调用了ParameterHandler的SsetParameters方法来对占位符进行参数赋值。调用ResultHandler的handlerResultSet来进行返回值的转换。
Mybatis源码学习及自定义持久层框架
Mybatis源码学习及自定义持久层框架

mybatis中使用到的设计模式

Mybatis源码学习及自定义持久层框架

自定义持久层框架

自定义持久层框架的设计思路:
Mybatis源码学习及自定义持久层框架
具体代码实现:
https://github.com/LeonardKawayi/zhangzhenkun/tree/master/%E4%BD%9C%E4%B8%9A/%E7%AC%AC%E4%B8%80%E5%91%A8/Ipersistence