图解MyBatis

在之前文章中,咱们对Mybatis进行了入门级的介绍教小师妹快速入门Mybatis,看这篇就够了,今天咱们来从一个全局的角度看看Mybatis。java

本文主要内容:sql

图片

Mybatis工做流程

Mybatis工做流程能够大体分为四个步骤:数据库

图片

下面咱们就来讲说这四个步骤:缓存

加载配置并初始化

触发条件:加载配置文件,好比:全局配置文件、XxxMapper.xml配置文件等。架构

配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。app

接收调用请求

触发条件:调用Mybatis提供的APIide

传入参数:为SQL的ID和传入参数对象spa

处理过程:将请求传递给下层的请求处理层进插件

行处理。

处理操做请求 触发条件:API接口层传递请求过来

传入参数:为SQL的ID和传入参数对象code

具体处理过程:  (A)根据SQL的ID查找对应的MappedStatement对象。

(B)根据传入参数对象解析MappedStatement对象,获得最终要执行的SQL和执行传入参数。

(C)获取数据库链接,根据获得的最终SQL语句和执行传入参数到数据库执行,并获得执行结果。

(D)根据MappedStatement对象中的结果映射配置对获得的执行结果进行转换处理,并获得最终的处理结果。

(E)释放链接资源。

返回处理结果

将最终的处理结果返回。

Mybatis大体流程:

图片

Mybatis实现原理

Mybatis底层仍是采用原生jdbc来对数据库进行操做的,只是经过 SqlSessionFactory,SqlSession Executor,StatementHandler,ParameterHandler,ResultHandler和TypeHandler等几个处理器封装了这些过程。

执行器:Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) 参数处理器:ParameterHandler (getParameterObject, setParameters) 结构处理器 ResultSetHandler (handleResultSets, handleOutputParameters) sql查询处理器:StatementHandler (prepare, parameterize, batch, update, query)

其中StatementHandler用经过ParameterHandler与ResultHandler分别进行参数预编译 与结果处理。而ParameterHandler与ResultHandler都使用TypeHandler进行映射。以下图:

图片

MyBatis总体架构

Mybatis的功能架构分为三层:

图片

每一层对应详细内容:

图片

API接口层

首先接口层是咱们打交道最多的层,核心对象就是SqlSession,它是上层应用和Mybatis打交道的桥梁,也有的人称之为大门,SqlSession中定义了很是多的对数据库操做的方法,接口层在接受到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操做。。

数据处理层

这一层主要就是跟数据库操做相关的动做都是在这数据处理层完成的。

核心处理层主要作了这4件事:

  • 把接口中传入的参数解析并映射成JDBC类型;
  • 解析xml文件中的SQL语句,包括插入参数和动态SQL的生成;
  • 执行SQL语句;
  • 处理结果集,并映射成Java对象。

插件也属于核心层,这是由它的工做方式和拦截的对象决定的。

基础支撑层

负责最基础的功能支撑,包括链接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来做为最基础的组件。为上层的数据处理层提供最基础的支撑。

图片

MyBatis的主要成员

Configuration

MyBatis全部的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中。

SqlSession

做为MyBatis工做的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能。

Executor

MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护。

StatementHandler

封装了JDBC Statement操做,负责对JDBC statement 的操做,如设置参数等。

ParameterHandler

负责对用户传递的参数转换成JDBC Statement 所对应的数据类型。

ResultSetHandler

负责将JDBC返回的ResultSet结果集对象转换成List类型的集合。

TypeHandler

负责java数据类型和jdbc数据类型(也能够说是数据表列类型)之间的映射和转换。

MappedStatement

MappedStatement维护一条<select|update|delete|insert>节点的封装。

SqlSource

负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回

BoundSql

表示动态生成的SQL语句以及相应的参数信息。

Mybatis层次结构

图片

相关文章
相关标签/搜索