幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

第02篇Mybatis配置文件解析

  本篇主要内容如下,由于头条页面对Markdown文档的展示问题,所以排版可能有问题。
  一、配置文件分析文件分析
  在上一篇的代码中,我们看到了一个非常重要文件,这里我们先来人肉分析看,然后看下代码是如何解析的,毕竟代码也是人写的。思路决定出路,我们如果有思路,然后在看源码会更加的具有分析的能动性。Testpublicvoidmapper(){读取配置信息(为什么路径前不用加,因为是相对路径。maven编译后的资源文件和class文件都是在一个包下,所以不用加就是当前包目录)InputStreammapperInputStreamThread。currentThread()。getContextClassLoader()。getResourceAsStream(mybatisConfig。xml);生成SqlSession工厂,SqlSession从名字上看就是,跟数据库交互的会话信息,负责将sql提交到数据库进行执行SqlSessionFactorysqlSessionFactorynewSqlSessionFactoryBuilder()。build(mapperInputStream,development);获取Mybatis配置信息ConfigurationconfigurationsqlSessionFactory。getConfiguration();参数:autoCommit,从名字上看就是是否自动提交事务SqlSessionsqlSessionsqlSessionFactory。openSession(false);获取MapperTUserMappermapperconfiguration。getMapperRegistry()。getMapper(TUserMapper。class,sqlSession);TUsertUsernewTUser();tUser。setName(testUser1);tUser。setTokenId(testTokenId1);mapper。insert(tUser);获取插入的数据System。out。println(mapper。selectAll());数据插入后,执行查询,然后回滚数据sqlSession。rollback();}1。1mybatisConfig。xml
  tip注意看高亮行line(4)dtd文件是xml的约束文件,用于约束xml标签中属性line(8)properties标签,指定了配置信息文件是application。propertiesline(1113)mybatis的配置信息line(1527)mybatis支持多环境配置line(3032)映射文件:::
  基于上面的行,我们来讲解。lt;?xmlversion1。0encodingUTF8?!DOCTYPEconfigurationPUBLICmybatis。orgDTDConfig3。0ENhttp:mybatis。orgdtdmybatis3config。dtdconfiguration!指定properties配置文件,我这里面配置的是数据库相关propertiesresourceapplication。propertiesproperties!指定Mybatis使用log4jsettingssettingnamelogImplvalueLOG4JsettingsenvironmentsdefaultdevelopmentenvironmentiddevelopmenttransactionManagertypeJDBCdataSourcetypePOOLED!上面指定了数据库配置文件,配置文件里面也是对应的这四个属性propertynamedrivervalue{datasource。driverclassname}propertynameurlvalue{datasource。url}propertynameusernamevalue{datasource。username}propertynamepasswordvalue{datasource。password}dataSourceenvironmentenvironments!映射文件,mybatis精髓,后面才会细讲mappersmapperresourcemapperTUserMapper。xmlmappersconfiguration二、知识点讲解2。1xml约束文件dtd
  为什么要学习dtd约束文件呢?当你学会dtd约束文件后,你就知道这个标签有那些属性,知道标签及子标签信息。当有一天你要写开源框架的时候,你也可以来定义你自己的配置文件规则。这部分知识了解就行。不需要死记硬背。因为记住也基本没啥用,只要做到看到了认识,需要用了知道去哪里抄代码学习就够了。2。1。1元素属性属性值
  dtd文件
  域示例语法例子元素声明根元素标签,元素students有一个student元素空元素
  元素元素只出现一次,元素students至少有一个student元素元素最少出现一次,元素students最少有一个student元素声明出现零次或多次的元素,元素students可以有多个student,也可以一个没有元素声明非。。。既。。。类型的内容元素声明混合型的内容属性属性声明,payment有一个属性type,类型为字符类型,默认值checkspan
  值类型
  类型描述CDATA值为字符数据(characterdata)(en1en2ID值为唯一的idIDREF值为另外一个元素的idIDREFS值为其他id的列表NMTOKEN值为合法的XML名称NMTOKENS值是一个实体ENTITIES值是一个实体列表NOTATION此值是符号的名称xml:值是一个预定义的XML值
  默认值参数可使用下列值
  类型描述值属性的默认值REQUIRED属性值是必需的IMPLIED属性不是必需的FIXEDvalue属性值是固定的2。2configuration标签分析
  前面我们知道了dtd约束文件,我们就可以看下,configuration标签一共有那些子标签及属性信息了。
  mybatis3config。dtd
  通过分析dtd文件,我们知道有那些子标签及属性信息。内容比较长。但是不是很重要。这里只要知道就行。
  后面我们看如何使用代码来解析这些标签。
  2。3Mybatis配置解析核心逻辑
  :::tip思路决定出路line(6)sqlSessionFactory。getConfiguration()
  由此来看所有的解析都是在SqlSessionFactoryBuilder进行完成的。具体的解析xml代码我们不研究,这里我们只要搞清楚它的调用关系,及实现的代码在哪里即可。如果这里看懂,其实都会得到一个结论。就是mybaits的源码是比较简单的,因为他的配置是比较集中的,无论是xml方式或者是注解方式。最终所有的配置信息都在Configuration类中。:::Testpublicvoidconfiguration(){读取配置信息(为什么路径前不用加,因为是相对路径。maven编译后的资源文件和class文件都是在一个包下,所以不用加就是当前包目录)InputStreammapperInputStreamThread。currentThread()。getContextClassLoader()。getResourceAsStream(mybatisConfig。xml);生成SqlSession工厂,SqlSession从名字上看就是,跟数据库交互的会话信息,负责将sql提交到数据库进行执行SqlSessionFactorysqlSessionFactorynewSqlSessionFactoryBuilder()。build(mapperInputStream,development);获取Mybatis配置信息,由此来看所有的解析都是在SqlSessionFactoryBuilder进行完成的。ConfigurationconfigurationsqlSessionFactory。getConfiguration();}2。3。1newSqlSessionFactoryBuilder()。build
  这里可以看到就是核心类就是使用XMLConfigBuilder进行解析。下面我们就主要分析XMLConfigBuilderpublicSqlSessionFactorybuild(InputStreaminputStream,Stringenvironment,Propertiesproperties){try{XMLConfigBuilderparsernewXMLConfigBuilder(inputStream,environment,properties);returnbuild(parser。parse());}catch(Exceptione){throwExceptionFactory。wrapException(ErrorbuildingSqlSession。,e);}finally{ErrorContext。instance()。reset();try{inputStream。close();}catch(IOExceptione){Intentionallyignore。Preferpreviouserror。}}}2。3。2核心配置类解析(XMLConfigBuilder)
  :::note重点关注line(8),我们看到核心解析类是XPathParserparsernewXPathParser()line(17),标签的解析都在parseConfigurationline(17),思考下为什么先解析propertiesElement(root。evalNode(properties)):::publicclassXMLConfigBuilderextendsBaseBuilder{privatebooleanparsed;privatefinalXPathParserparser;privateStringenvironment;privatefinalReflectorFactorylocalReflectorFactorynewDefaultReflectorFactory();publicConfigurationparse(){if(parsed){thrownewBuilderException(EachXMLConfigBuildercanonlybeusedonce。);}parsedtrue;parseConfiguration(parser。evalNode(configuration));returnconfiguration;}privatevoidparseConfiguration(XNoderoot){try{issue117readpropertiesfirstpropertiesElement(root。evalNode(properties));PropertiessettingssettingsAsProperties(root。evalNode(settings));loadCustomVfs(settings);loadCustomLogImpl(settings);typeAliasesElement(root。evalNode(typeAliases));pluginElement(root。evalNode(plugins));objectFactoryElement(root。evalNode(objectFactory));objectWrapperFactoryElement(root。evalNode(objectWrapperFactory));reflectorFactoryElement(root。evalNode(reflectorFactory));settingsElement(settings);readitafterobjectFactoryandobjectWrapperFactoryissue631environmentsElement(root。evalNode(environments));databaseIdProviderElement(root。evalNode(databaseIdProvider));typeHandlerElement(root。evalNode(typeHandlers));mapperElement(root。evalNode(mappers));}catch(Exceptione){thrownewBuilderException(ErrorparsingSQLMapperConfiguration。Cause:e,e);}}}
  看到上面代码是不是就恍然大悟了,原来配置文件的标签都是在这里解析呀。这里的主要思路就是将xml解析成Java对象然后放到Configuration中。具体任何实现呢?感兴趣可以自己研究下。2。3。3Configuration属性介绍
  那么这些数据最终哪里会使用呢,我们专门留一片文章,详细分析。这里先看看Configuration内部都有那些关键的配置类把。
  属性解释TypeAliasRegistrykey是一个别名,value是一个class对象Propertiesvariables配置文件中占位符的变量配置InterceptorChaininterceptorChain拦截链,用于拦截方法,实现插件ObjectFactoryobjectFactory对象实例化统一的工厂方法,我们不用都反射来实例化了ObjectWrapperFactoryobjectWrapperFactory包装对象后为其提供统一的属性操作方法。我们不用通过反射来修改对象属性值了ReflectorFactoryreflectorFactory反射工厂,用于生成一个反射信息对象,具有缓存的作用Environmentenvironment环境信息包含(事务管理器和数据源)TypeHandlerRegistrytypeHandlerRegistry主要处理jdbc的返回数据,转换成Java对象MapperRegistrymapperRegistryMapper生成的处理类,包含代理的逻辑2。3。4Mapper。xml解析
  XMLMapperBuilder
  解析Mapper对应的xml配置文件,这里面包含了sql的信息。
  mapper的dtd约束文件更多,可以参考:https:mybatis。orgmybatis3zhsqlmapxml。html!映射文件,mybatis精髓,后面才会细讲mappersmapperresourcemapperTUserMapper。xmlmappers
  这里就要介绍一个重要的类的,MapperBuilderAssistantMapper构建辅助工具类。
  属性解释MapperBuilderAssistantMapper构建辅助工具类(缓存配置)CacheRefResolver决定如何使用缓存ParameterMapping当sql中使用到了{}占位符时候,负责填充sql参数ResultMapResolver返回值映射MapString,XNodesqlFragmentssql片段MappedStatementMapper方法的所有信息(出参,入参,及sql信息等)2。4Mybatis可以借鉴的知识点2。4。1占位符解析逻辑
  在第一篇的时候我们说过,从配置文件解析中我们能学会,如果解析占位符。并将占位符填充真实数据。这里我们就具体说下是如何解析。还记得前面让思考下为什么先解析propertiesElement(root。evalNode(properties))。
  答案就是为了先读取变量信息,方便后面给依赖的信息,给填充值。
  我们直接说答案:具体谁来做了这个事情,从职责划分上来看,这个其实还是属于xml文件解析。所以是XPathParserparserXPathParser中填充上变量信息,这样XPathParser在解析的时候会自动将{}填充上真实的数据。执行后,会解析properties标签,并且将属性赋值给XPathParserpropertiesElement(root。evalNode(properties));parser。setVariables(defaults);configuration。setVariables(defaults);XPathParser生成节点时候,属性信息会提前处理。publicXNode(XPathParserxpathParser,Nodenode,Propertiesvariables){this。xpathParserxpathParser;this。nodenode;this。namenode。getNodeName();this。variablesvariables;this。attributesparseAttributes(node);this。bodyparseBody(node);}发现是占位符,就从变量中读取。{datasource。driverclassname}替换成变量值里面的数据。publicstaticStringparse(Stringstring,Propertiesvariables){VariableTokenHandlerhandlernewVariableTokenHandler(variables);GenericTokenParserparsernewGenericTokenParser({,},handler);returnparser。parse(string);}2。4。2MybatisResources工具
  可以从配置文件中或者网络中解析配置,生成Resources对象Stringresourcecontext。getStringAttribute(resource);if(resource!null){defaults。putAll(Resources。getResourceAsProperties(resource));}elseif(url!null){defaults。putAll(Resources。getUrlAsProperties(url));}parser。setVariables(defaults);configuration。setVariables(defaults);从资源中获取流InputStreaminputStreamResources。getResourceAsStream(resource)从url中获取流InputStreaminputStreamResources。getUrlAsStream(url)2。4。3MybatisPropertyParser占位符解析TestpublicvoidpropertyParser(){PropertiesvariablesnewProperties();variables。put(datasource。driverclassname,com。mysql。cj。jdbc。Driver);变量中有就从变量中获取参数信息:com。mysql。cj。jdbc。DriverSystem。out。println(PropertyParser。parse(参数信息:{datasource。driverclassname},variables));变量中没有就直接返回keydatasource。urlSystem。out。println(PropertyParser。parse(datasource。url,variables));}2。4。4反射工厂ReflectorFactory
  在Mybatis中使用到的反射地方蛮多的,那么都知道反射是相对比较耗时间,那么我们来看Mybatis是如何利用反射工厂来提高反射的性能的?
  缓存,对要使用的Class类,做反射并保存起来,生成的对象是Reflector。
  ReflectorFactoryreflectorFactorynewDefaultReflectorFactory();publicinterfaceReflectorFactory{booleanisClassCacheEnabled();voidsetClassCacheEnabled(booleanclassCacheEnabled);ReflectorfindForClass(Classlt;?type);}publicclassReflector{privatefinalClasslt;?type;privatefinalString〔〕readablePropertyNames;privatefinalString〔〕writablePropertyNames;privatefinalMapString,InvokersetMethodsnewHashMap();privatefinalMapString,InvokergetMethodsnewHashMap();privatefinalMapString,Classlt;?setTypesnewHashMap();privatefinalMapString,Classlt;?getTypesnewHashMap();privateConstructorlt;?defaultConstructor;privateMapString,StringcaseInsensitivePropertyMapnewHashMap();}
  Testpublicvoidreflector()throwsException{ReflectorFactoryreflectorFactorynewDefaultReflectorFactory();ReflectorforClassreflectorFactory。findForClass(TUser。class);TUseruser(TUser)forClass。getDefaultConstructor()。newInstance();forClass。getSetInvoker(uid)。invoke(user,newObject〔〕{1});forClass。getSetInvoker(name)。invoke(user,newObject〔〕{孙悟空});forClass。getSetInvoker(tokenId)。invoke(user,newObject〔〕{tokenId});1System。out。println(forClass。getGetInvoker(uid)。invoke(user,newObject〔〕{}));孙悟空System。out。println(forClass。getGetInvoker(name)。invoke(user,newObject〔〕{}));}2。4。5异常上下文设计ErrorContext在代码执行的过程中,将关键信息通过ErrorContext。instance()。message()保存进去。利用到了线程隔离的知识。ErrorContext。instance()是利用ThreadLocal进行线程隔离。异常打印后,进行reset重置。publicintupdate(Stringstatement,Objectparameter){try{dirtytrue;MappedStatementmsconfiguration。getMappedStatement(statement);returnexecutor。update(ms,wrapCollection(parameter));}catch(Exceptione){throwwrapException(Errorupdatingdatabase。Cause:e,e);}finally{完成之后异常上下文进行重置ErrorContext。instance()。reset();}}将异常上线文中报错的错误都打印出来。publicstaticRuntimeExceptionwrapException(Stringmessage,Exceptione){returnnewPersistenceException(ErrorContext。instance()。message(message)。cause(e)。toString(),e);}

别再被吃苦精神洗脑了,热爱和天分才是成功的关键曾经,我们总是提倡吃苦耐劳,负重前行。如今看来,这背后有很多值得思考的地方。只强调吃苦,不强调吃苦的价值;称赞负重前行,却不在意负重前行的目的。。。。。。所以……ReggaeTrueLove惊魂模拟游戏RagdollPla让人惊心动魄堪比地狱的布偶游戏是种怎样的体验?今天推荐由ReggaeTrueLove发行的像素风残酷实验模拟体验游戏《RagdollPlayground》(布偶游乐场)。玩家在……火光冲天!新能源车又双叒起火,西安消防紧急扑救2月12日上午9时21分西安消防接警称西三环由北往南临近河池寨立交处一轿车发生火灾接警后消防人员立即赶往现场消防人员到场后发现一辆新能……穿裙子别只会搭光腿神器,今年流行这样配,看谁还说你俗气女人要漂亮优雅,裙子是必不可少的单品。别看秋冬衣服厚实,似乎裙子会累赘,实际上相比裤子,裙子的大摆反而更轻盈没有束缚感。毕竟裤子要想显瘦,就难以在里面加厚秋裤,而裙子里面就算穿……今天,武汉这些地方有免费玫瑰今天是好有爱的日子武汉,甜得冒泡气球大声告白玫瑰布满街巷路牌是想你的模样全城最出片的浪漫地标我们帮你找齐了(图片下方有定位,和T……童年阴影再升级!这部血腥电影30多年后再回归提到美国恐怖片最经典的反派,一定有人会想到美恐四大魔王。《十三号星期五》中的杰森、《猛鬼街》的佛莱迪、《德州电锯杀人狂》中的托马斯,还有《月光光心慌慌》中的迈克尔斯……(经济)美国CPI环比涨幅升至三个月最高新华社华盛顿2月14日电(记者许缘)美国劳工部14日公布的数据显示,主要受居住成本和能源价格上涨影响,今年1月美国消费者价格指数(CPI)环比上涨0。5,涨幅为2022年10月……喝酒时为什么不能碰花生米?医生喝酒尽量少吃这4种下酒菜中国人素来离不开酒,不论爱喝或不爱喝,多多少少都是要喝的。特别是男性朋友和事业型的女性朋友,身边酒局应酬多,喝酒必然是少不了的!当然,除了迫不得已喝酒的朋友之外,大部分饮……中国早春地图,带你看春天的一万种可能!春天是什么?这个问题的回答着实有很多。今天是我国二十四节气中的立春,标志着大地从漫长的严冬中苏醒。承包了一整个冬季冰上运动的北京冰场在这一天全部停业,广州的花市上姹紫嫣红……第十五集氨基酸的缺失与身体健康蛋白质的吸收和代谢一般情况下,食物蛋白质水解成氨基酸及小肽后方能被吸收,主要在小肠。完全不摄入蛋白质时,每日仍会有24g氮随尿排出,日常不补充依然会流失。人的……富氧空位的PtTiO2中的反向电荷转移和增强的氢溢出促进了H全文简介金属团簇的催化活性与载体密切相关;然而,关于载体对催化活性的影响的知识很少。结果表明,锚定在富氧空位(VOTiO2)和缺氧空位(VO缺陷PtTiO2)的多孔TiO……周末啦,可以去露营全球10大绝美露营地在星光下露营是感受一个新地方的最佳方式。露营可以使我们与大自然靠得更近,走出喧哗的都市,用心感受每一寸草地,每一缕阳光,让压力得到释放,心灵得到升华。绝佳的露营场所更有其特色所……
谢娜为什么这么招人讨厌?扒一扒讨厌精谢娜这些年做过的恶如果经常看综艺和逛某乎,一定认识芒果台主持人谢娜。特别是在某乎,她的人气很高,当然,不是因为喜欢她的人多,而是因为讨厌她的人太多了。在某乎有一个问题是:谢娜为什么这……在泰国住了两晚上,交了200电费2020年去泰国的那次旅行真是让我心情澎湃,经历许多从未想过会发生在泰国的事情。高物价和涨了十倍的门票就不提了,上一篇文章已经说过。最夸张的其实是最后一晚在普吉岛的……邱桑温泉发现了20万年前的脚印,专家说古代智人曾在这里生活在日常的学习过程中,我们熟悉的历史或许只有上下五千年,但这远远不是历史的全貌,我们可以畅想一下一万年前,十万年前,甚至是百万年以前,那时候的地球是什么样,古人的生活又是什么样。……做羊肉馅饺子,记住2放2不放的窍门,味道鲜香无膻味,特好吃进入冬月以后,大大小小的节气和节日有不少,在这些节日里,饺子永远是餐桌上的主角,一盘盘热气腾腾的饺子,闻着味就让人忍不住流口水。小编是北方人,从小就喜欢吃饺子,在我家的餐……被54岁大富婆拉出去都是泪李定熙最真实的素人改造等下到43楼上去一下。多大年龄了姐?5454,年轻10岁44,再年轻5岁39。对对对,往38那边发展,反正我来了。既然来找到你了,肯定交给你了。是不是就减龄一点。然……上半年终局之战即将打响,外媒小米这步棋,或将领先市场数载它来了,小米昂首挺胸、迈着自信的步伐,毅然杀入到上半年手机影像的内卷当中。近于饱和且平静的高端市场,由于雷总的大步往里闯,再次掀起了波涛汹涌的浪潮。雷军的自信自然是有原因……孙铭徽能否带领广厦冲出围堵,击败广东三少,掀翻对手?孙铭徽能否带领广厦冲出围堵,击败广东三少,掀翻对手?CBA终于来到了令人激动的季后赛,在对阵轮次中,广厦迎来了实力强大的广东队。从历史战绩来看,广东队可谓是风头无两。而广厦作为……三战不胜小组垫底,三狮练兵收获为零?欧国联小组赛第3轮,面对轮换了9人的意大利,英格兰空有地利,奈何不了对手。双方0比0互交白卷,加上德国也被匈牙利逼平,意大利以5分保住小组榜首,英格兰未能改变垫底的局面,2平1……60岁吴刚脸肿僵硬,妻子下巴尖苹果肌出戏,实力派动脸成败笔前几日,吴刚和赵露思等人出席了电视剧《后浪》的开机典礼上,此次吴刚将担任男主来出演关于中医传承的一个故事,在官方放出的合照中,不少网友都觉得吴刚怎么和以前大变样了,面部神态十分……1000元人民币能换120万老挝基普,这些钱能干啥,当地美女众所周知,国近几年发展飞速,国民的腰包也越来越鼓,很多人都开始尝试出国旅行的体验,可以说,中国游客是出国旅行最多的国家之一,尤其是东南亚,日本,韩国等地,到处都能看到中国游客的……法媒巴黎新帅将带五名助手进入教练组法甲超级豪门巴黎圣日耳曼已确定将在今夏更换主教练,据多家法国媒体报道,新帅人选基本已经确认,尼斯主帅克里斯托弗加尔蒂耶将在新赛季执教大巴黎。据法国媒体RMCSport消息……2022世界杯热门夺冠球队简析一、巴西:阵容豪华,没有明显短板。但内马尔是把双刃剑,经常性贪球权,容易上头,无脑粘球这些特点会严重影响、限制其他队友的发挥,导致巴西打不出应有的实力,而且现在的内马尔身体状态……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网