范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

  一,简述
  mybatis的作用就是操作数据库,其实就是封装参数,生成sql,执行sql,封装结果,其实基本就是这几个大的步骤,mybatis和spring是怎么整合的呢,以及如何一步一步执行的,具体请看下面原理分析二,源码分析2.1:SqlSessionFactoryBean
  具体是在mybatis-spring整合包中,SqlSessionFactoryBean是加载mybatis配置文件以及生成sqlSession的入口
  2.2:FactoryBean
  spring源码有所了解的应该清楚这个factoryBean是一个生成特殊复杂的bean,以及和beanFactory的区:别,factoryBean中的一个重要的方法就是getObject方法,其实就是根据这个方法返回一个特殊的自定义的bean对象,而且bean创建的时候,会创建一个&sqlSessionFactoryBean 和sqlSessionFactory对象,就是会创建本身bean携带&和getObject返回的对象,而且getObject是使用的时候才会被调用的,使用的时候才会创建这个bean交给spring来管理
  调用getObejct获取sqlsessionfactory对象    public SqlSessionFactory FactoryBean() throws Exception {         if (this.sqlSessionFactory == null) {             this.afterPropertiesSet();         }          return this.sqlSessionFactory;     }
  创建一个DefaultSqlSessionFactory,所以在何时创建的,就在这里
  以上就是和spring结合情况下,创建出来sqlSessionFactory的过程,其实就是创建一个SqlSessionFactoryBean对象,然后调用getObject的方法,就可以做到加载mybatis的配置以及数据的封装的,以及获取一个sqlSessionFactory对象,交个spring来管理2.3:Spring中创建SqlSessionFactory对象
  创建一个SqlSessionFactory,具体代码执行的逻辑如下,其实就是做了一些数据的封装,并调用getObject的方法,然后交给spring管理
  2.4:spring-boot创建SqlSessionFactory对象MybatisAutoConfiguration
  @Bean     @ConditionalOnMissingBean     public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {       //还是这个对象SqlSessionFactoryBean 来处理的,最后还是getObejct获取的         SqlSessionFactoryBean factory = new SqlSessionFactoryBean();         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());         }          Set factoryPropertyNames = (Set)Stream.of((new BeanWrapperImpl(SqlSessionFactoryBean.class)).getPropertyDescriptors()).map(FeatureDescriptor::getName).collect(Collectors.toSet());         Class<? extends LanguageDriver> defaultLanguageDriver = this.properties.getDefaultScriptingLanguageDriver();         if (factoryPropertyNames.contains("scriptingLanguageDrivers") && !ObjectUtils.isEmpty(this.languageDrivers)) {             factory.setScriptingLanguageDrivers(this.languageDrivers);             if (defaultLanguageDriver == null && this.languageDrivers.length == 1) {                 defaultLanguageDriver = this.languageDrivers[0].getClass();             }         }          if (factoryPropertyNames.contains("defaultScriptingLanguageDriver")) {             factory.setDefaultScriptingLanguageDriver(defaultLanguageDriver);         }          this.applySqlSessionFactoryBeanCustomizers(factory);     	//具体还是在这里做出来的         return factory.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 之前。

兰陵醉第十章为何不能杀?村民听到我的话都安静下来,看来这段日子混得不差。我没有宗教信仰,也不养宠物,学习期间参加解剖也不止一次,从最初的不适应到熟能生巧,我从来没问过自己是不是个冷血的人!也许中国空间站首个实验舱最全解密!能掌控重力研究生命起源题记一舱何所有,飞棹赴天宫。消重张旋壁,冯虚御宇风。为求知造化,先试养苗虫。谁许逍遥梦,神奇在手中。今天,我们的空间站扩容啦!问天实验舱与天和核心舱对接成功!让我们把时间回拨到北京七岁女童玩耍时被误伤私处专家儿童性教育不可忽视新安晚报安徽网大皖新闻讯近日,一名七岁女童在与同性同伴玩耍时,不慎被触及私处致反复流血。在当地医院辗转治疗两周无效后慕名来到复旦儿科安徽医院(安徽省儿童医院)就诊,专家诊断为外伤导喝茶的基本礼仪,你了解多少?现在喝茶的人越来越多,稍微讲究点的家里都会备点好茶和几套茶具。但是其实喝茶并不是一件简单的事,不管是自己喝茶还是去拜访别人喝茶,在泡茶倒茶喝茶过程中,都要遵循喝茶的基本礼仪。那喝茶刘涛20天被王珂征服,4年被骗4亿,结婚15年后2人天差地别人生如果是道选择题。那刘涛做得最有苦难言的决定,应该是嫁给了一个叫王珂的男人。才认识20天,我就被王珂征服了。如果我对未来有任何期许,我想说,只愿我余生为他而活。这是刘涛面对镜头,用蚯蚓钓鱼不注意这几点,鱼再多也不一定钓多鱼蚯蚓对于钓鱼人来说是最经济实惠的饵料了,有时候甚至不用去渔具店购买,找个阴暗潮湿的地儿就能挖好多,带上一根鱼根就可以蹲河边钓一天。蚯蚓因为生活环境所致身上比较脏细菌较多,建议大家在毛主席水晶棺可抗8级地震,甚至超越列宁水晶棺,工艺究竟有多难1976年9月9日,这是全国人民感到无比悲痛的一天,这一天,伟大的领袖毛主席与世长辞。在这举国悲痛的日子里,中央考虑到还有许多人民群众没见过毛主席,便召开会议决定打造一副水晶棺,以刘欢罕见和女儿同框,女儿染黄发穿短裙时髦耀眼,父女共用一张脸连衣裙是每位女孩衣橱中必不可少的单品,能够展示女性的身材曲线,靓丽抢眼。但不同的裙装带来的时尚灵感却是不一样的哦!飘逸长裙仿若拥有仙气,自带温婉优雅气场职业半裙,居于性感与干练之中顶级超模KateMoss自揭伤疤!15岁要脱内衣,圈内潜规则全是脱作为一代顶级超模,KateMoss秉持着从不抱怨,从不解释的原则,在外人眼中,羞于接受采访的Moss始终蒙着一层神秘的面纱,尽管已经在T台上活跃了30多年,但人们对于她的生活,了解市六届人大常委会召开第五次主任会议7月20日下午,市六届人大常委会召开第五次主任会议。市人大常委会主任党组书记张余松,副主任陈明冠臧大存张育林沈明刚,秘书长李卫国出席会议。市委常委常务副市长刘浩列席会议。会议听取了金融电影分享华尔街金钱永不眠,每个梦想都要付出代价1。Everydreamhasaprice。每个梦想都要付出代价。2。Themainthingaboutmoney,itmakesyoudothingsyoudontwannato
adidasxGucci2022联名款系列LookBookadidasxGucci联名款系列服装和配饰,全球发售时间6月7日起在Gucci精选商店和Gucci网站和adidas应用程序CONFIRMED上发售。adidasxgucciex太阳惨败出局!布克女友詹娜被骂上热搜,卡戴珊家族预言要成真?NBA西部半决赛刚刚落下帷幕。太阳队主场90123不敌达拉斯独行侠队,志在夺冠的太阳队提前无缘西部决赛。而太阳和独行侠的抢七大战堪称史上最屈辱的抢七,半场太阳仅得27分。作为球队的太阳报小球迷和奇尔维尔合影,父亲太激动操作失误没拍上直播吧5月17日讯据太阳报报道,一位10岁的切尔西小球迷与奇尔维尔合影,但他的父亲因为太激动导致操作失误,没有拍摄到视频。41岁的托马斯阿特维尔最近带10岁的儿子杰克来到现场观看切开幕倒计时!戛纳电影节主会场外已悬挂官方海报1905电影网讯第75届戛纳国际电影节开幕在即,工作人员也正在做紧锣密鼓的筹备。近日,戛纳电影节在官方社交账号上发布了一组工作照,主会场影节宫外官方海报墙已准备完毕,等待开幕。本届一瓶9。2元的酱油,让我看到大润发实体店落寞的背影前天阿吉姐看到了一篇中国零食信息写的文章,题目叫大润发最高预亏超9亿!是谁让大卖场越来越难过?看到了陆战之王大润发在内的大卖场关店调整。文章提到,溃败的大卖场,纯属自己作死,我还是罕见,苹果官方回收涨价!iPhone全系迎来上涨苹果iPhone回收涨价按照惯例,苹果会经常调整iPhone的以旧换新价格,毕竟数码产品价格随着时间贬值也属于正常情况,例如今年三月份苹果就大幅度降低了iPhone回收价格。不过,5。18国际博物馆日衡水市博物馆主题宣传活动发布5月18日是国际博物馆日,今年的主题为博物馆的力量。为弘扬中华优秀传统文化,展示衡水深厚的历史文化底蕴,提升广大市民群众的文物保护意识,凝聚广大群众爱国爱家乡的精神力量,衡水市博物给自己配12名秘书,骗40万投资者上百亿,河北前首富真是大忽悠?2019年11月,曾经的河北首富杨卓舒,正躺在医院监管病房内,等待着法律的制裁。带上沉重的镣铐之前,他曾顶着无数的光环河北首富,身家50亿,连续4年入选福布斯中国富豪榜,房地产企业斗罗若唐晨在仅剩的三天里让波塞西怀孕了,唐三还会继承海神吗哈喽,大家好,我是心尘,日常带你从不同的角度看斗罗大陆。唐晨在唐三的海神之光作用下破开了罗刹的恶念,夺回了身体的掌控权成功苏醒。完成修罗八考的唐晨可是有着半神的实力,体内积蓄的魂力北理工因阴间食堂走红,在校生不敢直视,吃饭像去参加葬礼?大学食堂,是校园文化最重要的因素。学生只有满足了口舌之欲后,才能在学校里安心学习,甚至会乐不思蜀减轻对家长的思念之情。大学里的食堂按理说是不对外开放的,但是有外校来学习交流的学生,2011年男子表白被拒,刺死大二女生被判死刑,得知判决时淡定微笑2011年5月8日,在地处湖南省长沙市的中南大学当中,发生了一起惨烈的命案一名男子假借送礼之名,从背后持刀连续捅刺了一名女生数刀,随后又欲挥刀自杀但由于是对自己下手,加之疼痛难忍,