spring集成mybatis的原理
spring是怎样和mybatis继承的?
在idea里点mapper.queryOne()直接跳到了接口或xml,它究竟是怎样利用jdbc执行的?
我直接调用mapper.queryOne是怎么使用的sqlsession?怎么去connect的?
mybatis是怎样根据mapper找到对应的sql语句的?
看完本文,你将茅塞顿开!
前置知识:需要了解spring和mybatis的本身的原理
对beanDefinition进行扩展(spring部分)
首先是有一个类MapperScannerConfigurer,实现了BeanDefinitionRegistryPostProcessor,并重写了postProcessBeanDefinitionRegistry方法。
spring在加载beanDefinition的时候会调用这个方法,这个方法把所有配置中mybatis的mapper包扫描一遍,修改包里每个接口的beanClass为MapperFactoryBean.class

一路点scan->doscan->processBeanDefinitions

生成bean(spring部分)
由于上一步对beanDefinition已经做了修改,而MapperFactoryBean.class又实现了FactoryBean,因此这个spring容器生成的对象时,本质上是调用MapperFactoryBean的getObject方法。getOject就是getSqlSession().getMapper(this.Interface),这里和mybatis里使用的session.getMapper(UserMapper.class)就一致了。

调用方法(spring部分)
我们在使用userDao.selectOne这样的方法的时候。userDao本质上已经是getSqlSession().getMapper(this.Interface)生成的对象,即mybatis中session.getMapper(UserMapper.class)生成的对象。剩下的就是mybatis的事情了。

连接部分
SqlSessionTemplate线程安全的sqlsession
sqlsessionTemplate里有个sqlsession的代理类。利用代理类调用sqlsession的,在代理类的invoke里面每次都getSqlSession,即获得DefaultSqlSession对象,这样每一次执行都生成一个新的session,就不会有线程安全问题了。当然,session有一定的缓存,用来避免浪费资源


SqlSessionDaoSupport拿到sqlsessionTemplate
SqlSessionDaoSupport的getSqlSession代码,会直接返回sqlsessionTemplate对象。在构造的时候会注入sqlsessionTemplate。而上面的MapperFactoryBean实现了SqlSessionDaoSupport所以可以直接利用getSqlSession拿到sqlsession

mapper的生成(mybatis)
mapper和mapper工程的对应关系
在解析写sql的xml文件时,会将mapper接口和工厂绑定起来。
用mapper调用方法就是用sqlsession调用方法
我们在使用sqlSession.getMapper(Inteface.class)的时候会走下面的调用流程:configuration.getMapper()->mapperRegistry.getMapper()在这里,会把根据Inteface.class拿到对应的mapper代理对象生成的工厂方法。接着利用工厂执行mapperProxyFactory.newInstance(),创建mapper的代理对象

代理对象的invoke里面执行本质上是执行了sqlSession.selectOne()。
sqlsession是怎么找到sql的?(mybatis)
sqlSession.selectOne(command.getName(), param),其中command就是mapper的方法名也对应到了sql的id了。而id和sql的对应关系,在解析sql的xml时放到mappedStatements里了。


总结
- mybatis-spring有一个beanDefinition的增强类,增强类的增强方法在spring加载beanDefinition的时候把beanClass换成了MapperFactoryBean implements FactoryBean,spring在生成bean的时候执行的是MapperFactoryBean.getObject即getSqlSession().getMapper。这一步拿到了mybatis原生里面的mapper对象。
- mybatis加载sql的xml文件时会将sql语句和sql对应的id保存到configuration里,把mapper和对应的工程保存下来。我们执行session.getMapper()方法获取mapper对象的时候,获取的是一个mapper的代理类,代理类把mapper.queryUser(params)的形式转化为session.selectOne(“queryUser”,params)。
- session.selectOne函数会根据传进来的参数从configuration里面拿到相应的sql语句,并做执行!
相关文章:
spring集成mybatis的原理
spring是怎样和mybatis继承的? 在idea里点mapper.queryOne()直接跳到了接口或xml,它究竟是怎样利用jdbc执行的? 我直接调用mapper.queryOne是怎么使用的sqlsession?怎么去connect的? mybatis是怎样根据mapper找到对应的…...
限速神器RateLimiter源码解析 | 京东云技术团队
作者:京东科技 李玉亮 目录指引 限流场景 软件系统中一般有两种场景会用到限流: •场景一、高并发的用户端场景。 尤其是C端系统,经常面对海量用户请求,如不做限流,遇到瞬间高并发的场景,则可能压垮系统…...
spring中怎样优化第三方bean?
需求:将数据库连接四要素提取到properties配置文件,spring来加载配置信息并使用这些信息来完成属性注入。第三方bean属性优化的思路如下: 1.在resources下创建一个jdbc.properties(文件的名称可以任意) 2.将数据库连接四要素配置到配置文件中 3.在Spr…...
8分钟的面试,我直呼太变态了......
干了两年外包,本来想出来正儿八经找个互联网公司上班,没想到算法死在另一家厂子。 自从加入这家外包公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到11月一纸通知,所有人不许加班,薪资…...
别去外包,干了3年,彻底废了......
先说一下自己的情况。大专生,19年通过校招进入湖南某软件公司,干了接近3年的测试,今年年上旬,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了三年,…...
ipa如何安装到iphone
这里以目前很火的奥普appuploader为例,先打开 appuploader,把 iPhone 用原装数据线连接,点击左侧的 appuploader一栏,会在右窗格中看到机器的相关信息,可以看到是否越狱一栏显示“是”。 接下来请点击左侧的“程序库”…...
照片从安卓手机中消失了?让他们恢复回来的几个方法请收好
“我安卓上的所有照片都消失了,我的照片去哪儿了” “我安卓上的所有照片都不见了” “下载的图片从安卓上消失了” …… 您是否遇到类似的问题?导致Android手机照片丢失的原因有很多,例如软件更新、误删、误操作、系统崩溃、应用程序崩溃、…...
哪个年龄段人群喜欢养宠物?18-25岁占比最高,达31%
上一期,我们通过可视化互动平台分析了萌宠经济下宠物食品的发展现状,这一期我们接着来分析一下,在萌宠经济下,我国宠物医疗产业的市场情况。 由于现在很多家庭都喜欢饲养宠物,宠物数量的快速增长从而拉动了宠物经济的…...
使用Apache POI数据导出及EasyExcel进行十万、百万的数据导出
文章目录 Apache POI使用 EasyExcel工具类easyExcel工具类poi Apache POI Apache POI 是基于 Office Open XML 标准( OOXML )和 Microsoft 的 OLE 2 复合⽂档 格式( OLE2 )处理各种⽂件格式的开源项⽬。 简⽽⾔之,您可…...
八种故障排障思路
目录 生产故障有哪些 1、网络故障 如何发现网络故障 如何排查网络故障 如何解决网络故障 2、服务器故障如何处理 如何发现服务器故障 如何排查服务器故障 如何解决服务器故障 3、数据库故障如何处理 如何发现数据库故障 如何排查数据库故障 如何解决数据库故障 4…...
JavaScript全解析——this指向
本系列内容为JS全解析,为千锋教育资深前端老师独家创作 致力于为大家讲解清晰JavaScript相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【点个关注】持续追更~ this指向(掌握) this 是一个关…...
MySQL中ON DUPLICATE KEY UPDATE和REPLACE INTO区别
MySQL中的ON DUPLICATE KEY UPDATE和REPLACE INTO区别 在MySQL中,当我们需要插入新的数据到一个已存在的表中时,有两个常见的选项:ON DUPLICATE KEY UPDATE和REPLACE INTO。这两个选项可以解决类似的问题,但在处理重复键…...
37本国产SCI期刊推荐!涵盖9大领域,建议收藏!②
三、地学类 1. Acta Oceanologica Sinica | 国产之光!影响因子1分,中科院2区,国人占比81%! 评语:Acta Oceanologica Sinica在海洋学领域处于中等水平,影响因子逐年上升。近年来我国倡导发表国内期刊的论文…...
掌握无缝云迁移方法的数据集成
随着越来越多的组织过渡到基于云的基础架构,数据集成已成为云迁移过程的关键组成部分。数据集成包括将来自不同来源的数据集成到一个整合的视角中。云迁移的上下文涉及将数据从本地系统传输到基于云的平台,同时确保数据的一致性、准确性和可用性。 本文…...
unity 3种办法实现血条效果并实现3d世界血条一直看向摄像机
普通血条栏: 渐变色血条栏: 缓冲血条栏: 3D场景血条栏跟随玩家移动: 普通血条栏: 在Canvas下创建一个空物体HP bar,在空物体下方创建3个Image,分别为血条框bar 黑色,最大HP maxHP 白色,和当前HP currentHP 红色。(PS:注意先后顺序以调整显示的图层) 效果: …...
Jenkins流水线整合k8s实现代码自动集成和部署
一、前置条件 1、安装好k8s集群 这里先要搭建好一个K8s集群,笔者这边就采用使用了一个一主一丛的k8s集群,k8s集群的版本使用1.19.5版本,服务器的配置:2核4G,操作系统: CentOS Linux release 7.9.2009 (Core) 主机名…...
@PulsarConsumer注解2
PulsarConsumer注解是 Apache Pulsar 的客户端 API 中的注解之一,它是用于自动消费 Pulsar 消息的。通过使用PulsarConsumer注解,您可以将 Pulsar 消息的消费逻辑与自身的 bean 结合起来,并且不必编写繁琐的消费者代码。当消息到达 topic 时&…...
AIGC 综述 2023:A History of Generative AI from GAN to ChatGPT
GAI:发展历史,核心技术,应用领域以及未来发展 摘要1、引言1.1、主要贡献1.2、组织结构 2、生成式AI的发展历史2.1、NLP领域的发展2.2、CV领域的发展2.3、CV与NLP的融合 3、AIGC的核心技术基础3.1、经典基础模型3.1.1、Transformer3.1.2、Pre-…...
【JOSEF约瑟 JDZS-1202B 可调断电延时中间继电器 精度高、延时宽、】
品牌:JOSEF约瑟名称:可调断电延时中间继电器型号:JDZS-1202B系列额定电压:110、220VDC/AC触点容量:250V/5A功率消耗:2W返回系数:≥5%特点:高精度、延时宽、功耗低。 用途及特点 基本…...
UNeXt:基于MLP的快速医学图像分割网络
文章目录 UNeXt: MLP-Based Rapid Medical Image Segmentation Network摘要本文方法Shifted MLPTokenized MLP Stage 实验结果 UNeXt: MLP-Based Rapid Medical Image Segmentation Network 摘要 UNeXt:一种基于卷积多层感知器(MLP)的图像分…...
Lychee Rerank MM开源可部署:GitHub可获取完整代码+Dockerfile+文档
Lychee Rerank MM开源可部署:GitHub可获取完整代码Dockerfile文档 1. 项目概述 Lychee Rerank MM 是一个基于 Qwen2.5-VL 构建的高性能多模态重排序系统。由哈工大(深圳)自然语言处理团队开发,专门解决多模态检索场景中的精准语…...
终极Alienware个性化控制指南:500KB工具完全替代AWCC的3大理由
终极Alienware个性化控制指南:500KB工具完全替代AWCC的3大理由 【免费下载链接】alienfx-tools Alienware systems lights, fans, and power control tools and apps 项目地址: https://gitcode.com/gh_mirrors/al/alienfx-tools 你是否厌倦了Alienware Comm…...
MIR与主流JIT编译器对比:性能、体积与编译速度的终极较量
MIR与主流JIT编译器对比:性能、体积与编译速度的终极较量 【免费下载链接】mir A lightweight JIT compiler based on MIR (Medium Internal Representation) and C11 JIT compiler and interpreter based on MIR 项目地址: https://gitcode.com/gh_mirrors/mi/mi…...
Janus-Pro-7B惊艳作品:古诗文本→水墨风图像→题跋文字自动生成
Janus-Pro-7B惊艳作品:古诗文本→水墨风图像→题跋文字自动生成 1. 引言:当AI遇见中国古典美学 想象一下这个场景:你读到了一首意境悠远的古诗,脑海中浮现出烟雨朦胧的山水画面,但苦于没有绘画功底,无法将…...
Like关联优化
1、问题 最近遇到这样有趣的写法 with temp as (select wm_concat(distinct code) code from t1 ) select count(1) from (select distinct t2.id from t2,temp a where (a.code not like %||substr(t2.code,1,4)||%) ) a计划:语句为了排除不在板块的单位࿰…...
知壹网-中医资源库
知壹网,一站式中医资源共享平台。网罗古今中医精华,涵盖典籍文献、方药技法、养生科普、经验交流等多元内容,让经典易学、让知识好用,助力人人走近中医、学好中医、用好中医。 网站链接:https://my.feishu.cn/wiki/Mp…...
Waza:将工程师习惯转化为Claude可执行技能的革命性平台
Waza:将工程师习惯转化为Claude可执行技能的革命性平台 【免费下载链接】waza 🥷 Engineering habits you already know, turned into skills Claude can run. 项目地址: https://gitcode.com/gh_mirrors/cl/waza Waza是一个创新的平台࿰…...
Qwen3-TTS实战:VMware环境搭建、模型部署与语音生成全解析
Qwen3-TTS实战:VMware环境搭建、模型部署与语音生成全解析 1. 为什么选择VMware部署Qwen3-TTS? 在本地部署AI模型时,环境隔离和资源管理常常让人头疼。VMware虚拟机提供了一种优雅的解决方案,特别适合像Qwen3-TTS这样的语音生成…...
高光谱成像基础(十二)光谱重建(Spectral Reconstruction)姑
认识Pass层级结构 Pass范围从上到下一共分为5个层级: 模块层级:单个.ll或.bc文件 调用图层级:函数调用的关系。 函数层级:单个函数。 基本块层级:单个代码块。例如C语言中{}括起来的最小代码。 指令层级:单…...
Vue中手动取消watch监听的最佳实践与实现原理
1. 为什么需要手动取消watch监听 在Vue开发中,watch监听器是我们常用的响应式工具之一。它能够监听数据变化并执行相应的回调函数。但很多开发者可能没有意识到,不当管理watch监听器可能会导致内存泄漏和性能问题。 想象一下这样的场景:你在一…...
