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

从仿写持久层框架到MyBatis核心源码阅读

接上篇手写持久层框架:https://blog.csdn.net/liwenyang1992/article/details/134884703

MyBatis源码

MyBatis架构原理&主要组件

MyBatis架构设计

在这里插入图片描述

MyBatis架构四层作用是什么呢?

API接口层:提供API,增加、删除、修改、查询等接口,通过API接口对数据库进行操作。

数据处理层:主要负责SQL的 查询、解析、执行以及结果映射的处理,主要作用解析SQL根据调用请求完成一次数据库操作。

框架支撑层:负责通用基础服务支撑,包含事务管理、连接池管理、缓存管理等共用组件的封装,为上层提供基础服务支撑。

在这里插入图片描述

包路径org.apache.ibatis

包路径作用备注
annotationsMapper映射器接口中使用到的注解
bindingMapper映射器接口与映射语句关系绑定构建
builderConfiguration配置的构建包
cache缓存实现与定义(包含一级/二级缓存)
cursor游标(针对查询结果集的获取与遍历等)
datasource数据源/连接池
exceptions异常包
executor语句执行器(包含参数/结果集/语句处理等)
io资源读取辅助包
jdbcMyBatis内部的SQL脚本运行的测试包
logging一套日志接口和适配器包
mappingMapper映射器相关参数/语句/结果/类型等对象包
parsingXML解析包(例如#{}占位符解析)
plugin插件包
reflection反射处理工具包
scriptingSQL执行脚本的解析处理包
session数据库连接会话核心包(会话创建/管理/调用)
transaction事务
type类型处理器(定义bean与数据库类型的转换关系)
XML映射器

MyBatis的真正强大在于它的语句映射,这是它的魔力所在,由于它的异常强大,映射器的XML文件就显得相对简单。如果拿它跟具有相同功能的JDBC代码进行对比,你会立即发现省掉了将近95% 的代码。MyBatis致力于减少使用成本,让用户能更专注于 SQL 代码。

SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):

  • cache:该命名空间的缓存配置
  • cache-ref:引用其它命名空间的缓存配置。
  • resultMap:描述如何从数据库结果集中加载对象,是最复杂也是最强人的元素
  • sql:可被其它语句引用的可重用语句块。
  • insert:映射插入语句。
  • update:映射更新语句
  • delete:映射删除语句。
  • select:映射查询语句。
select

select元素允许你配置很多属性来配置每条语句的行为细节

    <selectid="select"parameterType="int"resultType="resultType"resultMap="resultMap"flushCache="false"useCache="true"timeout="10"fetchSize="256"statementType="PREPARED"resultSetType="FORWARD_ONLY"></select>
insert, update 和 delete

数据变更语句insert, update 和 delete 的实现非常接近

动态SQL

借助功能强大的基于OGNL的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’<choose><when test="title != null">AND title like #{title}</when><when test="author != null and author.name != null">AND author_name like #{author.name}</when><otherwise>AND featured = 1</otherwise></choose>
</select>

XMLScriptBuilder

public SqlSource parseScriptNode()方法:

  1. 解析select、insert、update、delete标签中的SQL语句
  2. 最终将解析到的SqlNode封装到MixedSqlNode中的List集合中
  • 将带有${}号的SQL信息封装到TextSqlNode
  • 将带有#{}号的SQL信息封装到StaticTextSqlNode
  • 将动态SQL标签中的SQL信息分别封装到不同的SqlNode中
  • 如果SQL中包含${}和动态SQL语句,则将SqlNode封装到DynamicSqlSource

在这里插入图片描述

相关类与接口
DefaultSqlSession

SqlSession接口的默认实现类

Executor接口:

在这里插入图片描述

BaseExecutor:基础执行器,封装了子类的公共方法及公共变量,包括一级缓存、延迟加载、回滚、关闭等功能;

SimpleExecutor:简单执行器,每执行一条SQL,都会打开一个 Statement,执行完成后关闭;

ReuseExecutor:重用执行器,相较于 SimpleExecutor多了 Statement 的缓存功能,其内部维护一个Map<String, Statement>,每次编译完成的Statement 都会进行缓存,不会关闭;

BatchExecutor:批量执行器,基于JDBC的addBatch、executeBatch功能,并且在当前SQL和上一条SQL完全一样的时候,重用Statement,在调用doFlushStatements的时候,将数据刷新到数据库;

CachingExecutor:缓存执行器,装饰器模式,在开启缓存的时候。会在上面三种执行器的外面包上 CachingExecutor;

缓存执行过程

在这里插入图片描述

SimpleExecutor#doQuery

在这里插入图片描述

  • BaseStatementHandler:基础语句处理器(抽象类),它基本把语句处理器接口的核心部分都实现了,包括配置绑定、执行器绑定、映射器绑定、参数处理器构建、结果集处理器构建、语句超时设置、语句关闭等,并另外定义了新的方法 instantiateStatement供不同子类实现以使获取不同类型的语句连接,子类可以普通执行 SQL语句,也可以做预编译执行,还可以执行存储过程等
  • SimpleStatementHandler:普通语句处理器,继承BaseStatementHandler抽象类,对应 java.sql.Statement 对象的外理,处理普通的不带动态参数运行的SQL,即执行简单拼接的字符串语句,同时由于 Statement 的特性,SimpleStatementHandler 每次执行都需要编译 SQL**(注意:我们知道 SQL 的执行是需要编译和解析的)。**
  • PreparedStatementHandler:预编译语句处理器,继承BaseStatementHandler抽象类,对应 java.sql.PrepareStatement 对象的处理,相比上面的普通语句处理器,它支持可变参数 SQL执行,由于 PrepareStatement 的特性,它会进行预编译,在缓存中一旦发现有预编译的命令,会直接解析执行,所以减少了再次编译环节,能够有效提高系统性能,并预防 SQL 注入攻击**(所以是系统默认也是我们推荐的语句处理器)**
  • CallableStatementHandler:存储过程外理器,继承BaseStatementHandler抽象类,对应 java.sql.CallableStatement 对象的处理,很明了,它是用来调用存储过程的,增加了存储过程的函数调用以及输出/输入参数的处理支持。
  • RoutingStatementHandler:路由语句处理器,直接实现了 StatementHandler 接口,作用如其名称,确确实实只是起到了路由功能,并把上面介绍到的三个语句处理器实例作为自身的委托对象而已,所以执行器在构建语句处理器时,都是直接 new了RoutingStatementHandler实例。

附件中包含测试用例代码,可设置jdk17调试运行,带注解。

相关文章:

从仿写持久层框架到MyBatis核心源码阅读

接上篇手写持久层框架&#xff1a;https://blog.csdn.net/liwenyang1992/article/details/134884703 MyBatis源码 MyBatis架构原理&主要组件 MyBatis架构设计 MyBatis架构四层作用是什么呢&#xff1f; API接口层&#xff1a;提供API&#xff0c;增加、删除、修改、查询…...

浏览器常用基本操作之python3+selenium4自动化测试

1、打开指定的网页地址 我们使用selenium进行自动化测试时&#xff0c;打开浏览器之后&#xff0c;第一步就是让浏览器访问我们指定的地址&#xff0c;可使用get方法实现 1 2 3 from selenium import webdriver driver webdriver.Edge() driver.get(https://www.baidu.com/)…...

在MySQL中使用VARCHAR字段进行日期筛选

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

微信小程序自定义步骤条效果

微信小程序自定义一个步骤条组件&#xff0c;自定义文字在下面&#xff0c;已完成和未完成和当前进度都不一样的样式&#xff0c;可点击上一步和下一步切换流程状态&#xff0c;效果如下。 这是视频效果&#xff1a; 前端实现步骤条效果 下面我们一步步实现编码&#xff0c;自定…...

QT的信号与槽

QT的信号与槽 文章目录 QT的信号与槽前言一、QT 打印"hello QT"的dome二、信号和槽机制&#xff1f;二、信号与槽的用法1、QT5的方式1. 无参的信号与槽的dome2.带参的信号与槽dome 2、QT4的方式3、C11的语法 Lambda表达式1、函数对象参数2、操作符重载函数参数3、可修…...

Python 为UnityAndroid端自动化接入Tradplus广告SDK

Python 为UnityAndroid端自动化接入Tradplus广告SDK Tradplus介绍常规接入进入Android开发文档选择渠道配置生成接入代码人工依赖下载官网同版本的 Unity插件 使用自动化工具接入首次 你需要打两个标记来定位运行工具 控制台会列出最新的十个Tradplus版本 任选其一然后拖入项目…...

Matplotlib基础

目录&#xff1a; 一、绘制yx^2图像&#xff1a; 一、绘制yx^2图像&#xff1a; from matplotlib import pyplot as plt import numpy as np #生成&#xff08;-50,50&#xff09;的数组 x np.arange(-50,50) #计算因变量y的值 y x ** 2 #根据x、y数组绘制图形yx^2 plt.plot…...

上海东海职业技术学院低代码实训平台建设项目竞争性磋商公告

上海东海职业技术学院低代码实训平台建设项目竞争性磋商公告 招标&#xff5c;招标公告 上海市|闵行区 项目编号&#xff1a;0773-2340GNSHFWCS2823 招标单位&#xff1a;上海东海职业技术学院 代理单位&#xff1a;中金招标有限责任公司 预算金额&#xff1a;59万元 联系方式&…...

c语言之将输入的十进制转换成二进制数并打印原码反码补码

十进制转二进制 首先&#xff0c;我们要知道的是十进制转换成二进制数的方法。我们一般采用的除二取余的方法&#xff0c;在这里我用32位数组来进行转换。 int main() {printf("请输入一个十进制数\n");int n 0;scanf("%d", &n);int arr[32];int* p…...

算法题明明的随机数

第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数&#xff0c;代表明明生成的随机数。 具体格式可以参考下面的"示例"。 import java.util.Iterator; import java.util.Scanner; import java.util.TreeSet; // 注意类名必须为 Main, 不要有任何 pa…...

B站不赚钱、“芒果”赚钱难,视频“后浪”火拼跨年夜

又是一年跨年时。 各大视频平台跨年晚会展开火拼&#xff0c;今年谁是赢家&#xff1f; 作为视频“后浪”&#xff0c;芒果超媒&#xff08;300413.SZ&#xff09;、哔哩哔哩&#xff08;09626.HK&#xff0c;下称“B站”&#xff09;此前相继公布了2023年三季报&#xff0c;…...

ajax请求的详细流程+详细示例

AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于创建异步 Web 应用程序的技术。下面是 AJAX 请求的详细流程&#xff1a; 创建 XMLHttpRequest 对象&#xff1a;在 JavaScript 代码中&#xff0c;使用 new XMLHttpRequest() 创建一个 XMLHttpRequest 对…...

这些产品手册制作工具,你都值得收藏

产品手册是企业向消费者传达产品信息的重要媒介&#xff0c;它能够直接影响消费者对产品的了解和购买决策。然而&#xff0c;制作一份专业而吸引人的产品手册并非易事&#xff0c;需要一定的设计和排版能力。为了帮助企业和个人更轻松地制作出优质的产品手册&#xff0c;下面将…...

跨账号和同账号的ECS云服务器之间迁移教程

阿里云ECS实例间迁移场景如下&#xff1a; 场景一&#xff1a;跨账号ECS实例间迁移 此场景适用于跨账号&#xff0c;同地域或者跨地域下的ECS实例间的迁移。例如&#xff1a;将阿里云账号A下的ECS实例&#xff0c;迁移阿里云B账号下。 场景二&#xff1a;同账号ECS实例间迁移 …...

python virtualenv 虚拟环境命令

# 安装 virtualenv pip3.9 install virtualenv # 创建虚拟环境test mkdir /envs # 创建一个文件夹放置虚拟环境 cd /envs/ virtualenv /envs/test # --pythonpython3.9 # 激活虚拟环境test source /envs/test/bin/activate # 安装依…...

深入理解MySQL索引底层数据结构

听课问题(听完课自己查资料) 什么是二叉树 二叉树是怎么存储数据的一个链表是一个集合的数据结构 List是怎么便利找到指定下标元素为什么会快&#xff1f;什么是红黑树 红黑树是怎么存储数据的什么是B TREE 是怎么存储数据的什么是BTREE 是怎么存储数据的 疑惑答案 a. 二叉树…...

使用 Tkinter 制作一个进制转换工具,好用!

在平时工作学习当中&#xff0c;我们经常会编写一些简单的 Python GUI 工具&#xff0c;以此来完成各种各样的自动化任务&#xff0c;比如批量处理文件&#xff0c;批量处理图片等等。当我们进行这些工具的编写之时&#xff0c;往往只关注了功能的实现&#xff0c;而忽略了页面…...

Final Cut 视频剪辑快速入门,小白上手视频课的制作

本文是一个快速入门教程&#xff0c;如果您是0视频处理基础&#xff0c;又想录制网课或是一些对效果要求不高的视频那么这篇教程足够使用了。 本文主要用Final Cut处理视频课&#xff0c;本文是笔者在制作视频课过程中逐渐摸索的&#xff0c;如果您想制作一些比较专业的视频&a…...

分布式定时任务Xxl_Job详细使用手册

看了很多网上的版本&#xff0c;思路描述的都不是很清晰&#xff0c;都只是几步操作就完成了&#xff0c;看效果&#xff0c;导致容易走入弯路&#xff08;不排除是自己理解能力把&#xff09;&#xff0c;最开始以为是把admin模块集成到项目&#xff0c;后来测试了会&#xff…...

【PostgreSQL】表操作-修改表

【PostgreSQL】表操作快速链接 创建表及基础表命令 修改表 表权限 添加列 ALTER TABLE products ADD COLUMN description text;新列最初填充给定的任何默认值DEFAULT&#xff08;如果未指定子句&#xff0c;则为 null&#xff09;。 注意&#xff1a; 从 PostgreSQL 11 开始…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...