城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

MyBatis3源码解析执行SQL流程

2月6日 满月族投稿
  获取SQL
  思考:Mybatis是如何获取SQL的?即是如何获取到我们写的mapper文件的?
  其实我们有在XML配置文件中配置标签来加载我们的mapper文件。
  Mybatis加载mapper文件有几种方式?
  官网文档给了答案:总共有四种方式()。
  源码
  前文了解了XML配置解析器XMLConfigBuilder的parse()方法便是加载配置文件生成一个Configuration对象的入口方法;
  上篇了解了通过扫描environments标签如何获取数据源,下面会执行一个mapperElement方法来解析mappers标签,root。evalNode(mappers)返回的是一个value是mappers标签中内容的XNode对象;mapperElement(root。evalNode(mappers));
  进入方法,会有限判断有没有package标签,如何没有则会去获取该子node的三个属性,然后3个if分别处理。
  无论是哪种方式最后都会执行MapperBuilderAssistant类中的addMappedStatement方法,之后会将解析的sql信息后封装成的MappedStatement对象放在全局配置类的一个Map属性mappedStatements中。configuration。addMappedStatement(statement);protectedfinalMapString,MappedStatementmappedStatementsnewStrictMapMappedStatement(MappedStatementscollection)。conflictMessageProducer((savedValue,targetValue)。pleasechecksavedValue。getResource()andtargetValue。getResource());执行sql
  再贴一下我们的测试demo:Testpublicvoidtest()throwsIOException{InputStreaminputResources。getResourceAsStream(SqlSessionConfig。xml);SqlSessionFactorysessionFactorynewSqlSessionFactoryBuilder()。build(input);SqlSessionsqlSessionsessionFactory。openSession();LevelDaodaosqlSession。getMapper(LevelDao。class);ListLevelalldao。findAll();}
  在生成SqlSessionFactory对象后,会调用openSession()。已知在前面执行build方法时把数据源和sql都存储在了全局配置类Configuration中,在该方法中则会从配置类中获取Environment(其中包含数据源信息)、TransactionFactory(事务)、Executor(执行器)来生成一个默认的DefaultSqlSession对象返回。privateSqlSessionopenSessionFromDataSource(ExecutorTypeexecType,TransactionIsolationLevellevel,booleanautoCommit){Ttry{finalEnvironmentenvironmentconfiguration。getEnvironment();finalTransactionFactorytransactionFactorygetTransactionFactoryFromEnvironment(environment);txtransactionFactory。newTransaction(environment。getDataSource(),level,autoCommit);finalExecutorexecutorconfiguration。newExecutor(tx,execType);returnnewDefaultSqlSession(configuration,executor,autoCommit);}catch(Exceptione){closeTransaction(tx);mayhavefetchedaconnectionsoletscallclose()throwExceptionFactory。wrapException(Erroropeningsession。Cause:e,e);}finally{ErrorContext。instance()。reset();}}
  Executor(执行器)一共分为三种:简单、复用、批量,默认SimpleExecutor。CachingExecutor也实现了Executor接口,严格来说CachingExecutor不是一个真正的实现,它会委托给BaseExecutor去实现。此处不做细讲。publicenumExecutorType{SIMPLE,REUSE,BATCH}
  到此我们了解到openSession()方法只是获取到一些信息,生成了一个执行器,还没有开始sql执行流程。
  接下来测试demo中继续执行LevelDaodaosqlSession。getMapper(LevelDao。class);
  则会调用configuration。getMapper(type,this),继续调用mapperRegistry。getMapper(type,sqlSession),其内部是获取具体Class从MapperRegistry类中的Map中获取MapperProxyFactory,该MAP中的元素是我们在执行newSqlSessionFactoryBuilder()。build(input)方法扫描mapper标签时且是package或class的方式存放进去的;privatefinalMapC?,MapperProxyF?knownMappersnewHashMap();
  最后通过SqlSession调用MapperProxyFactory类生成了一个代理对象并返回。
  我们调用的Listalldao。findAll();实际上最后是会调用这个代理对象MapperProxy中的invoke方法publicObjectinvoke(Objectproxy,Methodmethod,Object〔〕args)throwsThrowable{try{if(Object。class。equals(method。getDeclaringClass())){returnmethod。invoke(this,args);}elseif(method。isDefault()){if(privateLookupInMethodnull){returninvokeDefaultMethodJava8(proxy,method,args);}else{returninvokeDefaultMethodJava9(proxy,method,args);}}}catch(Throwablet){throwExceptionUtil。unwrapThrowable(t);}finalMapperMethodmapperMethodcachedMapperMethod(method);returnmapperMethod。execute(sqlSession,args);}
  当我们执行到我们自定义的方法时会执行execute方法,这句最终就会执行增删改查了;
  再往下一层,就是执行JDBC那一套了,获取链接,执行,得到ResultSet,解析ResultSet映射成JavaBean。
  最后总结一下具体流程:Mybatis读取XML配置文件后会将内容放在一个Configuration类中,SqlSessionFactoryBuilder会读取Configuration类中信息创建SqlSessionFactory。在初始化SqlSessionFactory时,Mapper接口进行注册,注册在了名为MapperRegistry类的HashMap中,keyMapperclass,value创建当前Mapper的工厂。SqlSessionFactory创建SqlSession。SqlSession中可以通过getMapper()拿到代理对象,SqlSession。getMapper运用了JDK动态代理,产生了目标Mapper接口的代理对象。动态代理的代理类是MapperProxy,这里边mapperMethod。execute(sqlSession,args)最终完成了增删改查方法的调用。
投诉 评论 转载

暗影突围你也想要摸金?农场地图保险箱所在位置一览大家都知道,开保险箱是获取收藏品最有效的途径,一些收藏品可以卖出很高的价格,例如一个机密就能卖出500W,这也就是大家常说的摸金。今天就给大家带来游戏的第一张地图农场地图保险箱……中医养生慢阻肺大便不成形易腹泻?这三款代茶饮总有一款能帮你止慢阻肺患者大便稀不成形怎么办?其实这种现象在慢阻肺患者身上很常见,北京中医药大学附属东方医院呼吸科季坤医生的门诊上见过一位这样的患者。这是一位67岁的邓先生,10年前确诊……辽篮新星正式签约,广厦神射手接近复出,巩晓彬恩师加盟山东男篮辽篮新星正式完成签约,广厦神射手接近复出,巩晓彬好友加盟山东。在这个夏天CBA联赛发生了非常大的变化,多位球员和主教练都完成了转会,实现了人才市场的交流。而与此同时CBA青训和……这个边陲小城如童话世界,独特的建筑风格仿佛带我走进异国祝各位五一劳动节快乐一家客栈的建筑,门前有个小环岛,桔红色的尖顶和这有点浅浅咖啡色的外墙,在阳关下像一块威化饼干,坐立于白雪中就像是在奶油上的小蛋糕。阿尔山的建筑比我见过……一招教你用iPhone拍超级月亮估计很多小伙伴都知道哈,有超级月亮。据说,据说哈,这是2022最大的圆月。So朋友圈拍月亮大赛从晚上七点多就开始了。但估计iPhone用户心里挺苦的。手……Z博士爆料热火贪心大了,想要KD杜兰特,又要明星后卫米切尔东区强权热火展现夺冠决心,根据美国媒体Zoobet报道,热火持续与篮网商量交易球星凯文杜兰特(KevinDurant)的可能性,同时也有消息传出,若热火拿不到KD,将会设法网罗……首钢男篮旧三巨头即将退出历史舞台,新三巨头已经崛起近几年的北京首钢男篮,特别是上个赛季的首钢男篮,在动用资本力量拿下两大中锋范子铭和李慕豪,又趁八一解散之机,顺手牵羊拿下原八一队长雷蒙和后场大将田宇翔之后,给人的感觉,现在的首……盘点最好喝的平价白酒,排名前4强,你喝过哪一种?1、全兴大曲樽30(浓香)49952vol口感:窖香优雅绵甜柔润余味净爽推荐指数:4星2、华世福(酱香)288元53vol口感:酱香醇厚回味悠长不辣喉不上头跟飞天有一拼推……临近三伏天,不管有钱没钱,常吃这5种食物,遵守老传统入伏无忧俗话说热在三伏,随着温度的不断升高,马上就要进入一年中最热的三伏天,这个时间段气温居高不降,空气中弥漫着闷热与干燥,热浪的席卷也在为炎炎的夏日加不少力。三伏天出汗多,与此……MyBatis3源码解析执行SQL流程获取SQL思考:Mybatis是如何获取SQL的?即是如何获取到我们写的mapper文件的?其实我们有在XML配置文件中配置标签来加载我们的mapper文件。……袁骏2022年是大拐点之年,能源农产品价格恐难回落,中国权益近期,随着美联储毅然激进加息75bp,欧洲央行鹰歌嘹亮,全球主要央行纷纷进入紧缩阶段,全球大类资产遭到猛烈冲击。这一背景下,华尔街见闻特邀到晟元全球投资管理公司创始人兼首……埃隆马斯克又多俩娃!和36岁女高管生了双胞胎,就在Y娃降临前据《每日邮报》当地时间7月7日早间消息称,作为世界首富的埃隆马斯克又多了两个孩子!报道称,根据一份法庭文件显示,现年51岁的马斯克悄无声息地在去年11月迎来了一对双胞胎,……
景色宜人造句用景色宜人造句大全女性常吃深色食物会导致皮肤变黑吗大学生入党申请书格式精选多篇创建服务型党组织重在解决问题后的婚房设计时尚时尚最时尚最美的风景肉麻的英文示爱句子生生世世都愿和你共缠绵妈妈谢谢您农村宅基地补偿卡塔尔世界杯吉祥物拉伊卜火了,冰墩墩设计师这样评价为什么百度百家号只有两次申请机会女生最快的办法能让女生快速的种方法男人必学

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁