【框架】MyBatis 框架重点解析

MyBatis 框架重点解析

1. MyBatis 执行流程

在这里插入图片描述

会话工厂生产的 SqlSession 对象提供了对数据库执行SQL命令所需的所有方法,包括但不限于以下功能:

  1. 数据库操作:SqlSession可以执行查询(select)、插入(insert)、更新(update)、删除(delete)等各种SQL命令,从而实现对数据库的CRUD操作。
  2. 事务管理:SqlSession可以开始、提交或回滚事务,确保多个数据库操作可以作为一个原子操作进行。
  3. 对象映射:SqlSession可以将查询结果映射为Java对象,简化了数据的处理和转换过程。
  4. 缓存管理:SqlSession可以管理MyBatis的一级缓存和二级缓存,提高数据库访问性能。
  5. 执行存储过程:SqlSession可以执行数据库中的存储过程,并获取其返回结果。

每个 SqlSession 就代表一次数据库连接和一个 Mapper 中的方法,也管理着对应的对象映射,并且执行完应该断开连接,是个生命周期很短的对象;

MappedStatement 优点类似与之前 JDBC 的准备态对象,底层也确实是 JDBC;

完整流程:

在这里插入图片描述

回答:

  1. 读取 MyBatis 相关配置:
    1. 全局设置,mybatis-config.xml 文件加载运行环境,当然很多时候,会在包路径下的 yaml 文件中配置(yaml 配置作用的是 Bean 对象,要用 Mapper,需要配置启动类的扫描包路径);
    2. 映射文件,XXXMapper.xml 文件,编写了具体的SQL映射语句的文件,每个Mapper接口通常会对应一个Mapper.xml文件,其中定义了SQL语句的映射关系、动态SQL等内容。
  2. 构建会话工厂 SqlSessionFactory,全局一个;
  3. 当进行一次操作的时候,会话工厂创建 SqlSession 对象(包含了执行 SQL 语句的所有方法,有了这些基础的方法,才能执行 SQL,并正确处理参数与返回值);
  4. 而创建 SqlSession 需要一个 MappedStatement 类型的对象,它封装了映射信息与预执行 SQL 等信息;
    • 这个对象在一开始读取 MyBatis 相关配置的时候就创建了,根据不同的 sql 的 ID 来区分;
  5. 然后调用操作数据库的接口 Executor 执行器,同时负责查询缓存的维护;
  6. 输入参数映射,获得真实执行的 SQL 语句 ,执行 SQL 命令并获取结果;(根据 MappedStatement)
  7. 输出结果映射,将数据库返回的结果集映射成 Java 对象;(根据 MappedStatement)
  8. 提交会话(flush) / 断开数据库连接(close)(也有可能放入数据库连接池,保持数据库连接);

当我们属性注入 Mapper 后,前 5 步就已经完成了;

2. MyBatis 是否支持延迟加载(懒加载)?

  • 延迟加载的意思就是:需要某个数据的时候再加载,不需要用到数据时则不加载,是一种懒汉模式;

  • MyBatis 支持一对一关联对象和一对多关联集合对象的延迟加载;

    在这里插入图片描述

    像这种,一个结果集中的某个属性,是通过另一条 sql 获得的(如果是多表查询的一条 sql 就不会涉及多 sql);

    这样的场景,就可以用延迟加载;

  • 这个延迟加载默认是关闭的,如果要开启则需要以下配置:

    1. 在 mybatis-config.xml / xml 中的结果集定义中启动延迟加载:

    全局:

    在这里插入图片描述

    针对某一个:

    在这里插入图片描述

    <resultMap id="userResultMap" type="User"><id property="id" column="id" /><result property="username" column="username" /><association property="department" column="dept_id" select="selectDepartmentById" lazyLoadingEnabled="true"/>
    </resultMap>
    
    1. yaml 配置:

      全局:

      mybatis:configuration:default-lazy-loading-enabled: true
      

      针对某一个:

      mappers:- name: YourMapperNamedelayLoading: true
      

3. MyBatis 延迟加载的底层原理是什么?

在这里插入图片描述

  1. 返回的不仅仅是一个 Java 对象,而是 CGLIB 创建的目标对象增强后的代理对象(简单地理解为受监视的对象,被代理的对象);

  2. 当代理对象用到 orderList 的时候,即调用 getOrderList() 的时候;

  3. orderList 如果是 null,则代表未加载/未被设置,则会执行 sql 查询并通过 setter 方法设置到 orderList 属性上,并继续执行 getOrderList() 方法;

  4. 之后代理对象中 orderList 是有值的,就不需要进行 SQL 查询了;(如果查询结果本来就是 null,那确实会每次 get 都进行 SQL 查询,但是一般不会反复 get,如果真的有对应的场景就可能有性能问题,可能需要换一个加载策略);

4. MyBatis 的一级、二级缓存用过吗?

在这里插入图片描述

4.1 一级缓存

  • 同一个 sqlSession,同一个 sql 输入参数一致,就走缓存;

在这里插入图片描述

4.2 二级缓存

  • 同一个 namespace 和 mapper 的作用域(一个 Mapper 映射文件 ),同一个 sql 输入参数一致,就走缓存;

在这里插入图片描述

4.3 配置

一级缓存是默认打开的,二级缓存是默认关闭的,以下是配置方法:

# mybatis-config.yml# 配置一级缓存
configuration:localCacheScope: SESSION # 可选值为 SESSION(默认)和 STATEMENT# 配置二级缓存
environments:default:cache:type: org.apache.ibatis.cache.impl.PerpetualCache # 使用 PerpetualCache 作为二级缓存的实现eviction: LRU # 可选值为 LRU, FIFO, SOFT, WEAK, NONEflushInterval: 60000 # 刷新缓存的时间间隔,单位为毫秒size: 1024 # 缓存的最大条目数

或者是 mybatis-config.xml 配置的方式:

在这里插入图片描述

记得,还需要在要打开二级缓存的映射文件中,去加个 <cache /> 标签,声明打开二级缓存;

在这里插入图片描述

4.4 注意事项

  1. 对于缓存刷新机制,当一个作用域内(sqlSession / namespace),进行了增删改操作,默认该作用域下的所有 select 的缓存将被 clear;
    • 你可能会想,微服务开发怎么办?但是微服务的 MyBatis 在合理开发是不会重用的,而是访问别的微服务,所以对于同一个域仍然在同一个微服务去执行;
  2. 二级缓存需要缓存的数据要实现 Serializable 接口;
  3. 数据不会直接进入二级缓存,而是会话提交或者关闭以后,一级缓存中的数据才会序列化转移到二级缓存中;

4.5 回答

  1. 一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域是 Session,当 Session 进行 flush 或者 close 之后,该 Session 中的 Cache 就将清空,默认打开;
  2. 二级缓存:基于 namespace 和 mapper 的作用域起作用域,不依赖于 SqlSession,默认也是采用 PerpetualCache 的 HashMap 存储。默认关闭,需要配置开启,一个是 yaml / 核心配置文件,一个是需要打开二级缓存的 mapper 映射文件;

MyBatis 的二级缓存什么时候会清楚缓存中的数据:

  • 当一个作用域内(sqlSession / namespace),进行了增删改操作,默认该作用域下的所有 select 的缓存将被 clear;

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

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

相关文章

腾讯云幻兽帕鲁游戏存档迁移教程,本地单人房迁移/四人世界怎么迁移存档?

腾讯云幻兽帕鲁游戏存档迁移的方法主要包括以下几个步骤&#xff1a; 登录轻量云控制台&#xff1a;首先&#xff0c;需要登录到轻量云控制台&#xff0c;这是进行存档迁移的前提条件。在轻量云控制台中&#xff0c;可以找到接收存档的服务器卡片&#xff0c;并点击进入实例详情…

Jmeter 安装

JMeter是Java的框架&#xff0c;因此在安装Jmeter前需要先安装JDK&#xff0c;此处安装以Windows版为例 1. 安装jdk&#xff1a;Java Downloads | Oracle 安装完成后设置环境变量 将环境变量JAVA_HOME设置为 C:\Program Files\Java\jdk1.7.0_25 在系统变量Path中添加 C:\Pro…

股票技术指标(包含贪婪指数)

股票技术指标是用于分析股票价格和成交量数据&#xff0c;以便预测未来市场走势的工具。技术分析师使用这些指标来识别市场趋势、价格模式、交易信号和投资机会。技术指标通常基于数学公式&#xff0c;并通常在股票价格图表上以图形形式表示。 技术指标主要分为以下几类&#x…

A Brief Introduction of the Tqdm Module in Python

DateAuthorVersionNote2024.02.28Dog TaoV1.0Release the note. 文章目录 A Brief Introduction of the Tqdm Module in PythonIntroductionKey FeaturesInstallation Usage ExamplesBasic UsageAdvanced Usage A Brief Introduction of the Tqdm Module in Python Introducti…

力扣hot100:42.接雨水

什么时候能用双指针&#xff1f; &#xff08;1&#xff09;对撞指针&#xff1a; ①两数和问题中可以使用双指针&#xff0c;先将两数和升序排序&#xff0c;可以发现规律&#xff0c;如果当前两数和大于target&#xff0c;则右指针向左走。 ②接雨水问题中&#xff0c;左边最…

【算法集训】基础算法:枚举

一、基本理解 枚举的概念就是把满足题目条件的所有情况都列举出来&#xff0c;然后一一判定&#xff0c;找到最优解的过程。 枚举虽然看起来麻烦&#xff0c;但是有时效率上比排序高&#xff0c;也是一个不错的方法、 二、最值问题 1、两个数的最值问题 两个数的最小值&…

Vscode安装,ssh插件与配置

原因 发现很多新人在练习linux&#xff0c;可是只有windows机的时候&#xff0c;一般都是下载虚拟机&#xff0c;然后在虚拟机上安装ubuntu等linux平台。每次需要在linux中写代码&#xff0c;就打开ubuntu&#xff0c;然后在终端上用vim写代码&#xff0c;或者先编辑代码文本&…

css实现上下左右居中

css实现子盒子在父级盒子中上下左右居中 几种常用的上下左右居中方式 HTML代码部分 <div class"box"><img src"./img/77.jpeg" alt"" class"img"> </div>css部分 方式一 利用子绝父相和margin:auto实现 <sty…

内存管理 -----分段分页

分段 分段&#xff1a;程序的分段地址空间&#xff0c;分段寻址方案 两个问题 分段 &#xff1a;是更好分离和共享 左边是有序的逻辑地址&#xff0c;右边是无序的物理地址&#xff0c;然后需要有一种映射的关系&#xff08;段关联机制&#xff09; 各个程序的分配相应的地址…

Gin入门指南:从零开始快速掌握Go Web框架Gin

官网:https://gin-gonic.com/ GitHub:https://github.com/gin-gonic 了解 Gin Gin 是一个使用 Go 语言开发的 Web 框架,它非常轻量级且具有高性能。Gin 提供了快速构建 Web 应用程序所需的基本功能和丰富的中间件支持。 以下是 Gin 框架的一些特点和功能: 快速而高效:…

Sora模型风口,普通人如何抓住-最新AI系统ChatGPT网站源码,AI绘画系统

一、前言说明 PandaAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持…

边缘计算与任务卸载基础知识

目录 边缘计算简介任务卸载简介参考文献 边缘计算简介 边缘计算是指利用靠近数据生成的网络边缘侧的设备&#xff08;如移动设备、基站、边缘服务器、边缘云等&#xff09;的计算能力和存储能力&#xff0c;使得数据和任务能够就近得到处理和执行。 一个典型的边缘计算系统为…

前端按钮动画

效果示例 代码示例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevic…

OSCP靶场--Resourced

OSCP靶场–Resourced 考点(1.rpc枚举 2.crackmapexec密码喷洒&#xff0c;hash喷洒 3.ntds.dit system提取域hash 4.基于资源的约束委派攻击rbcd) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.188.175 --min-rate 2000 Starting Nmap 7.9…

《一篇文章搞懂git(保姆级教学)》

目录 1.版本管理工具概念 2. 版本管理工具介绍 2.1版本管理发展简史(维基百科) 2.1.1 SVN(SubVersion) 2.1.2 Git 3. Git 发展简史 4. Git 的安装 4.1 git 的下载 ​4.2 安装 5. Git 工作流程 5.1 Git 初始化 5.2 git 流程 5.2.1 流程图 5.2.2概念即详解 6.Git …

IO多路复用:提高网络应用性能的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

unity学习(46)——服务器三次注册限制以及数据库化角色信息1--数据流程

1.先找到服务器创建角色信息代码的位置&#xff0c;UserBizImpl.cs中&#xff1a; public PlayerModel create(string accId, string name, int job) {PlayerModel[] playerModelArray this.list(accId);//list是个自建函数&#xff0c;本质通过accId来查询if (playerModelAr…

【高数】常数项级数概念与性质

下面为个人数学笔记&#xff0c;有需要借鉴即可。 一、常数项级数概念 二、常数项级数性质 三、调和级数 完。

c++之旅——第三弹

大家好啊&#xff0c;这里是c之旅第三弹&#xff0c;跟随我的步伐来开始这一篇的学习吧&#xff01; 如果有知识性错误&#xff0c;欢迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 创作不易&#xff0c;希望大家多多支持哦&#xff01; 一.命名空间;…

项目设计:基于Qt和百度AI的车牌识别系统(嵌入式ARM)

基于Qt和百度AI智能云实现的智能车牌识别系统&#xff0c;具体可实现为停车场管理系统、智能计费停车系统…等。 1.系统实现思路及框架 1.1实现思路 要实现一个车牌识别系统&#xff0c;有多种方法&#xff0c;例如用opencv图像算法实现&#xff0c;或用第三方算法接口&#x…