spring集成mybatis的原理

news/2025/3/16 3:48:49/

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有一定的缓存,用来避免浪费资源
在这里插入图片描述

image.png

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里了。
在这里插入图片描述
在这里插入图片描述

总结

  1. mybatis-spring有一个beanDefinition的增强类,增强类的增强方法在spring加载beanDefinition的时候把beanClass换成了MapperFactoryBean implements FactoryBean,spring在生成bean的时候执行的是MapperFactoryBean.getObject即getSqlSession().getMapper。这一步拿到了mybatis原生里面的mapper对象。
  2. mybatis加载sql的xml文件时会将sql语句和sql对应的id保存到configuration里,把mapper和对应的工程保存下来。我们执行session.getMapper()方法获取mapper对象的时候,获取的是一个mapper的代理类,代理类把mapper.queryUser(params)的形式转化为session.selectOne(“queryUser”,params)。
  3. session.selectOne函数会根据传进来的参数从configuration里面拿到相应的sql语句,并做执行!
文章来源:https://blog.csdn.net/JokeOrSerious/article/details/130630991
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/news/70391.html

相关文章

计算机体系结构|MIT6.175和MIT6.375学习笔记

在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。现在,…

Type-C边充电边OTG转接器方案

随着生活水平的提高,大家的电子设备也多了起来,更有甚者会凑齐“全家桶”,手机,平板,笔记本电脑,智能手表,无线耳机,Switch,PS5,一样不落。那么多的电子设备&…

数字化转型的下半场制造企业如何破局制胜

随着数字化转型的浪潮不断推进,越来越多的制造企业也加入到数字化转型的行列中来。然而,数字化转型的路程并非一帆风顺,尤其是在转型的后半场,制造企业面临的挑战更为复杂。那么,制造企业如何才能在数字化转型的下半场…

二叉树总结

文章目录 树需要掌握的基本概念二叉树基本特点满二叉树性质 完全二叉树性质 二叉搜索树(二叉排序树)Binary Search Tree(BST)性质 平衡二叉树性质 红黑树五大性质 B树 二叉树的存储方式链式存储顺序存储 二叉树的遍历 树需要掌握的基本概念 1、节点、根…

十五天MySQL学习计划(运维篇-完结)读写分离-第十五天

十五天MySQL学习计划(运维篇-完结)读写分离-第十五天 读写分离 1.读写分离 ​ 读写分离,简单的说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主服务器提供写操作,从数据库提供读操作,这样…

Knife4j文档请求异常(更新)

文章目录 1. 多模块注解不当引起2. SpringSecurity白名单问题 1. 多模块注解不当引起 在SpringBoot项目中,如果是分不同的模块开发。 注解配置 EnableSwagger2WebMvc不在启动类上,而是加到了其他模块的注解中,可能会导致这种情况发生。 我的…

NXP公司LPC21xx+热敏电阻实现温度检测

LPC2131/32/34/36/38微控制器基于16位/32位Arm7TDMI-S™CPU,支持实时仿真和嵌入式跟踪,具有尺寸小,功耗低,多个32位定时器、单/双10位8通道ADC、10位DAC、PWM通道、47个GPIO线(它们拥有多达9个边沿或电平触发的外部中断…

NISP二级证书含金量如何

国家信息安全水平考试(National Information Security Test Program,简称NISP),是由中国信息安全测评中心实施培养国家网络空间安全人才的项目。 为培养更多优秀的实践型网络安全人才,中国信息安全测评中心推出了国家…