MyBatis八股文-执行流程、延迟加载、一级与二级缓存

news2025/4/6 13:02:42

(一)执行流程

在这里插入图片描述
在这里插入图片描述

  1. mybatis-config.xml核心配置文件的作用:
    在MyBatis框架的核心配置文件中需要去指定当前的环境配置、指定需要操作的是哪个数据库,并且输入当前的用户名与密码,只有配置了他才能真正操作数据库。同时还去加载了SQL映射文件,有两种配置方法,一种是直接指定当前映射文件;一种是指定当前的包名,相当于设置一个扫描包,用于直接加载该包下的所有mapper映射文件。
    在这里插入图片描述
  2. 创建SqlSession
    MyBatis主要通过一个SqlSession对象去操作数据库,我们通过SqlSessionFactory会话工厂来创建该对象。在SqlSession中就包含了所有执行SQL语句的方法,他才是真正与数据库打交道的对象,并且每次操作一次生成一次会话,总共会生成多个。
  3. Executor执行器
    用于封装之前学习过的JDBC操作,是真正去操作数据库的接口,还要负责查询缓存的维护(查询缓存指的是后面要学的一级缓存与二级缓存)
  4. MappedStatement对象
    要想操作数据库就需要去定义一个mapper接口并编写mapper接口的映射文件,在xml映射文件中往往定义了许多标签信息:方法类型(如select)、方法id(对应mapper接口中的方法名称)、方法返回值resultType、SQL语句等等,这些标签信息都是由MappedStatement对象来读取与存储的
    在这里插入图片描述
  5. 参数类型转换
    在真正操作数据库之前还需要去处理参数的类型,需要把传入的这些参数(map、list、string、integer、pojo)转换成数据库所支持的类型
  6. 结果处理
    在操作完数据库之后就需要将得到的数据类型转换为java中的类型

总结:

在这里插入图片描述

(二)延迟加载使用及原理

在这里插入图片描述
延迟加载(也称按需加载)的前提:
可以看到在用户表中封装了orderList订单列表,它对应的就是订单信息表中属于该用户的数据
在这里插入图片描述

一、延迟加载的使用

(1)打开Demo类来进行测试
①立即加载

准备一张user用户表与order订单表
在这里插入图片描述
定义UserMapper.xml映射文件,在定义resultMap返回值当中又嵌套查询了order订单
在这里插入图片描述
在这里插入图片描述
执行测试方法,发现能够同时查询到User信息与Order订单数据
在这里插入图片描述
在这里插入图片描述
可以看到此时的查询情况是符合立即加载的(也就是在查询用户信息时同时将订单信息也查询了出来)

②延迟加载
  1. 改造UserMapper.xml映射文件
    在resultMap属性中指定fetchType,lazy指的就是延迟加载
    在这里插入图片描述
  2. 重新测试
    在这里插入图片描述
    可以看到此时在查询用户信息时并没有同时去查询订单信息,而是等到调用查询订单信息的方法时才去执行SQL逻辑,这也就是延迟加载
③局部与全局的延迟加载

此处fetchType只是局部修改,也就是只有在执行当前这块查询时才会有延迟加载的效果
在这里插入图片描述
也可以去开启全局的延迟加载:
需要在mybatis.config.xml映射文件中开启lazyLoadingEnabled开关
在这里插入图片描述

二、延迟加载的原理

在这里插入图片描述
若使用的是延迟加载,那么在第一次判断orderList的值是它是必定为空的

核心:使用的是CGLIB来创建目标延迟加载对象的代理对象

三、总结

在这里插入图片描述

(三)一级缓存与二级缓存

在这里插入图片描述
一级缓存与二级缓存都是基于本地缓存的,而一级缓存相较二级缓存的作用域较小,但是这两种缓存的基本思路都与上图相同,不同的是在不同作用于下保存数据的时机不同。
接下来就要来讲解一级与二级缓存的缓存效果:

(1)一级缓存

在这里插入图片描述
可以看到此时两次查询的都是相同的user对象,在第一次查询时就会把数据保存在本地缓存(也就是HashMap)中,当第二次查询时就不会再去执行SQL语句了
使用一段测试代码来验证:
在这里插入图片描述
执行测试方法,发现虽然打印了两次查询结果,但是实际执行的SQL语句只有一次,说明他把查询到的数据保存到了本地缓存当中,等到第二次查询时就直接从缓存当中来获取数据了
在这里插入图片描述

  • 注意:
    在这段查询代码中,执行两次查询语句使用的都是同一个SqlSession对象,只要使用的是同一个SqlSession对象那么就只需要查询一次,因为一级缓存的作用域是session级别
(2)二级缓存

在这里插入图片描述
这次分别创建了两个SqlSession对象,并且用它来分别获取UserMapper对象并执行查询操作,也就属于两个不同的会话,最终执行的结果就是会去执行两条SQL语句。

①当不开启二级缓存的情况下分别使用两个SqlSession对象来查询数据库

测试代码如下:
在这里插入图片描述
发现最终会执行两次SQL查询,并分别打印出查询结果
在这里插入图片描述

②开启二级缓存并分别使用两个SqlSession对象来查询数据库
  1. 开启二级缓存
    在这里插入图片描述
    在这里插入图片描述
  2. 再次执行测试,发现这次只执行了一次SQL语句
    可以看见存在一个Cache Hit关键字,代表成功命中了索引,证明第二次查询是从缓存中获取到的数据
    在这里插入图片描述
③注意事项

在这里插入图片描述

(3)总结

在这里插入图片描述

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

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

相关文章

基于Spark的哔哩哔哩舆情数据分析系统

【Spark】基于Spark的哔哩哔哩舆情数据分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本项目基于Python和Django框架进行开发,为了便于广大用户针对舆情进行个性化分析处…

【Linux】日志模块实现详解

📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…

Java基础:面向对象高级(四)

内部类(类中五大成分之一) 四种形式 成员内部类【了解】 静态内部类【了解】 局部内部类【了解】 匿名内部类【重点】 枚举 泛型 什么是泛型 泛型类-模拟ArrayList 泛型接口-操作学生,老师增删改查 泛型方法 泛型擦除和注意事项

easy-poi 一对多导出

1. 需求: 某一列上下两行单元格A,B值一样且这两个单元格, 前面所有列对应单元格值一样的话, 就对A,B 两个单元格进行纵向合并单元格 1. 核心思路: 先对数据集的国家,省份,城市...... id 身份证进行排序…

python通过调用海康SDK打开工业相机(全流程)

首先打开海康机器人-机器视觉-下载中心 下载最新版的 MVS 安装后打开目录找到 ...\MVS\Development\Samples\Python 将MvImport内所有文件拷贝至工作目录 然后到 C:\Program Files (x86)\Common Files\MVS\Runtime 找到适合自己系统的版本,将整个文件夹拷贝至工…

manim,制作专业的数学公式动画

manim是一个Python第三方库,全称是mathematical animation engine(数学动画引擎)。manim用于解说线性代数、微积分、神经网络、黎曼猜想、傅里叶变换以及四元数等数学概念。 manim使你能够以编程的方式创建精确的数学图形、动画和场景。与传统的几何画板等绘图软件不同,man…

小刚说C语言刷题——第15讲 多分支结构

1.多分支结构 所谓多分支结构是指在选择的时候有多种选择。根据条件满足哪个分支,就走对应分支的语句。 2.语法格式 if(条件1) 语句1; else if(条件2) 语句2; else if(条件3) 语句3; ....... else 语句n; 3.示例代码 从键盘输入三条边的长度,…

[ctfshow web入门] web6

前置知识 入口点(目录)爆破 还记得之前说过网站的入口的吗,我们输入url/xxx,其中如果url/xxx存在,那么访问成功,证明存在这样一个入口点;如果访问失败则证明不存在此入口点。所以我们可以通过遍历url/xxx,…

简单程序语言理论与编译技术·22 实现一个从AST到RISCV的编译器

本文是记录专业课“程序语言理论与编译技术”的部分笔记。 LECTURE 22(实现一个从AST到RISCV的编译器) 一、问题分析 1、完整的编译器(如LLVM)需先完成AST到IR的转换,并进行代码优化,再到汇编&#xff0…

lua和C的交互

1.C调用lua例子 #include <iostream> #include <lua.hpp>int main() {//用于创建一个新的lua虚拟机lua_State* L luaL_newstate();luaL_openlibs(L);//打开标准库/*if (luaL_dofile(L, "test.lua") ! LUA_OK) {std::cerr << "Lua error: &…

Css:如何解决绝对定位子元素内容被父级元素overflow:hidden属性剪裁

一、问题描述 今天小伙伴提了一个bug&#xff0c;在点击列表项的“…”按钮应该出现的悬浮菜单显示不完整&#xff1a; 二、问题排查 一般这种问题&#xff0c;是由于悬浮菜单采用的是绝对定位&#xff0c;而父级采用了overflow:hidden属性。但需要注意的是&#xff0c;这里的…

RoMo: Robust Motion Segmentation Improves Structure from Motion

前言 看起来像是一篇投稿CVPR的文章&#xff0c;不知道被哪个瞎眼审稿人拒了。同期还有一篇CVPR被接收的工作Segment Any Motion in Videos&#xff0c;看起来不如这篇直白&#xff08;也可能是因为我先看过spotlesssplats的缘故&#xff09;&#xff0c;后面也应该一并介绍了…

MCP 极简入门 - 三分钟 Cline + Smithery 运行 time 服务

文章目录 一、&#x1f680; 初识Smithery&#xff1a;AI服务的新大陆找到心仪的服务 二、Cline 编辑配置文件&#x1f527;1、打开配置文件2. 添加Time Server配置3. 验证配置效果 三、&#x1f4ac; 实战对话&#xff1a;让AI告诉你时间四、服务管理小技巧&#x1f504;&…

基本机动飞行性能

机动飞行时描述飞机在给定构型和发动机工作状态下改变飞行速度、飞行高度和飞行方向的能力 1. 水平加&#xff08;减&#xff09;速 水平加&#xff08;减&#xff09;速性能反映飞机在水平面内改变直线飞行速度的能力。描述水平加&#xff08;减&#xff09;速性能的参数包括…

【Linux】进程间通信、匿名管道、进程池

一.什么是通信 进程间通信(Inter-Process Communication&#xff0c;IPC),是指在操作系统中&#xff0c;不同进程之间进行数据交换和同步的机制。由于每个进程通常拥有独立的内存空间&#xff0c;进程间无法直接访问对方的内存&#xff0c;因此需要通过特定的机制来实现通信和…

【MATLAB定位例程】TDOA(到达时间差)的chan-tylor,三维环境,附完整代码

该代码实现了基于三维空间的动态目标TDOA定位,结合了Chan算法(解析解)与Taylor级数展开法(迭代优化)的双重优势。 文章目录 运行结果MATLAB代码代码讲解代码功能概述核心算法原理代码结构解析可视化与结果分析运行结果 定位示意图: 三轴状态曲线: 三轴误差曲线: MA…

数字化转型中的开源AI智能客服与S2B2C商城小程序的融合创新

摘要 数字经济时代&#xff0c;企业需通过技术重构用户交互与供应链体系。本文以“开源AI智能客服”“AI智能名片”及“S2B2C商城小程序”为核心&#xff0c;研究三者如何通过技术协同与场景化应用实现企业营销、客户服务与供应链管理的智能化升级。通过案例分析、技术架构设…

重生之我是去噪高手——diffusion model

diffusion model是如何运作的&#xff1f; 想象一下&#xff0c;你有一张清晰的图片。扩散模型的核心思想分为两个过程&#xff1a; 前向过程&#xff08;Forward Process / Diffusion Process&#xff09;&#xff1a;逐步加噪反向过程&#xff08;Reverse Process / Denois…

【C#】.net core 6.0 依赖注入常见问题之一,在构造函数使用的类,都需要注入到容器里,否则会提示如下报错,让DeepSeek找找原因,看看效果

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01;&#…

论文阅读笔记——RDT-1B: A DIFFUSION FOUNDATION MODEL FOR BIMANUAL MANIPULATION

RDT-1B 论文 模型表达与泛化能力&#xff1a;由于双臂操作中动作空间维度是单臂空间的两倍&#xff0c;传统方法难以建模其多模态分布。 数据&#xff1a;双臂数据少且不同机器人的物理结构和动作空间差异&#xff08;如关节数、运动范围&#xff09;导致数据分布不一致&#x…