Spring+Mybatis解析

news2024/11/16 5:32:48

源码执行流程

  1. 通过@MapperScan导入MapperScannerRegistrar类
  2. MapperScannerRegistrar类实现了ImportBeanDefinitionRegistrar接口,Spring启动会调MapperScannerRegistrar类中的registerBeanDefinitions方法
  3. 在registerBeanDefinitions方法中注册一个MapperScannerConfigurer类型的BeanDefinition
  4. 而MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor接口,所以Spring在启动过程中时会调用postProcessBeanDefinitionRegistry()方法
  5. 在postProcessBeanDefinitionRegistry方法中会生成一个ClassPathMapperScanner对象,然后进行扫描Mapper, 得到BeanDefinition
  6. 修改扫描到的BeanDefinition,把BeanClass修改为MapperFactoryBean,把AutowireMode修改为byType
  7. 扫描完成后,Spring就会基于FactoryBean的getObject去创建Bean,得到Mapper代理对象

流程图

一级缓存和二级缓存

一级缓存:
        一级缓存是SqlSession级别的缓存,在我们执行查询操作时,会先从该缓存中取数据,如果没有找到,就从数据库中查询出来,然后缓存到一级缓存中。每个SqlSession中都有一个一级缓存,彼此间不共享,所以一级缓存的作用范围就是它自己的SqlSession,当SqlSession结束后,一级缓存也就没有了。所以,一级缓存也称为本地缓存。

二级缓存:
        二级缓存是mapper级别的缓存,多个SqlSession可以共享同一个二级缓存,它的作用范围是mapper的namespace,不同namespace下的mapper不共享二级缓存。当一个SqlSession查询完数据后,会将数据缓存到二级缓存中,其他SqlSession就可以使用。二级缓存是跨SqlSession的,一个SqlSession查询的数据会被缓存到二级缓存中,其他SqlSession可以使用。

实现机制:
        Mybatis的一级缓存是基于PerpetualCache的HashMap本地缓存,其存储作用域为Transaction,即必须手动提交以后,才能把数据写入到一级缓存中。二级缓存与一级缓存其机制相同,默认也是采用PerpetualCache,HashMap存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源,如Ehcache。在Mapper.xml中的<select>,<insert>,<update>,<delete>标签中加入flushCache="true",则当前操作后,会清空当前Mapper下的二级缓存,如果在<select>标签中加入useCache="false",则不使用二级缓存。

一级缓存失效问题:

        Spring整合Mybatis后,如果执行某个方法时,该方法上没有加@Transactional注解,也就是没开启Spring事务,那么后面在执行具体sql时,每执行一个sql时都会新生成一个SqlSession对象来执行该sql,这就是一级缓存失效(也就是没有使用同一个SqlSession对象),而如果开启了Spring事务,那么该Spring事务中的多个sql,在执行时会使用同一个SqlSession对象,从而一级缓存生效

整合代码

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

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

相关文章

Mock 数据

1. Mock 数据的方式 2. json-server 实现 Mock 数据 项目中安装json-server npm i -D json-server准备一个json文件添加启动命令 //package.json"scripts": {"start": "craco start","build": "craco build","test&q…

怎样用AIDL Service 传递复杂数据

大家都知道在Android中通过AIDL可以跨进程调用Service中的数据&#xff0c;网上也有很多实例&#xff0c;但是大部分实例都是关于基本数据类型的远程调用&#xff0c;很少讲到复杂数据的调用&#xff0c;今天我用一个例子来演示一下怎样用AIDL Service 传递复杂数据。 我们分2…

给做steam游戏搬砖项目新手小白的5个警示

CSGO搬砖日常出货更新 今天&#xff0c;阿阳要向你们揭秘一个备受瞩目的项目——Steam搬砖项目。或许你们已经听闻过它的名字&#xff0c;但今天我要带领你们深入了解这个项目的本质&#xff0c;为你们揭示五个必须警惕的警示。让我们共同探索这个项目是否适合你们&#xff0c;…

微服务保护 Sentinel

1.初识Sentinel 文章目录 1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.超时处理1.1.3.仓壁模式1.1.4.断路器1.1.5.限流1.1.6.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制2.1.簇点链…

Springboot整合MybatisPlus及分页功能

1 引入pom <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot</artifactId><version>2.7.14</version> </dependency> <dependency><groupId>com.baomidou</groupId><a…

Vue框架学习笔记——Vue实例中el和data的两种写法

文章目录 前文提要Vue实例的el第一种写法第二种写法小结 Vue实例中data第一种写法&#xff0c;对象式效果图片第二种写法&#xff0c;函数式效果图片小结 前文提要 本文仅做自己的学习记录&#xff0c;如有错误&#xff0c;请多谅解 Vue实例的el 第一种写法 <body><…

劲松中西医医院HPV诊疗中心科普:扁平疣4个知识点要了解

扁平疣是一种常见的皮肤病&#xff0c;其表现为皮肤上的扁平丘疹&#xff0c;通常无痛无痒&#xff0c;但会影响患者的外貌和心理。许多人在患上扁平疣后会考虑是否可以自己消退&#xff0c;下面我们将从几个方面进行探讨。 扁平疣的病因 扁平疣是由人乳头瘤病毒(HPV)引起的。…

Go语言中结构体的使用和示例

结构体&#xff08;简称struct&#xff09;用于创建不同数据类型的成员集合&#xff0c;放入一个单一的变量中。虽然数组用于将相同数据类型的多个值存储在单一变量中&#xff0c;但结构体用于将不同数据类型的多个值存储在单一变量中。结构体对于将数据组合在一起以创建记录非…

【封装UI组件库系列】封装Icon图标组件

封装UI组件库系列第三篇封装Icon图标组件 &#x1f31f;前言 &#x1f31f;封装Icon 1.创建Icon组件 2.引用svg图标库 第一步 第二步 第三步 3.二次封装 4.封装自定义属性 &#x1f31f;总结 &#x1f31f;前言 在前端开发中&#xff0c;大家可能已经用过各种各样的UI组…

机器学习【01】相关环境的安装

学习实例 参考资料&#xff1a;联邦学习实战{杨强}https://book.douban.com/subject/35436587/ 项目地址&#xff1a;https://github.com/FederatedAI/Practicing-Federated-Learning/tree/main/chapter03_Python_image_classification 一、环境准备 GPU安装CUDA、cuDNN pytho…

(二)C语言之变量与算数运算表达式概述

C语言之变量与算数运算表达式概述 一、华氏温度与摄氏温度对照二、代码概述三、练习 一、华氏温度与摄氏温度对照 #include <stdio.h>/*当华氏温度为 0,20,40,...300时&#xff0c;打印出华氏温度与摄氏温度对照表华氏温度与摄氏温度 C(5/9)(̧F-32) 其中C表示摄氏温度&…

Jenkins Ansible 参数构建

首先在Jenkins中创建自由项目 在web端配置完成后在另一台机子上下载nginx 在gitlab端创建项目并创建文件配置代码 在有Jenkins的机器上下载Ansible [rootslave1 ~]# yum -y install epel-release [rootslave1 ~]# yum -y install ansible再进入下载nginx机器中克隆gitlab项目…

【CCF-PTA】第03届Scratch第01题 -- 梦醒时分

梦醒时分 【题目描述】 睡眠是人体正常的生理需要&#xff0c;同年龄男女睡眠时间无明显差别&#xff0c;一般是8小时左右。居家的小明作息生活很规律&#xff0c;晚上11点睡觉&#xff0c;早晨7点起床学习。请你编写程序来判断&#xff0c;每周&#xff08;共168小时&#x…

YOLO目标检测——垃圾检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;智能化垃圾分类系统、垃圾回收和处理领域的优化管理等方面数据集说明&#xff1a;垃圾分类检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含报纸、蛋壳、矿泉水瓶、电池、拉链顶罐、塑料餐盒、纸质药盒、香蕉皮…

协同过滤与矩阵分解讲解(PPT)

总览 协同过滤算法&#xff0c;就是一种完全依赖用户和物品之间行为关系的推荐算法。 从字面理解&#xff0c;协同大家的反馈、评价和意见一起对海量的信息进行过滤&#xff0c;从中筛选出用户可能感兴趣的信息。 知识概括 从这几个方面进行分析。 一、基于用户的协同过滤 显示…

富士康转移产线和中国手机海外设厂,中国手机出口减少超5亿部

富士康和苹果转移生产线对中国手机制造造成了巨大的影响&#xff0c;除此之外&#xff0c;中国手机企业纷纷在海外设厂也在减少中国手机的出口&#xff0c;2022年中国的手机出口较高峰期减少了5.2亿部。 手机是中国的大宗出口商品&#xff0c;不过公开的数据显示2022年中国的手…

深入了解Java8新特性-日期时间API_LocalDate类

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概12000多字&#xff0c;预计阅读时间长需要10分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&…

【Python】批量将PDG合成PDF,以及根据SS号重命名秒传的文件

目录 说明批量zip2pdf批量zip2pdf下载SS号重命名源代码SS号重命名源代码下载附录&#xff0c;水文年鉴 说明 1、zip2pdf是一个开源软件&#xff0c;支持自动化解压压缩包成PDG&#xff0c;PDG合成PDF&#xff0c;笔者在其基础上做了部分修改&#xff0c;支持批量转换。 2、秒…

SQL LIKE 运算符:用法、示例和通配符解释

SQL中的LIKE运算符用于在WHERE子句中搜索列中的指定模式。通常与LIKE运算符一起使用的有两个通配符&#xff1a; 百分号 % 代表零个、一个或多个字符。下划线 _ 代表一个单个字符。 以下是LIKE运算符的用法和示例&#xff1a; 示例 选择所有以字母 “a” 开头的客户&#x…

如何应用ChatGPT撰写、修改论文及工作报告,提供写作能力及优化工作??

如果我想让gpt从pdf文档中提取相关关键词的内容&#xff0c;可以怎么做呢&#xff1f;&#xff1f;我们评论区讨论 ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&am…