【框架】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.hqwc.cn/news/504125.html

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

相关文章

用Python库angr来分析二进制文件

最近在学习二进制分析&#xff0c;了解到二进制加载器&#xff0c;于是跟着AI一起&#xff0c;学习了这个python可用的二进制加载器分析器angr,并写了这篇介绍的文章&#xff0c;儿童卡通风格&#xff0c;哈哈。 亲爱的代码侠客们&#xff0c;今天我们要一起踏上探索二进制文件…

基于Python3的数据结构与算法 - 09 希尔排序

一、引入 希尔排序是一种分组插入排序的算法。 二、排序思路 首先取一个整数d1 n/2&#xff0c;将元素分为d1个组&#xff0c;每组相邻量取元素距离为d1&#xff0c;在各组内直接进行插入排序&#xff1b;取第二个整数d2 d1/2&#xff0c; 重复上述分组排序过程&#xff0…

LeetCode 刷题 [C++] 第215题.数组中的第K个最大元素

题目描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 题目分析 根据题意分析&…

华为设备总部与分部配置

1.要求&#xff1a; &#xff08;1&#xff09;总部实现高可靠性设计&#xff0c;接入层断掉一根线或汇聚、核心设备故障都不能影响数据正常转发 &#xff08;2&#xff09;分部1人数较少&#xff0c;采用单臂路由互通 &#xff08;3&#xff09;总部、分部1、2之间都能访问互联…

Python 自动化给女友发邮件:含新闻、天气、每日一句、图片 最全攻略系列02 如何添加emoji

Python 自动化给女友发邮件:含新闻、天气、每日一句、图片 最全攻略系列 是否想在女友面前展示程序员炫酷的一面? 是否想给她每日问候但是害怕忘记固定时间发送信息? 是否也羡慕别人可以优雅使用Python定时发送邮件? 欢迎来到Python自动化发邮件最全攻略系列,本系列将…

React富文本编辑器开发(二)

我们接着上一节的示例内容&#xff0c;现在有如下需求&#xff0c;我们希望当我们按下某个按键时编辑器有所反应。这就需要我们对编辑器添加事件功能onKeyDown, 我们给 Editor添加事件&#xff1a; SDocor.jsx import { useState } from react; import { createEditor } from…

你心中的韩剧TOP1是哪一部

关注公众号&#xff1a;萌番bilfun&#xff0c;发送影片名称&#xff0c;即可获取资源链接 【2024最新韩剧来袭&#xff0c;准备好迎接心灵的震撼了吗&#xff1f;】 韩剧迷们&#xff0c;你们期待已久的2024最新韩剧终于来了&#xff01;准备好迎接心灵的震撼了吗&#xff1f…

mTLS: TLS/CA/证书 简介

TLS 传输层安全性协议&#xff08;英语&#xff1a;Transport Layer Security&#xff0c;缩写作TLS&#xff09;&#xff0c;及其前身安全套接层&#xff08;Secure Sockets Layer&#xff0c;缩写作SSL&#xff09;是一种安全协议&#xff0c;目的是为互联网通信提供安全及数…

【软考】UML中的图之通信图

目录 1. 说明2. 图示3. 特性4. 例题4.1 例题1 1. 说明 1.通信图强调收发消息的对象的结构组织2.早期版本叫做协作图3.通信图强调参加交互的对象和组织4.首先将参加交互的对象作为图的顶点&#xff0c;然后把连接这些对象的链表示为图的弧&#xff0c;最后用对象发送和接收的消…

Tomcat 部署和优化 (一)---------安装Oracle jdk 、tomcat

自 2017 年 11 月编程语言排行榜 Java 占比 13%&#xff0c;高居榜首&#xff0c;Tomcat 也一度成为 Java开发人员的首选。其开源、占用系统资源少、跨平台等特性被深受喜爱。本章主要学习如何部署 Tomcat 服务&#xff0c;根据生产环境实现多个虚拟主机的配置&#xff0c;最后…

24款奔驰C260L升级原厂360全景影像 高清环绕的视野

360全景影像影像系统提升行车时的便利&#xff0c;不管是新手或是老司机都将是一个不错的配置&#xff0c;无论是在倒车&#xff0c;挪车以及拐弯转角的时候都能及时关注车辆所处的环境状况&#xff0c;避免盲区事故发生&#xff0c;提升行车出入安全性。星骏汇小许Xjh15863 3…

人工智能基础——模型部分:模型介绍、模型训练和模型微调 !!

文章目录 前言 一、什么是模型 二、什么是模型训练 三、什么是模型微调 前言 本文将从什么是模型&#xff1f;什么是模型训练&#xff1f;什么是模型微调&#xff1f;三个问题&#xff0c;来展开介绍人工智能基础的模型部分。 模型族谱 一、什么是模型 模型是一个函数&#x…