图解MyBatis

回复“面试”获取全套面试资料

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

本文主要内容:

Mybatis工作流程

Mybatis工作流程可以大致分为四个步骤:

下面我们就来说说这四个步骤:

加载配置并初始化

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

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

接收调用请求

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

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

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

行处理。

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

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

具体处理过程:  (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层次结构

推荐阅读

《算法问题整理》.pdf
《写给大忙人看的JAVA核心技术》.pdf
并发编程大扫盲:带你了解何为线程上下文切换
(0)

相关推荐

  • Mybatis中mapper的xml解析详解

    上一篇文章分析了mapper注解关键类MapperAnnotationBuilder,今天来看mapper的项目了解析关键类XMLMapperBuilder. 基础介绍 回顾下之前是在分析config ...

  • 02:MyBatisCRDU及配置解析

    一:select select标签是mybatis中最常用的标签之一 select语句有很多属性可以详细配置每一条SQL语句 resultTypeSQL:语句返回值类型.[完整的类名或者别名] par ...

  • mybatis源码分析(二) 执行过程

    这边博客衔接上一篇mybatis的xml解析的博客,在xml解析完成之后,首先会解析成一个Configuration对象,然后创建一个DefaultSqlSessionFactory的session工 ...

  • 设计模式-门面模式

    门面模式 参考资料 图解设计模式 大话设计模式 设计模式之禅 github我见过最好的设计模式 http://c.biancheng.net/view/1326.html 定义 也称为外观模式 外观模 ...

  • Mybatis的sql组装详解

    上一篇分析了SqlSession执行sql的过程,其中并没有分析sql是从哪里来的,今天就来仔细分析下. Sql来源 从上一篇的最后一步执行sql那里倒推sql的来源,源码主要过程如下图: 可以看到最 ...

  • 【新提醒】圆育克束腰上衣 图解

    【新提醒】圆育克束腰上衣 图解

  • 电机的装配工艺图解

    专业的电工电气领域自媒体,不容错过 电机制造是整个机械制造业中一个重要部门,电机的主要作用是产生驱动转矩,作为用电器或各种机械的动力源.电机制造有其特有的工艺. 一.装配前准备.检查及要求 1.清理与 ...

  • 老牛常用低吸战法图解

    深山老牛 楼主 2019-03-17 12:56 我之前讲的战法比较凌乱,大家都一知半解,可能不利于形成总体印象而建立自我系统.我也意识到了.老牛在这里综合性的图解一次.为避免交易同质化,不详解,我相 ...

  • 如何判断筹码结构的好坏(图解)(2)

    再讲重点,筹码的纯洁性. 这个比较难理解,我只能通过举例来说. 做短线或者超短打板,参与牛股的人主要是谁?激进的操作者,他们的操作是最极端的,买按涨停买,卖按跌停卖.那么反应到盘面就是,极端的走势. ...

  • 如何判断筹码结构的好坏(图解)

    简单来说,好的短线筹码结构,就是两个: 1.筹码断层,筹码断层使得实际流通盘极少,拉升和打压都非常方便. 2.筹码的纯洁性,指的是只有极少的获利筹码或者风险偏好低的猥琐筹码的存在,这两个是牛股炒作的重 ...

  • 绳子打结方法大全(图解)

    <渔业界>:中国渔业最大新媒体 结绳系扣是渔民的最基本技能.渔业生产中,无论是网眼的补织.断绳的对接,还是船靠码头时的系缆,都要用到绳索结.绳子扣产生于渔家的生产.生活中的需求,他们要综合 ...

  • 解决不良?看这个图解8D分析法。直观明了!

    8D(8 Disciplines)即问题解决8步法,最早是福特公司使用的经典质量问题分析手法,对于解决工厂中存在的问题是一个很有用的工具,尤其在面对重大不良时,它能建立一个体系,让整个团队共享信息,并 ...