Spring+Mybatis解析

news/2024/10/9 10:57:16/

源码执行流程

  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.ppmy.cn/news/1230926.html

相关文章

使用大语言模型 LLM 做文本分析

本文主要分享 传统聚类算法 LLM与嵌入算法 嵌入算法聚类 LLM的其他用法 聚类是一种无监督机器学习技术&#xff0c;旨在根据相似的数据点的特征将其分组在一起。使用聚类成簇&#xff0c;有助于解决各种问题&#xff0c;例如客户细分、异常检测和文本分类等。尽管传统的聚…

(二)汇编语句组成

一个完整的 RISC-V 汇编程序有多条 语句&#xff08;statement&#xff09; 组成。 一条典型的 RISC-V 汇编 语句 由 3 部分组成&#xff1a; 1.标签 List item label&#xff08;标签&#xff09;: 标签是标识程序位置的记号。通常定义一个名称然后加上":"后缀。…

【机器学习】交叉验证 Cross-validation

交叉验证(CrossValidation)方法思想简介 以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),首先用训练集对分类器进…

# 学习 Prolog 和 离散逻辑的16个等价公式:一趟有趣的逻辑之旅

Prolog 的语法很奇怪,需要一些时间来适应,所以我花了点时间,想用Prolot来表示和验证离散逻辑的16组等价公式。 1. 双重否定律 (Double Negation Law) A ⇔A 首先&#xff0c;我们来看看双重否定律。在 Prolog 中&#xff0c;我们可以这样验证它&#xff1a; fun1(A,Z):-membe…

接口自动化项目落地之HTTPBin网站

原文&#xff1a;https://www.cnblogs.com/df888/p/16011061.html 接口自动化项目落地系列 找个开源网站或开源项目&#xff0c;用tep实现整套pytest接口自动化项目落地&#xff0c;归档到电子书&#xff0c;作为tep完整教程的项目篇一部分。自从tep完整教程发布以后&#…

使用 Core Tools 在本地开发 Azure Functions

学习模块 使用 Core Tools 在本地创建和运行 Azure Functions - Training | Microsoft Learn 文档 使用 Core Tools 在本地开发 Azure Functions | Microsoft Learn GitHub - Azure/azure-functions-core-tools: Command line tools for Azure Functions 其它 安装适用于 A…

公网环境固定域名异地远程访问内网BUG管理系统

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…