二、源码分析之mybatis基础架构

前面我们学习了mybatis的基本用法,但是作为优秀的开发者不能止步于用,要"知其然,知其所以然"。本系列博文将对mybatis源码进行深入剖析,让其深刻的理解mybatis内部的运行机制。

一、mybatis架构简介

mybatis基础架构图

以上是mybatis的基础架构图,下面针对图中的众多的组件进行简单的介绍。

1、引导层

  • 引导层主要是关于myabtis的配置相关,mybatis提供了两种方式进行配置:一种是采用硬编码方式,基于Java API完成的;一种是基于xml配置方式完成的。由于硬编码受灵活性限制,实际运用中通常是使用xml的配置方法对myabtis进行配置。

2、基础支持层

  • 该层包含整个mybatis的基础模块,这些模块为核心处理层的功能提供了良好的支撑
    (1)反射模块

myabtis提供了反射模块,该模块对java原生的反射进行了良好的封装,提供了更加简洁易用的API,同时对反射进行了一系列的优化,比如缓存了类的元数据。

(2)类型转换模块

类型转换功能之一就是为简化配置文件提供了别名机制;类型转换另一个功能就是实现JDBC与JAVA类之间的转换(在sql语句绑定参数与映射结果集时候涉及比较多)

(3)日志模块

集成众多的第三方日志框架

(4)资源加载模块

资源加载模块主要是对类加载器进行了封装,确定类加载器的使用顺序,并提供了加载文件以及其他资源文件的功能

(5)解析器模块

解析器模块主要提供了两个功能:一个是对xpath的封装,解析config和mapper配置文件;另一个是提供处理动态的sql语句中的占位符号的支持

(6)数据源模块

提供了相应的数据源实现,同时提供了与第三方数据源集成的接口

(7)事物管理

mybatis对数据库的事物做了抽象,其自身提供了相应的事务接口和简单实现。但是通常是与spring集成,并由spring框架管理事务

(8)缓存模块

mybatis提供了一级和二级缓存,这两级缓存是依赖于基础支持层中的缓存模块实现的

(9)binding模块

mybatis通过binding模块将用户自定义的mapper接口与映射配置文件关联起来,系统可以通过调用自定义的mappe接口中的方法进行执行相应的sql语句完成数据库操作

3、核心处理层

  • 核心处理层是mybatis的核心处理流程,其中包括mybatis的初始化以及完成一次数据库操作的涉及的全部流程也难怪
    (1)配置解析

在mybatis初始化过程中,会加载config配置文件和mapper映射文件及mapper接口中的注解信息,解析后的配置信息会形成相应的对象保存到Configuration中。然后利用configuration对象创建sqlSessionFactory对象,在创建SqlSession对象,进而完成数据库的操作。

(2)Sql解析与scripting模块

mybatis实现了动态sql语句的功能,通过sql语句的解析,完成动态灵活sql的需求。mybatis中的scripting模块会根据用户传入的实际参数,解析映射文件中定义的动态sql节点,并形成数据库可执行的sql语句。

(3)sql语句执行

整个sql语句执行过程中比较重要的是Executor、statementHandler、ParameterHandler和ResultSetHandler
1、Executor主要负责一级缓存和二级缓存及事物相关操作,并将数据库相关操作委托给StatementHandler完成
2、StatementHandler首先通过ParameterHandler完成Sql语句的参数绑定,然后通过java原生的Statement对象执行Sql语句并得到结果集,然后通过ResultSetHandler完成结果集映射,得到结果对象并返回。

执行sql简单流程图

(4)插件

用户可以通过插件的方式对mybatis进行扩展,用户自定义的插件可以改变mybatis的默认行为。在使用自定义插件之前需要了解mybatis的内部原理,才能编写出高效、安全的插件

4、接口层

  • 接口层核心就是SqlSession接口,该接口定义了Mybatis暴露给应用程序使用的API。

二、mybatis重要组件分析

  • 上面我们分析了mybatis的架构,知道了mybatis是由哪些组件组成的以及对组件做了简单的介绍。但作为源码分析,上面提高的内容并非全部是重点,mybatis框架中重点要关注的其实就10几个类,好好理解这10几个类,然后做一个串联,理清运行流程,基本就能读懂mybatis原理了。下面我将重点罗列出要关注的类:

  • SqlSession:作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能;

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

  • StatementHandler:封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。

  • ParameterHandler:负责对用户传递的参数转换成JDBC Statement 所需要的参数;

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

  • TypeHandler:负责java数据类型和jdbc数据类型之间的映射和转换;

  • MappedStatement:MappedStatement维护了一条<select|update|delete|insert>节点的封装;

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

  • BoundSql:表示动态生成的SQL语句以及相应的参数信息;

  • Configuration:MyBatis所有的配置信息都维持在Configuration对象之中;

mybatis核心类之间的关系

参考:
《mybatis技术内幕》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352