MyBatis源码分析(二):项目结构

目录

1、前言

2、代码统计

3、整体架构

3.1、基础支持层

3.1.1、反射模块

3.1.2、类型模块

3.1.3、日志模块

3.1.4、IO模块

3.1.5、解析器模块

3.1.6、数据源模块

3.1.7、缓存模块

3.1.8、Binding 模块

3.1.9、注解模块

3.1.10、异常模块

3.2、核心处理层

3.2.1、配置解析模块

3.2.2、SQL解析模块

3.2.3、插件模块

3.3、接口层

3.3.1、session 模块

3.4、其他

3.4.1、JDBC 模块

3.4.2、Lang 模块

4、总结


 

1、前言

上一篇我们搭建了MyBatis的测试环境MyBatis源码分析(一):搭建调试环境

为了让大家对MyBatis的整体结构有一定的了解,本文主要分享一下关于Mybatis的项目结构。

拉取了MyBatis项目后,发现拆分的包好多啊。是不是感到了莫名的恐惧?

dd5d7c78c48147fa86c684ee8b7c0960.jpeg

不要怕哦,阅读源码肯定是一件不太容易的事情,但是你要是想成为一名优秀的程序猿,就要坚持读下去。

5c37195e3c3944b596d88774ed49d32a.png

2、代码统计

阅读一个项目源码的时候,首先要知道这个项目是干啥的,同时我们也非常有必要的了解一下该项目的代码量,做到心中有数。

统计代码量的方式有很多,我比较喜欢使用IDE Statistic 插件

安装 Statistic
1、打开IDEA的设置
2、选择插件[plugin]
3、选择[browse repositories)
4、搜索 Statistic
5、安装
18851240acda446082be0de44f229394.png

使用 Statistic

1、打开IDEA 菜单 View
2、选择 Tool window
3、点击 Statistic
4、可以看到不同类型文件的统计
5、refresh 重新统计
6、上面的tab 切换可以查看不同类型文件的统计

2c699ff2376e4d10bbc3aa00fe7c570f.png

使用 Statistic我们可以看到

5385cf5a42864bd898e3b676b10729ae.png

代码大概在63406.好大啊。不过这是包含了一些单元测试的代码。不管了,继续看。

81ab4a6bbc0e4332ab1678f5594eb799.jpeg

3、整体架构

MyBatis 的整体架构分为三层:

  1. 基础支持层:负责MyBatis与数据库连接方式管理、管理方式、缓存管理、配置文件加载
  2. 核心处理层:负责参数解析与参数绑定、sql解析、结果映射的解析以及处理
  3. 接口层:核心是 SqlSession 接口,该接口中定义了 MyBatis 暴露给应用程序调用的 API

0eb07c71533c42e0afbbb0e757788a2e.webp

3.1、基础支持层

3.1.1、反射模块

该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API,方便上层使调用,并且对反射操作进行了一系列优化

包路径:org/apache/ibatis/reflection

0bc683fa104b45fba47beb62f8f254aa.png

3.1.2、类型模块

类型模型提供了别名机制,这也是该模块的主要功能

类型模块时间了JDBC类型与JAVA类型的转换:  

  • 在为 SQL 语句绑定实参时,会将数据由 Java 类型转换成 JDBC 类型。
  • 而在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型。

包路径:org/apache/ibatis/type

 

5e231dded91849c6b5838006b996a47a.png

3.1.3、日志模块

Mybatis可以详细的输入日志信息,同时还可以集成多种日志框架,例如 Log4j、Slf4j 等

包路径:org/apache/ibatis/type

41e50026612c431daad97cf7174acfd1.png

3.1.4、IO模块

主要是对类加载器进行封装,确定类加载器的使用顺序,加载类文件以及其他资源文件

包路径:org/apache/ibatis/io

56499bd2799040a8bebe84fd44b4b21f.png

3.1.5、解析器模块

  • 该模块对XPATH进行分装,解析mybatis-config.xml 配置文件以及映射配置文件
  • 支持处理动态 SQL 语句中的占位符

包路径:org/apache/ibatis/parsing

a2239d7b42274accbf6a15cbd12d3f4f.png

3.1.6、数据源模块

MyBatis 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现

包路径:org/apache/ibatis/datasource

8f6a225dfad449ce97fe46b8505bdcd9.png

3.1.7、缓存模块

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

包路径:org/apache/ibatis/cache

8f0e0de17b4b40d796248e0e8dbce4e8.png

3.1.8、Binding 模块

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

包路径:org/apache/ibatis/binding

04b0bcdc78d64476ba54b67fc7bbc69a.png

3.1.9、注解模块

MyBatis 提供了注解的方式,在Mapper接口直接写SQL代码

包路径:org/apache/ibatis/annotations

c6f1af70d3d24258b7ef6878b0f200d1.png

3.1.10、异常模块

定义了 MyBatis 专有的 PersistenceException 和 TooManyResultsException 异常。

包路径:org/apache/ibatis/exceptions

3747cca5f0094b6dafd7757d358642ca.png

3.2、核心处理层

3.2.1、配置解析模块

对应 builder 和 mapping 模块。前者为配置解析过程,后者主要为 SQL 操作解析后的映射

在 MyBatis 初始化过程中,会加载 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configuration 对象中

之后,利用该 Configuration 对象创建 SqlSessionFactory对象。待 MyBatis 初始化之后,开发人员可以通过初始化得到 SqlSessionFactory 创建 SqlSession 对象并完成数据库操作

包路径:org/apache/ibatis/builder 

f9bfcfd866de47a5bf5331e1991a56af.png

包路径:org/apache/ibatis/mapping

4d869877ba58486686c877d3609d14fd.png

3.2.2、SQL解析模块

scripting 模块,会根据用户传入的实参,解析映射文件中定义的动态 SQL 节点,并形成数据库可执行的 SQL 语句

包路径:org/apache/ibatis/scripting

395c10b1a894425d93174274ef88e977.png

3.2.3、SQL执行模块

对应 executor 和 cursor 模块。前者对应执行器,后者对应执行结果的游标

SQL 语句的执行涉及多个组件 ,其中比较重要的是 Executor、StatementHandler、ParameterHandler 和 ResultSetHandler 。

  • Executor 主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作,它会将数据库相关操作委托给 StatementHandler完成。
  • StatementHandler 首先通过 ParameterHandler 完成 SQL 语句的实参绑定,然后通过 java.sql.Statement 对象执行 SQL 语句并得到结果集,最后通过 ResultSetHandler 完成结果集的映射,得到结果对象并返回。

包路径:org/apache/ibatis/executor

29b6a8c1d1d145f594914a086a7254f5.png

包路径:org/apache/ibatis/cursor

ea111fcbb1d442b78f5659f956df0d5a.png

3.2.3、插件模块

MyBatis 提供了插件接口,我们可以通过添加用户自定义插件的方式对 MyBatis 进行扩展。用户自定义插件也可以改变 Mybatis 的默认行为,例如,我们可以拦截 SQL 语句并对其进行重写。

包路径:org/apache/ibatis/plugin

ee0e8e7f0c4d42388bd292836afcf5a3.png

3.3、接口层

3.3.1、session 模块

其核心是 SqlSession 接口。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作

包路径:org/apache/ibatis/session

54791813b3404b519b04eec9f3f853b1.png

3.4、其他

3.4.1、JDBC 模块

JDBC 单元测试工具类

包路径:org/apache/ibatis/jdbc

8fed3dec5f804ed99bda2a39d4ed09ad.png

3.4.2、Lang 模块

里面只包含两个注解,用途不详

包路径:org/apache/ibatis/lang

d32373eb85b7487eb324d70faec95be1.png

4、总结

Mybatis的代码还是比较简单易懂的。http://www.mybatis.org 也提供了中文文档,有兴趣的小伙伴可以翻阅查看哦。后续的文章,将会逐步讲解各个模块,敬请期待!

Mybatis源码解析传送门

MyBatis源码分析(一):搭建调试环境

MyBatis源码分析(三):解析器模块

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch简介

1.1 Pytorch的历史 PyTorch是一个由Facebook的人工智能研究团队开发的开源深度学习框架。在2016年发布后,PyTorch很快就因其易用性、灵活性和强大的功能而在科研社区中广受欢迎。下面我们将详细介绍PyTorch的发展历程。 在2016年,Facebook的AI研究团队…

【C++】Ubuntu编译filezilla client

在新版Ubuntu 22.04.3 LTS上编译filezilla client成功,shell命令如下: sudo apt-get install libfilezilla-dev libwxbase3.0-dev gnutls-dev libdbus-1-dev sudo apt-get install libwxgtk3.0-gtk3-dev sudo apt-get install libgtk-3-dev sudo apt-ge…

【GO语言卵细胞级别教程】01.GO基础知识

01.GO基础知识 目录 01.GO基础知识1.GO语言的发展历程2.发展历程3.Windowns安装4.VSCode配置5.基础语法5.1 第一段代码5.2 GO执行的流程5.3 语法规则5.4 代码风格5.5 学习网址 1.GO语言的发展历程 Go语言是谷歌公司于2007年开始开发的一种编程语言,由Robert Griese…

Python从入门到精通之元类

系列 Python从入门到精通之安装与快速入门-CSDN博客 Python从入门到精通之基本数据类型和变量-CSDN博客 Python从入门到精通之集合(List列表、Tuple元组、Dict字典、Set)-CSDN博客 Python从入门到精通之条件语句、循环语句和函数-CSDN博客 Python从…

STM32疑难杂症

1.keil的奇怪问题 创建的数组分配内存到0x10000000地址的时候,数据总是莫名其妙的出现问题,取消勾选就正常了 stm32f407内部有一个CCM内存,这部分内存只能由内核控制,任何外设都不能够进行访问。这样问题就来了,如果使…

ES6 class详解

✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…

基于SSM框架的宠物商城系统

开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 功能模块&…

基于引力搜索算法优化的Elman神经网络数据预测 - 附代码

基于引力搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于引力搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于引力搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

(leetcode)判断字符是否唯一 -- 使用位图(位运算)

个人主页:Lei宝啊 愿所有美好如期而遇 目录 本题链接 输入描述 输出描述 算法分析 算法一:哈希表 算法二:位运算(位图) 解题源码 本题链接 力扣(LeetCode) 输入描述 接口:bool isUnique(st…

【AIGC风格prompt】风格类绘画风格的提示词技巧

风格类绘画风格的提示词展示 主题:首先需要确定绘画的主题,例如动物、自然景观、人物等。 描述:根据主题提供详细的描述,包括颜色、情感、场景等。 绘画细节:描述绘画中的细节,例如表情、纹理、光影等。 场…

分布式(7)

目录 31.基于Zookeeper如何实现分布式锁? 32.什么是ACID? 33.什么是分布式的XA协议? 34.什么是2PC? 35.什么是3PC? 31.基于Zookeeper如何实现分布式锁? 顺序节点 创建一个用于发号的节点“/test/lock…

Go语言学习

运行和解析 go run 命令已包含了编译和运行。它会先在一个临时目录编译程序,然后执行完后清理掉. 如果在run的后面加上 --work参数来查看临时目录。go run --work main.go也可以通过go build命令来编译代码,执行后会生成一个可以执行文件,通…

商家如何通过会员充值消费管理系统提升业务运营与用户体验

在当今数字化商业环境中,会员充值消费管理系统已经成为各类商家提高客户粘性、优化服务流程、增强市场竞争力的重要工具。那么如何通过会员充值消费管理系统提升业务运营与用户体验,商家是否有所了解呢?下面就带大家简单了解。 首先&#xf…

[每周一更]-(第50期):Go的垃圾回收GC

参考文章: https://juejin.cn/post/7111515970669117447https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-garbage-collector/https://colobu.com/2022/07/16/A-Guide-to-the-Go-Garbage-Collector/https://liangyaopei.github.io/2021/01/02/g…

【深度学习每日小知识】数据增强

数据增强是通过对原始数据进行各种转换和修改来人工生成附加数据的过程,旨在增加机器学习模型中训练数据的大小和多样性。这对于计算机视觉领域尤为重要,因为图像经常被用作输入数据。 计算机视觉中的数据增强 数据增强的主要目标是解决过拟合问题&…

数据库的学习笔记——第一篇

SQL通用语法 SQL语句 DDL 数据定义 数据库、表字段 DML 数据操作 增删改 DQL 数据查询 查询表中记录 DCL 数据控制 创建用户、控制用户权限 DLL语句——数据库操作 SHOW DATABASES; # 查询数据库SELECT DATABASE(); # 查询当前数据库CREATE DATABASE [IF …

【C语言】函数

函数是什么? “函数”是我们早些年在学习数学的过程中常见的概念,简单回顾一下:比如下图中,你给函数 f(x)2*x3 一个具体的x,这个函数通过一系列的计算来返回给你一个结果(图示如下)。 这就是数学中函数的基本过程和作用。但是你…

Python实现PowerPoint(PPT/PPTX)到PDF的批量转换

演示文稿是一种常见传达信息、展示观点和分享内容的形式,特别是PowerPoint演示文稿,广泛应用于各行各业,几乎是演讲等场合的必备工具。然而,演示文稿也有其限制,对设备的要求较高,且使用不同的软件或设备演…

PyTorch 入门学习数据操作之创建

简介 在深度学习中,我们通常会频繁地对数据进行操作;要操作一般就需要先创建。 官方介绍 The torch package contains data structures for multi-dimensional tensors and defines mathematical operations over these tensors. Additionally, it pr…

x-cmd pkg | bit - 实验性的现代化 git CLI

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 bit,由 Chris Walz 于 2020 年使用 Go 语言开发,提供直观的命令行补全提示和建立在 git 命令之上的封装命令,旨在建立完全兼容 git 命令的现代化 CLI。 首次用户 使用 x bit 即可自…