MyBatis底层原理【源码运行时序图】

news2025/1/4 18:56:09

MyBatis初始化流程🛷

以下代码为例🎉

🎇可对应源码阅读
image-20230303222112868

MyBatis初始化流程✨

SqlSessionFactoryBuilder XMLConfigBuilder Configuration DefaultSqlSessionFactory 1、创建对象 2、build(inputStream) 3、创建解析器parser 4、解析每一个标签把详细信息保存在Configuration中 5、解析mapper.xml 6、返回Configuration 7、build(Configuration) 8、new DefaultSqlSessionFactory(config) 9、返回创建的DefaultSqlSessionFactory,包含了保存全局配置信息的Configuration SqlSessionFactoryBuilder XMLConfigBuilder Configuration DefaultSqlSessionFactory MyBatis初始化流程

Mapper.xml中的每一个元素信息解析出来并保存在全局配置中,讲增删改查标签每一个属性解析出来封装成一个MappedStatement;一个MappedStatement就代表一个增删改查标签的详细信息

获取SqlSession流程🪁

DefaultSqlSessionFactory Configuration Executor 1、openSession() 2、openSessionFromDataSource() 3、获取一些信息,创建tx 4、newExecutor() 5、根据参数,选择合适的Executor实现 6、如果开启了二级缓存,则创建CachingExecutor 二级缓存默认为true,所以这里会 创建CachingExecutor,此处使用了装饰器模式 7、遍历所有拦截器,代理exceutor executor = (Executor) interceptorChai n.pluginAll(executor) 返回根据配置创建的Executor对象 创建并返回DefaultSqlSession DefaultSqlSession中包含了Executor和Configuration DefaultSqlSessionFactory Configuration Executor 获取SqlSession流程

获取Mapper代理对象🎿

DefaultSqlSession Configuration MapperRegistry MapperProxyFactory MapperProxy 1、getMapper() 2、getMapper() 3、getMapper 4、查找指定type对应 的MapperProxyFactor y对象 5、newInstance(sqlSession) 6、创建实现了mapperInterface 接口的代理对象 创建MapperProxy,他是一个 InvocationHandler,JDK动态代理核 心对象 7、返回MapperProxy代理对象 返回 DefaultSqlSession Configuration MapperRegistry MapperProxyFactory MapperProxy 获取Mapper代理对象

执行流程🎄

MapperProxy MapperMethod DefaultSqlSession Executor CachingExecutor BaseExecutor SimpleExecutor StatementHandler invoke() 判断增删改查类型 包装参数为map集合 sqlSession.selectOne() selectList() 获取MappedStatement MappedStatement中包含了方法对 应的标签详细信息,包含了SQL的信息 executor.query() 获取BoundSql对象 query() 检查是否使用了二级缓存 如果存在二级缓存,则返回缓存中信息 如果不存在缓存,则调用 被装饰的Executor执行query() 检查本地缓存(一级缓存)localCache 存在本地缓存(一级缓存)获取缓存中保存的输出类型参数,并设置到用户传入的实参(parameter)对象中 没有本地缓存则调用queryFromDatabase(), 查询后也会放到一级缓存中 调用doQuery()方法, 完成数据库查询操作,并返回结果对象 创建StatementHandler对象 创建StatementHandler 此处会遍历是否有拦截器存 在,interceptorChain.pluginAll() prepareStatement()完成Statement 的创建和初始化与处理占位符 预编译sql产生PreparedStatementHandler对象 调用StatementHandler设置参数 调用TypeHandler给预编译SQL设置参数 查出数据使用ResultSetHandler处理结果;使用TypeHandler获取value值 后续关闭连接等操作 返回数据 MapperProxy MapperMethod DefaultSqlSession Executor CachingExecutor BaseExecutor SimpleExecutor StatementHandler 获取Mapper代理对象

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

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

相关文章

robotframework 常用关键字

ctrl shift 空格:自动补全关键字 F5:搜索关键字 F8:执行用例 ctrl shift s:保存整个工程 ctrl r:查看报告 ctrl 鼠标悬浮:显示关键字的信息 ctrl #:屏蔽代码 ctrl $:…

4-spring篇

ApplicationContext refresh的流程 12个步骤 prepareRefresh 这一步创建和准备了Environment对象,并赋值给了ApplicationContext的成员变量 要理解Environment对象的作用 obtainFreshBeanFactory ApplicationContext 里面有一个成员变量,Beanfactory b…

Navicat 现已支持 OceanBase 全线数据库产品

Navicat 作为 OceanBase 生态工具的合作伙伴,这是双方产品适配第三个里程碑。2022 年 7 月的首个里程碑,Navicat 实现了 OceanBase 社区版的功能性兼容。同年10 月,进一步实现了针对 OceanBase 企业版( 兼容 MySQL 模式&#xff0…

一文图解|I/O 调度层

当我们使用 read() 和 write() 系统调用向内核提交读写文件操作时,内核并不会立刻向硬盘发送 I/O 请求,而是先将 I/O 请求交给 I/O 调度层进行排序和合并处理。经过 I/O 调度层加工处理后,才会将 I/O 请求发送给块设备驱动进行最终的 I/O 操作…

【强烈建议收藏:MySQL面试必问系列之慢SQL优化专题】

一.知识回顾 学习本篇文章之前呢,我们可以先看一下【强烈建议收藏:MySQL面试必问系列之SQL语句执行专题】,看完这篇文章再来学习本篇文章可谓是如虎添翼。好的,那我们也不讲太多的废话,直接开始。 二.如何做慢SQL查询优化呢&…

《uniapp基础知识》学习笔记Day38-(Period2)全局文件一些常用的配置

如果进行开发的话,首先要配置路由页面 page.json 页面路由 pages.json 文件用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等。 {"pages": [{"path": "pages/component/index…

Centos7搭建DHCP

1.简介DHCP服务器又叫动态主机协议,由服务器划分一段地址池,客户端地址池中获取IP地址及掩码等信息端口:UDP 67/68主配置文件:/etc/dhcp/dhcpd.conf租约时间文件:/etc/sysconfig/dhcpd2.简单搭建DHCP服务PS&#xff1a…

离线数据仓库项目--技术选择

文章目录(一)技术选型1)数据采集工具2)数据存储3)数据计算4)数据可视化(二)整体架构设计(三)服务器资源规划(一)技术选型 1&#xff…

MySQL索引事务

1.索引1.1概念索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结果实现。(这里只用通俗的语言和图片进行介绍)1.2作用数据库中的表…

洗地机哪个牌子好?口碑最好的洗地机

选择洗地机,最关键的当然是清洁力度啦,这就要看洗地机的吸力如何了,一般情况下,吸力越大,越能够吸附顽固污渍,清洁力度就越好。然后杀菌功能也是必不可少的,毕竟是要清洁整个家的地面卫生&#…

Android 圆弧形 SeekBar

效果预览package com.gcssloop.widget;import android.annotation.SuppressLint;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graph…

ViT(Vision Transformer) TNT(Transformer in Transformer)

ViT(Vision Transformer) ViT的结构 ViT将输入图片分为多个patch(16x16),再将每个patch投影为固定长度的向量送入Transformer,后续encoder的操作和原始Transformer中完全相同。但是因为对图片分类,因此在输入序列中加…

论文复现-3

模型构建中的运算 数据集是CONLL03 这个数据集共有4种实体类型,所以,在做实体描述的embedding时,得到的语义表示的Tensor大小为 : 4*max_len, 具体指的是: type_input_ids: torch.LongTensor None, type_attention_m…

2023年中职组网络安全竞赛——web服务渗透测试解析

web服务渗透测试(100分) 题目如下: 解析如下: PS:任务环境可以私信博主,求个三连吧! 通过本地PC中的渗透测试平台KALI2020对靶机进行WEB渗透,找到页面内的文件上传漏洞并且尝试进行上传攻击,将文件上传成功后的页面回显字符串作为FLAG提交(如:点击超链接查看上传文…

Python自动化测试之requests库【发送json数据类型 】(六)

目录:导读 数据类型 application/json: application/x-www-form-urlencoded text/xml requests发送json 写在最后 我们都知道post请求中的body有4种数据类型,今天我们来写一篇关于requests请求json这种数据类型。 数据类型 我们都知道…

使用JSON.stringify的第三个参数,美化序列化后的值

事情是这样的,我在使用tiptap富文本编辑器,展示JSON代码,效果图肯定是这样的假设我有一个javascript对象如下const data {a: test }想要实现上面的效果,肯定需要使用JSON.stringifyconst editorData JSON.stringify(data)editor…

Linux中安装JDK8.跟学韩顺平

Linux中安装JDK8第16章Linux之JavaEE定制篇搭建JavaEE环境16.1 概述16.2安装JDK16.2.1安装步骤16.2.2测试是否安装成功第16章Linux之JavaEE定制篇搭建JavaEE环境 16.1 概述 如果需要在Linux下进行JavaEE的开发,我们需要安装如下软件 资料下载地址:百度…

【算法】BloomFilter概念和原理以及业务中的应用场景

思考:海量数据下去重,如果是非数值类型的话如何判断?1.什么是布隆过滤器 1970年由布隆提出的一种空间效率很高的概率型数据结构,它可以用于检索一个元素是否在一个集合中。 由只存0或1的位数组和多个hash算法, 进行判断数据 【一…

2023-03-03 mysql列存储-cpu占用100%-追踪思路

摘要: 最近在处理mysql列存储时, 发现在执行explain时, cpu占用达到了100%. 本文分析定位该问题的思路过程 现象: mysqld进程占用100%使用kill processlist终止会话, 无响应查看show processings; 发现一直在运行mysql> show processlist; +----+-----------------+-----…

图片服务器

文章目录一、项目简介二、功能及场景三、业务设计四、数据库设计准备图片表准备实体类五、API设计常用功能封装文件上传文件上传获取图片列表接口获取图片内容删除图片接口六、项目优化七、测试自动化测试测试用例一、项目简介 图片服务器:解决项目中插入图片的问题…