1. MyBatis 整体架构

news2024/10/7 13:14:28

作为正式内容的第一篇,本次不会介绍具体的技术,而是先从全局视角上对 MyBatis 做一个俯瞰,了解 MyBatis 项目工程的组织结构,以及内部的核心功能模块。

工程结构

打开 MyBatis 的 Github 地址,就可以看到其代码工程结构。MyBatis 的分包方式简洁清晰、见名知义,可以清晰地看出内部的功能模块。下面我对其中较为核心的模块进行下简单介绍:
MyBatis工程结构

  1. annotatios:注解开发模块,定义了所有 Mapper 接口中用到的注解,常用的如 @Param,@Update、@Select、@Delete 等。
  2. binding:数据绑定模块,通过动态代理方式生成 Mapper 接口的实现类,并对其生命周期进行管理。
  3. builder:构建器模块,基于构建者模式(Builder Pattern),定义了 MyBatis 内部所有的构建器。MyBatis 的核心组件大部分都是通过 Builder 来构造的。
  4. cache:缓存模块,内置了各种缓存装饰器(Decorator),MyBatis 中耳熟能详的一级缓存、二级缓存就是基于该模块来实现的。
  5. cursor:支持游标的方式的数据查询,比较适合处理大数据量的查询场景。
  6. datasource:数据源模块,其中包含了 MyBatis 自定义的一款简易的数据源。
  7. exceptions:定义了常用的异常。
  8. executor:执行器模块,承载了 MyBatis 的核心执行流程,主要功能包括:Statement 创建、SQL 参数拼接、动态参数绑定、SQL 语句执行、结果集解析等。
  9. io:资源文件读取模块,用于定位和加载 MyBatis 相关的配置信息。
  10. jdbc:提供了操作原生 JDBC 的一些工具类。
  11. lang:这个包只包含了2个注解:@UsesJava7@UsesJava8 ,主要是用于标识类、方法等元素的 JDK 实现版本。
  12. logging:日志模块,MyBatis 自定义了统一的日志级别,饼整合了多种主流的第三方日志框架。
  13. mapping:映射模块,提供了配置文件与实体对象的映射功能,包括 Mapper 映射、参数映射、结果集映射等。
  14. parsing:字符串解析工具包,解析 SQL 语句中 $# 诸如此类的占位符,并生成 SQL 语句。
  15. plugin:插件模块,基于动态代理模式实现功能的扩展。著名的分页插件 PageHelper 就是基于 plugin 模块实现的。
  16. reflection:反射模块,是对 Java 底层的反射机制的二次封装,并提供了一系列的易用的反射工具类。
  17. scripting:动态 SQL 支持,mapper 配置文件中 ifwhere 等 SQL 标签的功能就是基于此实现的。
  18. session:会话核心模块,实现了 SqlSession 的功能。
  19. transaction:事务模块,MyBatis 基于原生 JDBC 实现了基础的事务功能。
  20. type:类型处理模块,内置了一系列的 数据库类型 <-> Java 类型的转换器。

功能架构

介绍完了 MyBatis 的工程结构之后,我们一起看一下它的整体功能架构。按照业内主流的共识,MyBatis 的功能可以按照以下层次划分:
MyBatis功能架构

  1. 基础支撑层:主要面向底层技术,提供了一系列业务无关的通用能力,对核心处理层提供支持。基础支撑层的很多组件都可以单独拿出来放在我们自己的项目里使用。
  2. 核心处理层:MyBatis 在原生 JDBC 的基础上进行了高度的封装与抽象,提取了配置解析、SQL 解析、参数映射、SQL 执行和结果集映射等几大核心功能,并开发了插件机制解决扩展性的问题。
  3. 接口层:对外统一暴露了 SqlSessionMapper 接口进行数据库操作,屏蔽了底层的实现细节,大大简化了数据访问功能的开发流程。

门面模式 Facade Pattern

从 MyBatis 的整体架构来看,它的结构类似于门面模式,SqlSession 就相当于一个 Facade,内部聚合了 MyBatis 核心处理层的各个组件,来实现对数据库的各种操作,而对外屏蔽了复杂的逻辑处理,仅保留简单的 API 供客户端使用。这样一来,客户端无需关心 MyBatis 内部的实现细节,减少了用户的理解和学习成本。

Facade Pattern
(图片来源:https://refactoring.guru/design-patterns/facade)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/705858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言:打印用 * 组成的带空格直角三角形图案

题目&#xff1a; 多组输入一个整数&#xff08;2~20&#xff09;&#xff0c;表示直角三角形直角边的长度&#xff0c;即 * 的数量&#xff0c;也表示输出行数。 思路&#xff1a; 总体思路&#xff1a; 找到规律&#xff1a; 行数 列数 < 三角形长度 - 1 打印 两个空格…

一步一步学OAK之十四: 获取OAK设备信息

这一节我们通过调用DepthAI API 来获取OAK设备信息 目录 DeviceBootloader简介获取OAK设备信息的方法Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4: 获取可用设备Setup 5: 判断infos的长度Setup 6: 遍历infosSetup 7: 打印提示消息Setup 8: 连接设备Setup…

html_4——知识总结

html_4——知识总结 一、计算机基础知识二、html4总结2.1 html基本结构2.2 全局属性-id,class,style,dir,title,lang2.3 格式排版标签-div,p,h1-h6,br,hr,pre2.4 文本标签-span,en,strong,del,ins,sub,sup2.5 图片标签-img:src,alt,width,height,boder2.6 超链接-a:herf,target…

内部函数和外部函数

文章目录 怎么来的&#xff1f;内部函数外部函数明确一下内外的概念&#xff1a;外部函数的实例fgets()函数 怎么来的&#xff1f; 函数本质上是全局的&#xff0c;因为定义一个函数的目的就是这个函数与其他函数之间相互调用&#xff0c;如果不声明的话&#xff0c;一个函数既…

YouTube正测试屏蔽“广告拦截器”,以确保其广告收入

YouTube目前正在进行一项全球范围内的小规模测试&#xff0c;警告用户关掉他们的广告屏蔽器&#xff0c;否则将被限制观看视频的次数。 周三&#xff08;6月28日&#xff09;&#xff0c;Reddit的一位用户发现&#xff0c;在使用YouTube时弹出了一个窗口&#xff0c;提示该用户…

Cali3F: Calibrated Fast Fair Federated Recommendation System

Decentralized Collaborative Learning Framework for Next POI Recommendation 标定的&#xff08;校准的&#xff09;快速公平联邦推荐系统 1. What does literature study? 提出一个经过校准的快速而公平的联邦推荐框架Cali3F&#xff0c;通过集群内参数共享解决了收敛问…

创新引领未来:RFID技术在汽车装配中的智能革命

射频识别&#xff08;RFID&#xff09;技术作为一种自动识别技术&#xff0c;已经在许多领域得到广泛应用。在汽车装配领域&#xff0c;RFID技术的应用可以提高装配过程的效率、降低人工错误率&#xff0c;并帮助实现自动化和智能化生产。本文将介绍RFID技术在汽车装配中的应用…

动态二维码生成器PHP Dynamic QRcode

什么是 PHP Dynamic QRcode &#xff1f; PHP Dynamic QRcode 是一个允许生成和保存动态和静态二维码&#xff08;QR码&#xff09;的应用。它具有简洁、响应灵敏且用户友好的设计。其中包含您网站中可能需要的一般功能&#xff0c;如&#xff1a;记录管理&#xff08;CRUD&…

【2023,学点儿新Java-27】是的——C语言中的const关键字 | 附:按照类型 快速了解与划分:C语言中的关键字 | goto关键字解释

前情回顾&#xff1a; 【2023&#xff0c;学点儿新Java-26】关键字介绍示例代码&#xff1a;assert 断言&#xff08;如何启用断言&#xff09;&#xff0c;以 验证一个数组的长度是否不为零 为例说明【2023&#xff0c;学点儿新Java-25】如何解决浮点计算存在误差&#xff1a…

Selenium Grid入门详解

目录 前言&#xff1a; 一、简介 二、使用场景 三、使用前提 四、使用方式 五、实现在另一台电脑运行脚本 前言&#xff1a; Selenium Grid是一个用于分布式测试的工具&#xff0c;它允许同时在多个机器上执行Selenium测试。通过使用Selenium Grid&#xff0c;你可以在不…

Linux系统Centos7 安装MySQL8.0详细步骤

MySql安装 1.下载wget命令 yum -y install wget 2. 在线下载mysql安装包 wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm 3.MySQL的GPG升级了&#xff0c;需要更新&#xff0c;如果是新安装的MySQL&#xff0c;执行以下脚本即可&#xff1…

Vite + Vue3 + Electron实现进程通信

Vite Vue3 Electron实现进程通信 实现 渲染进程 / 主进程 通信&#xff08;IPC&#xff09; Electron 是一个基于 Chromium 和 Node.js 的桌面应用程序开发框架&#xff0c;而 Vue3 则是一种流行的前端框架。将两者结合使用可以快速地打造出跨平台的桌面应用程序。在这种组…

Sui x KuCoin Labs夏季黑客松第三批入围项目公布

自Sui x KuCoin Labs夏季黑客松开放注册以来&#xff0c;已收获了众多开发者的报名参与。赛程过半&#xff0c;截至目前为止&#xff0c;第一批和第二批入围项目已在前两周公布&#xff0c;第三批入围名单项目新鲜出炉&#xff0c;进入最终的Demo Day。 第三批入围名单 SuiVi…

在 Linux 中查找 IP 地址的 3 种简单方法

在 Linux 系统中&#xff0c;经常需要查找 IP 地址以进行网络配置、故障排除或安全管理。无论是查找本地主机的 IP 地址还是查找其他设备的 IP 地址&#xff0c;本文将介绍三种简单的方法&#xff0c;帮助你在 Linux 中轻松找到所需的 IP 地址。 总结 通过上述三种简单的方法&…

自动化测试进阶之路(WEB自动化二)

一、设计模式 Pom模块关键字驱动模式 pom模块&#xff1a;page object model 页面对象模式好处&#xff1a; 解决线性脚本的问题解决代码不能重复利用的问题后期的维护问题 分三层&#xff08;页面对象层调用基础层的方法&#xff0c;测试用例层调用页面对象层的方法&#xff0…

Spring Boot 有哪些方式可以实现热部署

一、什么是热部署&#xff1f; 释义 所谓热部署&#xff0c;就是在应用正在运行的时候升级软件&#xff0c;却不需要重新启动应用。 对于Java应用程序来说&#xff0c;热部署就是在运行时更新Java类文件。在基于Java的应用服务器实现热部署的过程中&#xff0c;类装入器扮演着…

EasyDSS视频直播点播平台视频回看列表显示为ID的排查与优化

视频直播点播EasyDSS平台具备灵活的视频能力&#xff0c;包括直播、点播、转码、管理、录像、检索、时移回看等&#xff0c;平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等能力服务&#xff0c;可应用在无人机推流、在线直播、虚拟直播、远程培训等场景中。…

String面试

以下讨论以jdk8为标准&#xff1a; String Pool&#xff1a;字符串常量池 存储字面量位于堆中&#xff0c;不在元空间intern()方法会去常量池找&#xff0c;没有的话就创建一个&#xff0c;返回常量池中的地址&#xff1b;有的话就直接返回对象地址 new String(“”)方法强制创…

3.Hive SQL数据定义语言(DDL)

1. 数据定义语言概述 1.1 常见的开发方式 &#xff08;1&#xff09; Hive CLI、Beeline CLI Hive自带的命令行客户端 优点&#xff1a;不需要额外安装 缺点&#xff1a;编写SQL环境恶劣&#xff0c;无有效提示&#xff0c;无语法高亮&#xff0c;误操作率高 &#xff08;2&…

IMX6ULL系统移植篇-uboot的配置与编译

一. 编译 uboot简介 开发板的资源 &#xff1a;256MB(DDR3) 512MB(NAND)核心板 这里使用的是阿尔法开发板&#xff0c;256MB的 DDR&#xff0c;核心板是 512MB的 Nand-Flash。 二. 编译 uboot 创建 /uboot/alientek_uboot 目录文件&#xff0c;将正点原子提供的 uboot源码包…