当前位置: 首页 > news >正文

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

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语句,并做执行!
http://www.lryc.cn/news/68753.html

相关文章:

  • 限速神器RateLimiter源码解析 | 京东云技术团队
  • spring中怎样优化第三方bean?
  • 8分钟的面试,我直呼太变态了......
  • 别去外包,干了3年,彻底废了......
  • ipa如何安装到iphone
  • 照片从安卓手机中消失了?让他们恢复回来的几个方法请收好
  • 哪个年龄段人群喜欢养宠物?18-25岁占比最高,达31%
  • 使用Apache POI数据导出及EasyExcel进行十万、百万的数据导出
  • 八种故障排障思路
  • JavaScript全解析——this指向
  • MySQL中ON DUPLICATE KEY UPDATE和REPLACE INTO区别
  • 37本国产SCI期刊推荐!涵盖9大领域,建议收藏!②
  • 掌握无缝云迁移方法的数据集成
  • unity 3种办法实现血条效果并实现3d世界血条一直看向摄像机
  • Jenkins流水线整合k8s实现代码自动集成和部署
  • @PulsarConsumer注解2
  • AIGC 综述 2023:A History of Generative AI from GAN to ChatGPT
  • 【JOSEF约瑟 JDZS-1202B 可调断电延时中间继电器 精度高、延时宽、】
  • UNeXt:基于MLP的快速医学图像分割网络
  • 软路由简述
  • python 生成设施农用地各类材料,并调用python2进行出图
  • html - 多媒体标签(video)、音频标签(audio)
  • 希望计算机专业同学都知道这些博主
  • LeetCode 416 分割等和子集
  • 韦东山Linux驱动入门实验班(2)hello驱动---驱动层与应用层通讯,以及自动产生设备节点
  • 小程序技术,打开跨端管理的思路,提高客户满意度和忠诚度
  • Jmeter的Content-Type设置方式
  • SQL语法
  • 面试题30天打卡-day30
  • learn_C_deep_11 (深刻理解整形提升、左移和右移规则、花括号、++和--操作、表达式匹配:贪心算法)