当前位置: 首页 > news >正文

Mybatis源码01 - 总体框架设计

Mybatis总体框架设计

文章目录

  • Mybatis总体框架设计
    • 一:MyBatis架构概览
      • 1:接口层
        • 1.1:使用传统的MyBatis提供的API
        • 1.2:使用Mapper接口
      • 2:数据处理层【核心】
        • 2.1:参数映射和动态SQL语句生成
        • 2.2:SQL语句的执行以及封装结果集
      • 3:框架支撑层
      • 4:引导层
    • 二:主要构件及其相互关系
      • 1:核心构件的层次关系
      • 2:核心部件说明

MyBatis整体架构包含哪些层呢?这些层次是如何设计的呢?

一:MyBatis架构概览

在这里插入图片描述

在这里插入图片描述

1:接口层

接口层主要负责处理和数据库交互的方式,门面

MyBatis和数据库的交互有两种方式:使用==传统的MyBatis提供的API ==& 使用Mapper接口

1.1:使用传统的MyBatis提供的API

这是传统的传递Statement Id 和查询参数给 SqlSession 对象,使用 SqlSession对象完成和数据库的交互

在这里插入图片描述
MyBatis 提供了非常方便和简单的API,供用户实现对数据库的增删改查数据操作,以及对数据库连接信息和MyBatis 自身配置信息的维护操作

在这里插入图片描述
上述使用MyBatis 的方法,是创建一个和数据库打交道的SqlSession对象

然后根据Statement Id 和参数来操作数据库,这种方式固然很简单和实用,但是它不符合面向对象语言的概念和面向接口编程的编程习惯。

由于面向接口的编程是面向对象的大趋势,MyBatis 为了适应这一趋势,增加了第二种使用MyBatis 支持接口(Interface)调用方式

1.2:使用Mapper接口

MyBatis 将配置文件中的每一个<mapper> 节点抽象为一个 Mapper 接口

而这个接口中声明的方法和跟 <mapper> 节点中的<select|update|delete|insert> 节点项对应,即:

  • <select|update|delete|insert> 节点的id值 ===> Mapper 接口中的方法名称
  • parameterType 值 ===> Mapper 对应方法的入参类型
  • resultMap 值 ===> Mapper 接口表示的返回值类型或者返回结果集的元素类型

在这里插入图片描述
根据 MyBatis 的配置规范配置好后,通过 SqlSession.getMapper(XXXMapper.class) 方法,MyBatis 会根据相应的接口声明的方法信息,通过动态代理机制生成一个 Mapper 实例[代理模式]

在这里插入图片描述
我们使用 Mapper 接口的某一个方法时,MyBatis 会根据这个方法的方法名和参数类型,确定Statement Id

底层还是通过 SqlSession.select(id, param);SqlSession.update(id, param); 等等来实现对数据库的操作

MyBatis 引用 Mapper 接口这种调用方式,纯粹是为了满足面向接口编程的需要。

其实还有一个原因是在于,面向接口的编程,使得用户在接口上可以使用注解来配置SQL语句,这样就可以脱离XML配置文件,实现“0配置”

2:数据处理层【核心】

数据处理层可以说是MyBatis 的核心,从大的方面上讲,它要完成两个功能:

  • 通过传入参数构建动态SQL语句 => paramObject -> SQL语句
  • ==SQL语句的执行以及封装查询结果集成 List ===> SQL语句 -> execute & result -> List
2.1:参数映射和动态SQL语句生成

动态语句生成可以说是MyBatis框架非常优雅的一个设计,MyBatis 通过传入的参数值,使用 Ognl 来动态地构造SQL语句

这使得MyBatis 有很强的灵活性和扩展性。

参数映射指的是对于 java 数据类型 <-> jdbc数据类型之间的转换:这里有包括两个过程:

  • 查询阶段,要将java类型的数据,转换成jdbc类型的数据,通过 preparedStatement.setXXX() 来设值;
  • 结果阶段,就是对resultset查询结果集的jdbcType 数据转换成java 数据类型

在这里插入图片描述

2.2:SQL语句的执行以及封装结果集

动态SQL语句生成之后,MyBatis 将执行SQL语句,并将可能返回的结果集转换成List<E> 列表。

MyBatis 在对结果集的处理中,支持结果集关系一对多(1 ~ N)和多对一(N ~ 1)的转换,并且有两种支持方式:

  • 一种为嵌套查询语句的查询
  • 还有一种是嵌套结果集的查询

3:框架支撑层

事务管理机制

事务管理机制对于ORM框架而言是不可缺少的一部分,事务管理机制的质量也是考量一个ORM框架是否优秀的一个标准

连接池管理机制

由于创建一个数据库连接所占用的资源比较大,对于数据吞吐量大和访问量非常大的应用而言,连接池的设计就显得非常重要

缓存机制

为了提高数据利用率和减小服务器和数据库的压力,MyBatis 会对于一些查询提供会话级别的数据缓存

数据缓存会将对某一次查询,放置到SqlSession 中

缓存可是使得在允许的时间间隔内,对于完全相同的查询,MyBatis 会直接将缓存结果返回给用户,而不用再到数据库中查找

SQL语句的配置方式

传统的MyBatis 配置 SQL 语句方式就是使用 XML 文件进行配置的,但是这种方式不能很好地支持面向接口编程的理念

为了支持面向接口的编程,MyBatis 引入了 Mapper 接口的概念,面向接口的引入,对使用注解来配置 SQL 语句成为可能

用户只需要在接口上添加必要的注解即可,不用再去配置XML文件了

但是,目前的 MyBatis 只是对注解配置 SQL 语句提供了有限的支持,某些高级功能还是要依赖 XML 配置文件配置 SQL 语句

4:引导层

引导层是配置和启动MyBatis配置信息的方式。 MyBatis 提供两种方式来引导MyBatis:

  • 基于XML配置文件的方式
  • 基于Java API 的方式

二:主要构件及其相互关系

1:核心构件的层次关系

在这里插入图片描述

2:核心部件说明

主要的核心部件如下:

核心部件解释说明
SqlSession作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
ExecutorMyBatis 执行器,是 MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
StatementHandler封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合
ParameterHandler负责对用户传递的参数转换成JDBC Statement 所需要的参数(param -> Statement)
ResultSetHandler负责将JDBC返回的ResultSet结果集对象转换成List类型的集合(resultSet -> List)
TypeHandler负责java数据类型和jdbc数据类型之间的映射和转换(数据映射)
MappedStatement维护了一条`<select
SqlSource负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
BoundSql表示动态生成的SQL语句以及相应的参数信息
ConfigurationMyBatis所有的配置信息都维持在Configuration对象之中

相关文章:

Mybatis源码01 - 总体框架设计

Mybatis总体框架设计 文章目录 Mybatis总体框架设计一&#xff1a;MyBatis架构概览1&#xff1a;接口层1.1&#xff1a;使用传统的MyBatis提供的API1.2&#xff1a;使用Mapper接口 2&#xff1a;数据处理层【核心】2.1&#xff1a;参数映射和动态SQL语句生成2.2&#xff1a;SQL…...

在大型语言模型(LLM)框架内Transformer架构与混合专家(MoE)策略的概念整合

文章目录 传统的神经网络框架存在的问题一. Transformer架构综述1.1 transformer的输入1.1.1 词向量1.1.2 位置编码&#xff08;Positional Encoding&#xff09;1.1.3 编码器与解码器结构1.1.4 多头自注意力机制 二.Transformer分步详解2.1 传统词向量存在的问题2.2 详解编解码…...

Selenium WebDriver自动化测试(扩展篇)--Jenkins持续集成

文章目录 一、引言二、Jenkins简介三、安装部署Jenkins安装部署 四、集成Git与Maven安装必要的插件配置Git配置Maven 五、创建Job创建自由风格的项目配置源码管理配置构建触发器配置构建环境配置构建步骤配置Post-build Actions 六、触发构建示例&#xff1a;GitHub Webhook触发…...

Wiki文档转换为Word技术

一、技术背景与目标 Wiki系统导出的文档通常以HTML格式存在,且内容分散在多个文件中,每个页面对应一个HTML文件。然而,Microsoft Word(Word)在处理HTML文件时,仅支持单个HTML文件的导入。因此,为了将Wiki导出的内容转换为Word可识别的格式,必须将分散的HTML文件整合为一…...

1.【线性代数】——方程组的几何解释

一 方程组的几何解释 概述举例举例一1. matrix2.row picture3.column picture 概述 三种表示方法 matrixrow picturecolumn picture 举例 举例一 { 2 x − y 0 − x 2 y 3 \begin{cases} 2x - y 0 \\ -x 2y 3 \end{cases} {2x−y0−x2y3​ 1. matrix [ 2 − 1 − 1 …...

力扣1448. 统计二叉树中好节点的数目

Problem: 1448. 统计二叉树中好节点的数目 文章目录 题目描述思路复杂度Code 题目描述 思路 对二叉树进行先序遍历&#xff0c;边遍历边对比并更新当前路径上的最大值pathMax&#xff0c;若当pathMax小于等于当前节点值&#xff0c;则好节点的数目加一 复杂度 时间复杂度: O (…...

【C#零基础从入门到精通】(二)——C#注释和命名法详解

【C#零基础从入门到精通】(二)——C#注释和命名法详解 C# 中的注释 定义 在 C# 里,注释是一种特殊的代码文本,它不会被编译器执行,主要用于对代码进行解释、说明,帮助开发者更好地理解代码的功能、用途、实现思路以及注意事项等,提升代码的可读性和可维护性。 注释类型…...

SQLServer的创建,表创建,主键,约束,模糊查询

设置 注意: 设置完成之后 重新启动 创建数据库 注意: 这个目标路径必须要有该文件名的文件夹 -- 指向 master 数据库&#xff0c;告诉它我们要创建一个新的数据库操作了 use master go-- 创建数据库 create database StudentManageDB on primary (-- 以下四个组成部分缺一不可…...

DeepSeek深度思考:客户端(Android/iOS)架构设计指南

目标读者&#xff1a;中高级开发者、架构师 适用场景&#xff1a;大型复杂应用开发、跨团队协作、长期维护迭代 一、架构设计核心原则 1.模块化&#xff08;Modularization&#xff09; 横向拆分&#xff1a;按功能边界划分&#xff08;如登录、支付、消息模块&#xff09;纵向…...

亚远景-精通ASPICE:专业咨询助力汽车软件开发高效合规

在竞争日益激烈的汽车行业&#xff0c;软件开发已成为决定成败的关键因素。ASPICE&#xff08;汽车软件过程改进和能力确定&#xff09; 作为行业公认的软件开发框架&#xff0c;为汽车制造商和供应商提供了实现高效、合规开发的路线图。 然而&#xff0c;ASPICE 的实施并非易…...

OpenCV 相机标定流程指南

OpenCV 相机标定流程指南 前置准备标定流程结果输出与验证建议源代码 OpenCV 相机标定流程指南 https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html https://learnopencv.com/camera-calibration-using-opencv/ 前置准备 制作标定板&#xff1a;生成高精度棋…...

项目场景拷打

补偿事务解决超卖 通过补偿事务避免超卖问题&#xff0c;可以通过以下几种方式实现&#xff1a; 1. 使用数据库事务与锁机制 事务管理&#xff1a;将库存扣减和订单生成操作放在同一个数据库事务中&#xff0c;确保操作的原子性。如果事务中任何一个步骤失败&#xff0c;则整…...

Vue2生命周期面试题

在 Vue 2 中&#xff0c;this.$el 和 this.$data 都是 Vue 实例的属性&#xff0c;代表不同的内容。 1. this.$el this.$el 是 Vue 实例的根 DOM 元素&#xff0c;它指向 Vue 实例所控制的根节点元素。在 Vue 中&#xff0c;el 是在 Vue 实例创建时&#xff0c;指定的根元素&…...

【每日一题 | 2025】2.3 ~ 2.9

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;每日一题 文章目录 1. 【2.3】P8784 [蓝桥杯 2022 省 B] 积木画2. 【2.4】P8656 [蓝桥杯 2017 国 B] 对局匹配3. 【2.5】[ABC365D] AtCoder Janken 34. 【2.6】P8703 [蓝桥杯 2019 国 B] 最优包含5. 【2.7】P8624 [蓝桥杯 2015…...

使用OpenGL自己定义一个button,响应鼠标消息:掠过、点击、拖动

button需要有一个外观 外观 大小跟随窗口改变&#xff0c;采用纯色背景、纯色文字 文字 大小跟随窗口改变 button需要获得鼠标消息 掠过 鼠标掠过时 button 出现阴影&#xff0c;鼠标掠过后 button 阴影消失 点击 点击后进入相应事件 拖动 改变图标所在位置 需要在g…...

C# 上位机--变量

C# 上位机--变量 在 C# 上位机开发领域&#xff0c;变量是构建程序逻辑的基础元素之一。它就像是一个容器&#xff0c;用于存储各种类型的数据&#xff0c;从简单的数值到复杂的对象。正确理解和使用变量&#xff0c;对于开发出高效、稳定且易于维护的上位机程序至关重要。本文…...

网络安全检查漏洞内容回复 网络安全的漏洞

的核心目标是保障业务系统的可持续性和数据的安全性&#xff0c;而这两点的主要威胁来自于蠕虫的暴发、黑客的攻击、拒绝服务攻击、木马。蠕虫、黑客攻击问题都和漏洞紧密联系在一起&#xff0c;一旦有重大安全漏洞出现&#xff0c;整个互联网就会面临一次重大挑战。虽然传统木…...

【GIS】本地部署nominatim地理编码服务

参考&#xff1a;https://www.cnblogs.com/nonkicat/p/17222677.html docker 部署命令 4.5 版本 docker 用不了&#xff0c;需要用 4.0 版本 docker run -it -e PBF_PATH/data/你的osm文件.osm.pbf -e FREEZEtrue -e POSTGRES_MAX_CONNECTIONS100 -p 6666:8080 --…...

HTML之JavaScript对象声明

HTML之JavaScript对象声明 常用&#xff1a;方式1&#xff1a;new Object() 创建一个空对象方式2&#xff1a;{属性名:属性值,属性名:属性值,...函数名:function(){}} 创建一个对象<!DOCTYPE html> <html lang"en"> <head><meta charset&quo…...

PyCharm结合DeepSeek-R1

PyCharm结合DeepSeek-R1&#xff0c;打造专属 AI 编程助手 在程序员的日常工作中&#xff0c;提高编程效率、快速解决代码问题是重中之重。今天给大家分享一个强强联合的组合 ——PyCharm 插件 Continue 与 DeepSeek-R1&#xff0c;它们能帮你打造出强大的个人 AI 编程助手。 …...

终极HTTP请求控制指南:如何用HeaderEditor轻松掌握浏览器网络调试

终极HTTP请求控制指南&#xff1a;如何用HeaderEditor轻松掌握浏览器网络调试 【免费下载链接】HeaderEditor Manage browsers requests, include modify the request headers, response headers, response body, redirect requests, cancel requests 项目地址: https://gitc…...

Geckodriver终极指南:快速安装Firefox自动化测试工具

Geckodriver终极指南&#xff1a;快速安装Firefox自动化测试工具 【免费下载链接】geckodriver WebDriver Classic proxy for automating Firefox through Marionette 项目地址: https://gitcode.com/gh_mirrors/ge/geckodriver Geckodriver是连接W3C WebDriver客户端与…...

JDspyder:3步掌握Python自动化工具,告别手动操作烦恼

JDspyder&#xff1a;3步掌握Python自动化工具&#xff0c;告别手动操作烦恼 【免费下载链接】JDspyder 京东预约&抢购脚本&#xff0c;可以自定义商品链接 项目地址: https://gitcode.com/gh_mirrors/jd/JDspyder 你是否曾经因为错过心仪商品的购买时间而感到遗憾&…...

多智能体编排实战:从架构设计到生产部署的12周训练指南

1. 项目概述与核心价值最近在探索如何系统性地掌握多智能体编排技术时&#xff0c;我遇到了一个名为“Shadow Dojo”的开源项目。这个名字很有意思&#xff0c;“道场”一词本身就意味着一个需要持续练习、精进技艺的地方。这个项目将自己定位为“训练场”&#xff0c;目标非常…...

从源码到桌面:手把手教你用Python搭建SimpleFOCStudio开发环境(Windows/Mac)

从源码到桌面&#xff1a;手把手教你用Python搭建SimpleFOCStudio开发环境&#xff08;Windows/Mac&#xff09; 在开源硬件和电机控制领域&#xff0c;SimpleFOCStudio已成为开发者调试无刷电机的利器。不同于直接下载可执行文件的"快餐式"使用&#xff0c;从源码构…...

终极Python代码混淆指南:保护敏感逻辑的7个实用方法

终极Python代码混淆指南&#xff1a;保护敏感逻辑的7个实用方法 【免费下载链接】python-mastery Advanced Python Mastery (course by dabeaz) 项目地址: https://gitcode.com/gh_mirrors/py/python-mastery GitHub 加速计划 / py / python-mastery项目是 Advanced Pyt…...

EPLAN浮动许可利用率低:软件许可浪费,解决许可不足

EPLAN浮动许可利用率低&#xff1f;别再浪费了&#xff01;你是不是也遇到过这种事&#xff1a;新项目启动前看许可证池还有几个名额&#xff0c;结果发现上个月的几个许可证一直在等&#xff1f;我就踩了这个坑&#xff0c;发现公司用EPLAN的几个项目组天天在"抢"许…...

WechatDecrypt:如何安全解密微信聊天记录的完整技术指南

WechatDecrypt&#xff1a;如何安全解密微信聊天记录的完整技术指南 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 在数字时代&#xff0c;我们的重要对话和回忆往往存储在加密的聊天记录中。当需要迁移…...

微博图片智能采集器:一键构建你的专属视觉素材库

微博图片智能采集器&#xff1a;一键构建你的专属视觉素材库 【免费下载链接】weibo-image-spider 微博图片爬虫&#xff0c;极速下载、高清原图、多种命令、简单实用。 项目地址: https://gitcode.com/gh_mirrors/we/weibo-image-spider 还在为手动保存微博图片而烦恼吗…...

给 Agent 配一个浏览器:Cloudflare Browser Run 全面解析

互联网是为人类建的&#xff0c;Agent 要用它 Agent 需要和网页交互。填表单、提取数据、截图、导航——这些是 Agent 执行任务的基本动作。问题是&#xff0c;整个互联网的设计预设是"有一个人坐在屏幕前操作"。Agent 不是人&#xff0c;它没有鼠标&#xff0c;没有…...