专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

Mybatis执行流程以及整合Spring源码分析

  一,简述
  mybatis的作用就是操作数据库,其实就是封装参数,生成sql,执行sql,封装结果,其实基本就是这几个大的步骤,mybatis和spring是怎么整合的呢,以及如何一步一步执行的,具体请看下面原理分析二,源码分析2。1:SqlSessionFactoryBean
  具体是在mybatisspring整合包中,SqlSessionFactoryBean是加载mybatis配置文件以及生成sqlSession的入口
  2。2:FactoryBean
  spring源码有所了解的应该清楚这个factoryBean是一个生成特殊复杂的bean,以及和beanFactory的区:别,factoryBean中的一个重要的方法就是getObject方法,其实就是根据这个方法返回一个特殊的自定义的bean对象,而且bean创建的时候,会创建一个sqlSessionFactoryBean和sqlSessionFactory对象,就是会创建本身bean携带和getObject返回的对象,而且getObject是使用的时候才会被调用的,使用的时候才会创建这个bean交给spring来管理
  调用getObejct获取sqlsessionfactory对象publicSqlSessionFactoryFactoryBean()throwsException{if(this。sqlSessionFactorynull){this。afterPropertiesSet();}returnthis。sqlSessionFactory;}
  创建一个DefaultSqlSessionFactory,所以在何时创建的,就在这里
  以上就是和spring结合情况下,创建出来sqlSessionFactory的过程,其实就是创建一个SqlSessionFactoryBean对象,然后调用getObject的方法,就可以做到加载mybatis的配置以及数据的封装的,以及获取一个sqlSessionFactory对象,交个spring来管理2。3:Spring中创建SqlSessionFactory对象
  创建一个SqlSessionFactory,具体代码执行的逻辑如下,其实就是做了一些数据的封装,并调用getObject的方法,然后交给spring管理
  2。4:springboot创建SqlSessionFactory对象MybatisAutoConfiguration
  BeanConditionalOnMissingBeanpublicSqlSessionFactorysqlSessionFactory(DataSourcedataSource)throwsException{还是这个对象SqlSessionFactoryBean来处理的,最后还是getObejct获取的SqlSessionFactoryBeanfactorynewSqlSessionFactoryBean();factory。setDataSource(dataSource);factory。setVfs(SpringBootVFS。class);if(StringUtils。hasText(this。properties。getConfigLocation())){factory。setConfigLocation(this。resourceLoader。getResource(this。properties。getConfigLocation()));}this。applyConfiguration(factory);if(this。properties。getConfigurationProperties()!null){factory。setConfigurationProperties(this。properties。getConfigurationProperties());}if(!ObjectUtils。isEmpty(this。interceptors)){factory。setPlugins(this。interceptors);}if(this。databaseIdProvider!null){factory。setDatabaseIdProvider(this。databaseIdProvider);}if(StringUtils。hasLength(this。properties。getTypeAliasesPackage())){factory。setTypeAliasesPackage(this。properties。getTypeAliasesPackage());}if(this。properties。getTypeAliasesSuperType()!null){factory。setTypeAliasesSuperType(this。properties。getTypeAliasesSuperType());}if(StringUtils。hasLength(this。properties。getTypeHandlersPackage())){factory。setTypeHandlersPackage(this。properties。getTypeHandlersPackage());}if(!ObjectUtils。isEmpty(this。typeHandlers)){factory。setTypeHandlers(this。typeHandlers);}if(!ObjectUtils。isEmpty(this。properties。resolveMapperLocations())){factory。setMapperLocations(this。properties。resolveMapperLocations());}SetStringfactoryPropertyNames(Set)Stream。of((newBeanWrapperImpl(SqlSessionFactoryBean。class))。getPropertyDescriptors())。map(FeatureDescriptor::getName)。collect(Collectors。toSet());Classlt;?extendsLanguageDriverdefaultLanguageDriverthis。properties。getDefaultScriptingLanguageDriver();if(factoryPropertyNames。contains(scriptingLanguageDrivers)!ObjectUtils。isEmpty(this。languageDrivers)){factory。setScriptingLanguageDrivers(this。languageDrivers);if(defaultLanguageDrivernullthis。languageDrivers。length1){defaultLanguageDriverthis。languageDrivers〔0〕。getClass();}}if(factoryPropertyNames。contains(defaultScriptingLanguageDriver)){factory。setDefaultScriptingLanguageDriver(defaultLanguageDriver);}this。applySqlSessionFactoryBeanCustomizers(factory);具体还是在这里做出来的returnfactory。getObject();}2。5:SqlSessionTemplate创建
  MybatisAutoConfiguration中SqlSessionTemplate中创建
  2。6:SqlSessionTemplate创建
  创建SqlSessionTemplate的时候,SqlSessionFactory为上文提到的DefaultSqlSessionFactory,SqlSession为这里生成的代理对象,继续根据代理对象是哪一个呢?
  SqlSessionInterceptor
  代理对象为这个类,看一下里面的invoke方法invoke
  代理调用getSqlSession
  获取sqlSession
  openSession
  获取Executor
  newExecutor
  InterceptorChain链执行
  pluginAll
  目标的增强
  小结:
  源码看到了这里,基本是生成了sqlSessionFactrory,SqlSessionTemplate,以及SqlSession(其实是代理),以及代理对象的invoke的执行,基本就是一些后续执行的前提,所以这些bean的创建基本都应该有所了解了三,mappper的代理对象生成
  在调用的时候,我们只是写了一个mapper接口,并未写实现,但是mapper中的方法和xml中的方法都是对应的,会将mapper全类名接口方法名作为key存放在map中,每一个都是一个MappedStatement对象,存放在configuration的全局配置中,根据key获取到MappedStatement对象,根据代理对象执行相应的逻辑MapperScannerConfigurerpostProcessBeanDefinitionRegistry
  ClassPathMapperScanner进行扫描,this。basePackage是扫描的包,一般就是mapper接口所在的包,springboot中是默认启动类当前包下的类被扫描com。clover。。mapper
  scan
  doScan
  执行的含义就是生成bean对象
  processBeanDefinitions
  修改beanClass为MapperFactoryBean。class,这样创建对象的时候,就会调用MapperFactoryBean中的方法
  执行afterPropertiesSet方法,然后就是往cinfiguration中添加mapper接口对象
  MapperFactoryBean
  实现了FactoryBean,获取mapper的时候,调用getobject方法,获取代理对象
  getMapper
  newInstance
  获取mapper的代理对象,都是MapperProxy进行的代理,所以到此为止,就可以知道,启动的时候,已经做到了mapper的对象是从MapperProxy代理对象进行跟踪进行的
  三,调用执行代理对象mapperProxyMapperProxyinvoke
  每一个mapper调用方法的时候,就会调用invoke执行,然后调用到MapperMethod的excute方法,根据类型执行相应的增删改查
  MapperMethodexecute
  判断类型,其实这个类型就是mapperXml定义的标签以及id和与之对应的方法名一一对应的,到了这里,可能就比较熟悉了,因为对于sql的增删改查相比都是比较的熟悉,这里其实就是下面可以猜测到的,拼装sql,和参数,然后执行sql,返回结果,处理返回结果
  比如一个executeForMany为例
  SqlSessionTemplate调用selectList,然后使用代理对象调用
  此时的sqlsesion就是sqlSessionTemplate
  代理对象为SqlSessionInterceptor,此时调用就是invoke方法
  invoke方法调用
  首先获取sqlSession,然后里面大致的流程就是新建一个DefaultSqlSession对象,并创建一个Executor的对象或者代理对象,比如pageHelper就是代理了此对象Executor
  获取Executor对象,并检查是否是需要代理
  执行代理方法
  处理一下事务的逻辑
  四,mybatis的执行流程总结执行流程图
  mapperMethod执行:主要是请求参数的解析
  excutor:主要是指StatementHandler的创建,包含BoundSql的创建、ParameterHandler和ResultSetHandler的创建。
  statementHandler执行:主要执行sql并对结果集进行处理
  参数组装是在excutor创建之前,拦截器是在创建excutor的时候,所以前期就是参数组装,BoundSql创建是在StatementHandler创建的时候,在ParameterHandler和ResultSetHandler之前。

韩国彩妆太卷了,2023热门韩系彩妆新品测评,实用又貌美都想入手相信很多集美阳康之后,就已经开始计划着出国旅行了。加上现在出入境马上就要开放,邻近的日本韩国成为了很多人出国旅游的首选。除了领略久违的异国风光,买买买自然也是少不了的,高口碑又貌美开眼角手术答疑解惑,怎么做自己选吧!拥有一双漂亮有神的大眼睛,是多少女生梦寐以求的事情。然而现实总不会遂所有人的愿,就有不少爱美人士天生眼睛特别小,她们会通过医美的手段来改变自己的眼睛,而开眼角就是比较有效的方式之一仍然一标难求!北京2023年小客车指标配额10万个日前,北京市小客车指标调控管理办公室发布关于2023年小客车指标总量和配置比例的通告。2023年,北京小客车指标年度配额为10万个。其中,普通指标额度3万个,新能源指标额度7万个。CBA辽宁与北京首钢比赛结束后,球迷建议杨鸣升职,马布里回归北京时间1月10日,CBA联赛第25轮迎来一场令人关注的比赛,那就是由辽宁男篮对阵北京首钢。本场比赛开始前,就在上月27日,两队有过一次交锋,当时北京队以81比78战胜了辽宁男篮。一个时代的落幕Windows78。1今日微软正式停更今天,微软将针对企业用户的Windows7操作系统关闭ESU(付费外延扩展支持),自此Win7系统彻底退出历史舞台。微软官方建议用户尽快升级至Win10或Win11系统。除此之外,追光两个赛季一场不败,这支女排球队为啥这么牛?职业联赛激烈而残酷连续赢球非常不易整个赛季全胜更是难得一见但有一支球队连续两个赛季都没输过这就是天津女排刚结束的20222023赛季女排超级联赛天津女排复刻了上赛季不败的完美战绩以62岁的郎平被邀请出国,3位弟子将前往欧洲比赛,蔡斌应该换人?62岁的郎平被邀请出国,3位弟子将前往欧洲比赛,蔡斌应该换人?然而蔡斌主教练却地被呼吁要更换成郎平会更加合适助力女排赢下世界冠军。谈到女排的四大看点,我们分别从女排主教练郎平的角度万字舟哆来咪AI智能写字神器这是很多家长和老师书写指导中的问题如何指导孩子写好自己的名字?如何快速指导孩子写出字的笔锋?如何摆正字的位置?单独练字还可以,成句成篇写字就差距很大,如何解决?怎样的字算是优秀的字图集更新20X1013综合布线系统工程设计与施工综合布线系统工程设计与施工国家标准设计图集是作为设计师参考的标准书籍,与国标区别图集有具体设计的标准解读,更有设计图例系统图参数计算选型参考案例分析等内容。综合布线系统工程设计与施投影仪成抢手年货!过年回家你买了啥?年关将近,在外的游子纷纷思索回家给父母带些什么年货?许多消费者不约而同地盯上了投影仪。连日来,电商平台上投影仪商品搜索量逐步攀升,在家中与亲朋好友团聚观影已成了不少人心中的新式年俗酷睿迷你主机中的卷王零刻SEi12Pro深度评测随着搭载了IntelCorei51240P处理器的小米迷你主机的上市,国内miniPC市场的竞争进入了白热化。作为最早开发迷你主机的中国厂商,零刻(Beelink)显然不愿意在这场
国产操作系统状态中美的贸易战最近很火,很多人关心国内的科技是否被国外制约了,对于操作系统这个一款最明显。我们来谈谈操作系统这一款国内状态,国内大厂都在做了哪些操作系统,使用状态是怎样的。首先说下华中,美,日,韩四国电动车欧洲EuroNCAP成绩公开,谁优谁劣?近日,欧洲EuroNCAP公布了一些新能源汽车的碰撞成绩。这些新能源汽车都是在欧洲市场销售的。而且非常有代表性,其中包含了来自中国的WEYCoffee02,蔚来ET7,Smart1有夜尿与没有夜尿的人,哪个健康?泌尿科医生给出答案人的一生当中,13时间是从睡眠当中度过的,人体对睡眠的需求仅次于水和氧气,一旦离开充足睡眠,整个人都会变得精神不济,做任何事无精打采,难以投入正常工作学习当中。除了睡眠之外,排尿也中年女人,每天做好10件事,帮你悄悄赶走更年期中的焦虑情绪中年女人,逐渐进入更年期了,这是自然规律,谁也逃脱不了的一种生理现象。有些人身体素质好,表现得症状不够明显,不知不觉就过去了。有些女人就没有这么幸运,出现心慌焦虑失眠脾气暴躁等现象肾好不好,这四种睡觉可以看出来?四种中成药,保护肾脏健康大家好,我是贾医生,肾好不好,从睡觉的这四种状态就可以看出来,今天我就来一次给你讲清楚,并教你用四种中成药,帮你调理。首先第一种,睡觉时多汗,这类人在平时睡觉的时候总是出一身汗,睡电讯报曼联拒吃亏给补贴放走C罗,若拖下去他或被下放梯队根据每日电讯报著名记者MikeMcGrath的最新报道,曼联目前的态度很强硬,不愿意就C罗解约一事做出妥协。如果曼联无法如愿,很有可能曼联队史最伟大的球员之一最终会被迫被下放至u256!丁俊晖决赛对手火热出炉,利索夫斯基决胜局遭清台绝杀11月20日凌晨3点,英锦赛第二场半决赛来袭,世界排名第9的马克艾伦对阵利索夫斯基。这场比赛谁赢球,谁就是丁俊晖的决赛对手。开局之后,利索夫斯基率先进入状态,这也是一贯作风。小司机从26。7到47。5!汤普森终于做出妥协,勇士回归正轨,库里也轻松了前言主场以10分之差拿下尼克斯之后,勇士依然以7胜9负排在西部第11的位置。与上赛季的总冠军相比,这一落差属实无法被接受,尤其是在主力阵容没有太大变化的情况下。对于勇士来说,依靠错新帅携四外援严阵以待!新疆重新焕发活力,得分王状态恢复完全在第一阶段结束之后新疆男篮选择更换了球队的主教练,阿的江也成为了赛季开始后第一个下课的教练,在他执教球队之后,虽然带队打过总决赛,但此后球队成绩越来越差。即便上赛季没能打进季后赛,火车站的大妈美女帅哥住宿不?你敢去住吗?hello大家好我是潇阳,坐过火车的朋友都会遇到这样一件事,下了火车,走出火车站,很多大妈已经在门口等你了,美女小姑娘住房不?帅哥,小伙子来住房吧,我家旅馆便宜。大妈们总是很热情,头条美女赏析刘洋洋穿搭今天逛头条发现的美女是大美人刘洋洋穿搭,头条给我推荐的那一刻就立即点击打开看看了,果然头条最懂我,真的好看,让我们一起看看吧,如果喜欢就去头条搜索她吧她的头条号在文章最后哦!废话不
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软网