Mybatis是如何访问数据的?
迪丽瓦拉
2025-05-30 00:22:28
0次

核心组件

 

                                                      Executor介绍

使用过 MyBatis 的都应该知道,Sqlsession 的功能都是基于 Executor 来实现的,Executor 是MyBaits 核心接口之一,定义了数据库操作最基本的方法,在其内部遵循 JDBC 规范完成对数据库的访问;Executor 类继承机构如下图所示:

     

  • 「Executor」: MyBaits 核心接口之一,定义了数据库操作最基本的方法;

  • 「CacheingExecutor」:使用装饰器模式,对真正提供数据库查询的 Executor 增强了二级缓存的 能 力 ;二 级 缓 存 初 始 化 位 置 :DefaultSqlSessionFactory.openSessionFromDataSource(ExecutorType, TransactionIsolationLevel, boolean);

  • 「BaseExecutor」:抽象类,实现了 executor 接口的大部分方法,主要提供了缓存管理和事务管理的能力,其他子类需要实现的抽象方法为:doUpdate,doQuery 等方法;

  • 「BatchExecutor」: 批量执行所有更新语句,基于 jdbc 的 batch 操作实现批处理;

  • 「SimpleExecutor」: 默认执行器,每次执行都会创建一个 statement,用完后关闭。;

  • 「ReuseExecutor」: 可重用执行器,将 statement 存入 map 中,操作 map 中的 statement 而不会重复创建 statement;

                                                 Executor设计模式

    「模板模式」:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定实现;类结构如下:

    AbstractClass 中模板方法 template()定义了功能实现的多个步骤,抽象父类只会对其中几个通用的步骤有实现,而一些可定制化的步骤延迟到子类 ConcreteClass1、ConcreteClass2 中实现,子类只能定制某几个特定步骤的实现,而不能改变算法的结构;

    「应用场景」:遇到由一系列步骤构成的过程需要执行,这个过程从高层次上看是相同的, 但是有些步骤的实现可能不同,这个时候就需要考虑用模板模式了;

    MyBatis 的执 行器组件是 使用模板 模式的典型应 用, 其中 BaseExecutor 、BaseStatementHandler 是模板模式的最佳实践;BaseExecutor 执行器抽象类,实现了 executor 接口的大部分方法,主要提供了缓存管理和事务管理的能力,其他子类需要实现的抽象方法为:doUpdate,doQuery 等方法;在 BaseExecutor 中进行一次数据库查询操作的流程如下:

  •  

  • 如上图所示,doQuery 方法是查询数据的结果的子步骤,doQuery 方法有 SIMPLE、REUSER、BATCH 三种实现,这三种不同的实现是在子类中定义的;

  • 「SimpleExecutor」:默认配置,在 doQuery 方法中使用 PrepareStatement 对象访问数据库, 每次访问都要创建新的 PrepareStatement 对象;

  • 「ReuseExecutor」:在 doQuery 方法中,使用预编译 PrepareStatement 对象访问数据库,访问时,会重用缓存中的 statement 对象;

  • 「BatchExecutor」:在 doQuery 方法中,实现批量执行多条 SQL 语句的能力;

                                       Executor的三个重要组件

通过对 SimpleExecutor doQuery()方法的解读发现,Executor 是个指挥官,它在调度三个小弟工作,这三个小弟分别为:

  • 「StatementHandler」:它的作用是使用数据库的 Statement 或PrepareStatement 执行操作,启承上启下作用;

  • 「ParameterHandler」:对预编译的 SQL 语句进行参数设置,SQL 语句中的的占位符“?” 都对应 BoundSql.parameterMappings 集合中的一个元素,在该对象中记录了对应的参数名称以及该参数的相关属性

  • 「ResultSetHandler」:对数据库返回的结果集(ResultSet)进行封装,返回用户指定的实体类型;

Executor 三个组件内部运作流程如下图所示:

 

 SQL执行StatementHandler组件介绍

StatementHandler 完成 Mybatis 最核心的工作,也是 Executor 实现的基础;功能包括:创建statement 对象,为 sql 语句绑定参数,执行增删改查等 SQL 语句、将结果映射集进行转化;StatementHandler 的类继承关系如下图所示:

  • 「BaseStatementHandler」:所有子类的抽象父类,定义了初始化 statement 的操作顺序,由子类实现具体的实例化不同的 statement(模板模式);

  • 「RoutingStatementHandler:Excutor」 组件真正实例化的子类,使用静态代理模式,根据上下文决定创建哪个具体实体类;

  1. RoutingStatementHandler 是在 Configuration 的 newStatementHandler 中创建的,见下图:

     

     

  2. RoutingStatementHandler 中使用动态代理的方式进行请求转发,在构造方法中, 根据上下文(配置)决定创建具体实现类;如下图:​

  • SimpleStatmentHandler :使用 statement 对象访问数据库,无须参数化;

  • PreparedStatmentHandler :使用预编译 PrepareStatement 对象访问数据库;

  • CallableStatmentHandler :调用存储过程;

 

                                结果集处理 ResultHandler介绍

ResultSetHandler 将从数据库查询得到的结果按照映射配置文件的映射规则,映射成相应的结果集对象;在 ResultSetHandler 内部实际是做三个步骤:找到映射匹配规则 → 反射实例化目标对象 → 根据规则填充属性值,为完成这三部ResultHandler 内部调用的流程图如下:

你看,这个面试天问的模棱两可,摸不着头脑。细品一下,面试官主要就是想问你,Executor 的交互过程。

 

 

 

 

 

 

 

 

相关内容

热门资讯

AI做攻略、“双向奔赴”……国... 本文转自:人民网人民网记者 许维娜今年国庆假期,AI(人工智能)成了不少年轻人的“旅行搭子”。行前做...
合肥的这个“梗”, 翻篇了 社交平台的评论区,曾长期流传一句专属于合肥的黑色幽默。有人问合肥哪里好玩,本地网友半开玩笑地回复:合...
7万+旅游中高层都在的群,今天... 做旅游这行,资源卡位、渠道互通、项目落地——往往就差一个“对的机会”。我们的行业社群已聚集70,00...
一场帐篷音乐节,如何让井研从“... 帐篷音乐节现场封面新闻记者 周洪攀10月的研溪湿地,晚风里裹着柑橘的清甜与民谣的回响。夜幕降临,10...
白鹤翩翩落星愿,上海迪士尼度假... 10月9日,世界候鸟日前夕,上海迪士尼度假区星愿公园的湖风里多了一分白鹤的灵动。三座白鹤雕塑正式揭幕...
成都锦江边赏初秋枫叶飘飘 目前,成都锦江边国华街枫叶树红了。近年来,国华街附近的几条街都栽种了红枫树,是城区较集中看枫叶的点位...
GBTA:商务旅行正在复苏,但... 亚太正在成为全球商务旅行增长的重要引擎。在经历疫情后的快速反弹之后,全球商务旅行正在进入一个新的增长...
从景区焕新到节赛引流 邹城双节... 齐鲁网·闪电新闻10月9日讯 中秋、国庆“双节”假期,邹城市文化和旅游局提前谋划、周密部署,立足自身...
江山如此多娇 且看石楼今朝 金秋十月,黄河岸畔秋意盎然,丰收盛会喜迎国庆。本次石楼国庆文旅活动以“江山如此多娇,且看石楼今朝”为...
海南国庆假期接待游客475.4... 2026年国庆假期,海南接待游客475.40万人次,较2025年增长13.1%,较2024年增长15...