当前位置: 首页 > 后端技术 > Java

《手写Mybatis》第4章:Mapper XML的解析和注册使用

时间:2023-04-01 23:54:26 Java

銆婃墜鍐橫ybatis銆嬬鍥涚珷锛歁apperXML鐨勮В鏋愪笌娉ㄥ唽%AC1%E7%AB%A0%EF%BC%9A%E5%BC%80%E7%AF%87%E4%BB%8B%E7%BB%8D%EF%BC%8C%E6%89%8B%E5%86%99Mybatis%E8%83%BD%E7%BB%99%E4%BD%A0%E5%B8%A6%E6%9D%A5%E4%BB%80%E4%B9%88%EF%BC%9F.html娌夋穩銆佸垎浜€佹垚闀匡紝璁╄嚜宸卞拰浠栦汉鏈夋墍鏀惰幏锛侌煒?.鍓嶈█浣犲浣曢潰瀵瑰嚱鏁拌凯浠o紵浜嬪疄涓婏紝寰堝绋嬪簭鍛樺湪鍒氬紑濮嬬紪绋嬫垨鑰呭姞鍏ユ柊鍏徃鐨勬椂鍊欙紝骞舵病鏈夊お澶氱殑鏈轰細鍘诲仛涓€涓柊鐨勯」鐩€傚ぇ澶氭暟鏃跺€欙紝浠栦滑閮藉湪涓嶆柇鍦拌凯浠f洿鏂版棫椤圭洰銆傚湪杩欎釜杩囩▼涓紝浣犲彲鑳借瀛︿範N浣嶅墠杈堢暀涓嬬殑鍚勭椋庢牸鍚勫紓鐨勪唬鐮佺墖娈点€傚湪杩欎簺绾垫í浜ら敊鐨勬祦绋嬩腑锛屾壘涓€涓湴鏂癸紝鍔犲叆鑷繁鐨刬felse銆傝櫧鐒惰繖涔堣儭涔卞姞浜唅felse锛屼絾涓€寮€濮嬧€滃潖鈥濈殑蹇冩€佸緢涓嶈垝鏈嶃€備絾鏄湪宸茬粡鍘嬬缉鐨勫伐鏈熶笅浜や粯楂樿川閲忕殑浠g爜鍏跺疄鏄潪甯稿洶闅剧殑锛屾墍浠ラ儴鍒嗙爺鍙戣杩彲鐢紝璺戣捣鏉ュ氨澶熶簡銆備笉杩囪瘽铏藉姝わ紝鍏跺疄浣犱笉鍙兘閫愭笎娓呯悊涓€鍫嗙嫍灞庯紝璁╀唬鐮佸湪浣犳墜涓€愭笎娓呮櫚銆佹暣榻愩€佸共鍑€銆傚緢澶氭椂鍊欐槸鍥犱负鑷繁浣滀负coder鐨勭粡楠屼笉瓒筹紝涓嶆噦绯荤粺閲嶆瀯锛屼笉鎳傝璁″師鍒欙紝涓嶇啛鎮変笟鍔¤儗鏅紝涓嶆竻妤氫骇鍝佹柟鍚戠瓑鍘熷洜銆傛墍浠ユ渶濂界殑鍔炴硶灏辨槸鎻愰珮鑷繁鐨勮兘鍔涖€傛瘡娆℃偍鏀跺埌璇锋眰鏃讹紝閮戒細鏈変竴浜涙妧鏈洿鏀广€傛棦鐒舵槸鐙楀睅灞憋紝閭e氨褰撴垚鎵撴€崌绾т簡銆備慨涓€鐐癸紝鎹竴鍧楋紝淇竴鍧椼€備綘鏈夎秺鏉ヨ秺澶氱殑鏄撲簬缁存姢鍜屾墿灞曘€?.鐩爣鍦ㄩ€愭瀹炵幇Mybatis妗嗘灦鐨勮繃绋嬩腑锛岄鍏堣鏈変竴涓洰鏍囧鍚戠殑鎬濊矾锛屽嵆濡備綍瀹炵幇Mybatis鐨勬牳蹇冮€昏緫銆傚叾瀹炴垜浠彲浠ョ畝鍗曠殑鎶婅繖鏍蜂竴涓狾RM妗嗘灦鐨勭洰鏍囨弿杩颁负涓轰竴涓帴鍙f彁渚涗竴涓唬鐞嗙被銆傝绫诲寘鎷琈apper锛屽嵆xml鏂囦欢涓殑SQL淇℃伅锛堢被鍨嬨€佸叆鍙傘€佸嚭鍙傘€佹潯浠讹級銆傝В鏋愬拰澶勭悊锛岃繖涓鐞嗚繃绋嬪氨鏄鏁版嵁搴撹繘琛屾搷浣滐紝骞跺皢鐩稿簲鐨勭粨鏋滆繑鍥炵粰鎺ュ彛銆傚鍥?-1鎵€绀猴紝鏍规嵁ORM鏍稿績杩涚▼鐨勬墽琛屾祦绋嬶紝鎴戜滑闇€瑕佸湪涓婁竴绔犵殑鍩虹涓婄户缁睍寮€瀵筂apper鏂囦欢鐨勫垎鏋愶紝鎻愬彇鍑哄搴旂殑SQL鏂囦欢銆傝€岀幇闃舵锛屽綋鎴戜滑璋冪敤DAO鎺ュ彛鏂规硶鏃讹紝鎴戜滑鍙互鍦∕apper涓繑鍥炵浉搴旂殑SQL璇彞鏉ユ墽琛屻€備负浜嗕笉鎶婃暣涓」鐩睍寮€锛屼粯鍝ヤ細甯︾潃澶у涓€姝ユ瀹屾垚杩欎簺鍐呭锛屾墍浠ユ湰绔犳殏鏃朵笉浼氬鏁版嵁搴撹繘琛屾搷浣滐紝浠ュ悗浼氶€愭瀹炵幇銆傛壂鎻忚矾寰勪互娉ㄥ唽鏄犲皠鍣ㄥ苟鍦―efaultSqlSession涓娇鐢ㄣ€傞偅涔堬紝褰撴垜浠皢杩欎簺鍛藉悕绌洪棿銆丼QL鎻忚堪銆佹槧灏勪俊鎭粺涓€缁存姢鍒板悇涓狣AO瀵瑰簲鐨凪apperXML鏂囦欢涓悗锛孹ML鍏跺疄灏辨槸鎴戜滑鐨勬簮澶淬€侻apper鏄犲皠鍣ㄧ殑娉ㄥ唽鍜孲QL绠$悊鍙互閫氳繃瀵筙ML鏂囦欢鐨勮В鏋愬拰澶勭悊鏉ュ畬鎴愩€傝繖鏍锋柟渚挎垜浠搷浣滃拰浣跨敤銆傚鍥?-2鎵€绀猴紝棣栧厛闇€瑕佸畾涔塖qlSessionFactoryBuilder宸ュ巶寤洪€犺€呮ā寮忕被锛岄€氳繃鍏ュ彛IO瑙f瀽XML鏂囦欢銆傜洰鍓嶄富瑕侀泦涓湪瑙f瀽SQL閮ㄥ垎鍜屾敞鍐宮apper鏉ヨ繛鎺ユ暣涓牳蹇冩祦绋嬨€傛枃浠惰В鏋愬悗锛屼細瀛樻斁鍦–onfiguration閰嶇疆绫讳腑銆傛帴涓嬫潵浣犱細鐪嬪埌杩欎釜閰嶇疆绫讳細涓茶仈鍒版暣涓狹ybatis杩涚▼涓€傛墍鏈夌殑鍐呭瀛樺偍鍜岄槄璇婚兘绂讳笉寮€杩欎釜绫汇€傚鏋滄垜浠湪DefaultSqlSession涓幏鍙朚apper骞舵墽琛宻electOne锛屾垜浠繕闇€瑕佸湪Configuration閰嶇疆绫讳腑杩涜璇诲彇銆傚洓銆佸疄鐜?銆侀」鐩粨鏋刴ybatis-step-03鈹斺攢鈹€src鈹溾攢鈹€main鈹傗敂鈹€鈹€java鈹傗敂鈹€鈹€cn.bugstack.mybatis鈹傗敎鈹€鈹€binding鈹傗敎鈹€鈹€MapperMethod.java鈹傗攤鈹溾攢鈹€MapperProxy.java鈹傗攤鈹溾攢鈹€MapperProxyFactory.java鈹傗攤鈹斺攢鈹€MapperRegistry.java鈹傗敎鈹€鈹€builder鈹傗攤鈹溾攢鈹€xml鈹傗攤鈹斺攢鈹€XMLConfigBuilder.java鈹傗攤Base鈧斺攢鈹€Builder.java鈹溾攢鈹€io鈹傗攤鈹斺攢鈹€Resources.java鈹傗敎鈹€鈹€mapping鈹傗攤鈹溾攢鈹€MappedStatement.java鈹傗攤鈹斺攢鈹€SqlCommandType.java鈹傗敂鈹€鈹€session鈹傗敎鈹€鈹€defaults鈹傗敎鈹€鈹€DefaultSqlSession銆俲ava鈹傗攤鈹斺攢鈹€DefaultSqlSessionFactory.java鈹傗敎鈹€鈹€Configuration.java鈹傗敎鈹€鈹€SqlSession.java鈹傗敎鈹€鈹€SqlSessionFactory.java鈹傗敂鈹€鈹€SqlSessionFactoryBuilder.java鈹斺攢鈹€test鈹溾攢鈹€java鈹傗敂鈹€鈹€cn.bugstack.mybatis.test.dao鈹傗敎鈹€鈹€dao鈹傗攤鈹斺攢鈹€IUserDao.java鈹傗敎鈹€鈹€po鈹傗攤鈹斺攢鈹€User.java鈹傗敂鈹€鈹€ApiTest.java鈹斺攢鈹€resources鈹溾攢鈹€mapper鈹傗敂鈹€鈹€User_Mapper.xml鈹斺攢鈹€mybatis-config-datasource.xml椤圭洰婧愮爜锛歨ttps://t.zsxq.com/bmqNFQ7XML瑙f瀽涓庢敞鍐岀被瀹炵幇鍏崇郴锛屽鍥?-2鎵€绀猴紝SqlSessionFactoryBuilder浣滀负鏁翠釜Mybatis鐨勫叆鍙o紝鎻愪緵鏋勫缓鍣ㄥ伐鍘傦紝鍖呰XML瑙f瀽澶勭悊锛岃繑鍥炲搴旂殑SqlSessionFactory澶勭悊绫伙紝閫氳繃瑙f瀽灏哫ML淇℃伅娉ㄥ唽鍒癈onfiguration閰嶇疆绫讳腑锛屼互鍙婄劧鍚庡皢Configuration閰嶇疆绫讳紶閫掔粰鍚勪釜閫昏緫澶勭悊绫讳腑锛屽寘鎷珼efaultSqlSession锛岃繖鏍峰湪鑾峰彇mapper鍜屾墽琛孲QL鐨勬椂鍊欙紝灏卞彲浠ヤ粠閰嶇疆绫讳腑鑾峰彇瀵瑰簲鐨勫唴瀹广€?.鏋勫缓SqlSessionFactory鏋勫缓鍣ㄥ伐鍘傛簮鐮侊紝鍙傝锛歝n.bugstack.mybatis.session.SqlSessionFactoryBuilderpublicclassSqlSessionFactoryBuilder{publicSqlSessionFactorybuild(Readerreader){XMLConfigBuilderxmlConfigBuilder=newXMLConfigBuilder(reader);杩斿洖鐢熸垚鍣紙璇诲彇鍣級锛況eturnbuilder(xmlCon)}publicSqlSessionFactorybuild(Configurationconfig){杩斿洖鏂扮殑DefaultSqlSessionFactory(config);}}SqlSessionFactoryBuilder鏄暣涓狹ybatis鐨勫叆鍙g被锛岄€氳繃鎸囧畾瑙f瀽XML鐨処O鏉ュ紩瀵兼暣涓祦绋嬬殑鍚姩銆備粠杩欎釜绫诲紑濮嬶紝鏂板浜嗕袱涓鐞嗙被XMLConfigBuilder鍜孋onfiguration锛屽垎鍒敤鏉ヨВ鏋怷ML鍜岃鎺ユ暣涓祦绋嬬殑瀵硅薄淇濆瓨鎿嶄綔銆傛帴涓嬫潵鎴戜滑鍒嗗埆浠嬬粛杩欎簺鏂板紩鍏ョ殑瀵硅薄銆?銆乆ML瑙f瀽澶勭悊瑙佹簮鐮侊細cn.bugstack.mybatis.builder.xml.XMLConfigBuilderpublicclassXMLConfigBuilderextendsBaseBuilder{privateElementroot;publicXMLConfigBuilder(Readerreader){//1.璋冪敤鐖剁被鍒濆鍖朇onfigurationsuper(newConfiguration());//2.dom4j澶勭悊xmlSAXReadersaxReader=newSAXReader();灏濊瘯{Documentdocument=saxReader.read(newInputSource(reader));root=document.getRootElement();}catch(DocumentExceptione){e.printStackTrace();}}publicConfigurationparse(){try{//瑙f瀽mapperElement(root.element("mappers"));}catch(Exceptione){thrownewRuntimeException("瑙f瀽SQLMapper閰嶇疆鏃跺嚭閿欍€傚師鍥狅細"+e,e);}杩斿洖閰嶇疆锛泒privatevoidmapperElement(Elementmappers)throwsException{ListmapperList=mappers.elements("鏄犲皠鍣?);for(Elemente:mapperList){//瑙f瀽澶勭悊锛岃瑙佹簮鐮?/娣诲姞瑙f瀽SQL閰嶇疆.addMappedStatement(mappedStatement);}//娉ㄥ唽Mapper鏄犲皠鍣╟onfiguration.addMapper(Resources.classForName(namespace));}}}XMLConfigBuilder鐨勬牳蹇冩搷浣滄槸鍒濆鍖朇onfiguration锛屽洜涓篊onfiguration鐨勪娇鐢ㄦ槸鏈€鎺ヨ繎瑙f瀽XML鍜屽瓨鍌ㄧ殑鎿嶄綔锛屾墍浠ユ斁鍦ㄥ叿浣撶殑parse()瑙f瀽鎿嶄綔涔嬪悗鏀捐繖閲屾瘮杈冨悎閫傦紝瑙f瀽鍑烘潵鐨勯€氳繃Configuration閰嶇疆绫诲瓨鍌ㄤ俊鎭紝鍖呮嫭锛氭坊鍔犺В鏋怱QL鍜屾敞鍐孧apper鏄犲皠鍣ㄣ€傝В鏋愰厤缃暣浣撳寘鎷細绫诲瀷鍒悕銆佹彃浠躲€佸璞″伐鍘傘€佸璞″寘瑁呭伐鍘傘€佽缃€佺幆澧冦€佺被鍨嬭浆鎹€佹槧灏勫櫒锛屼絾鎴戜滑鏆傛椂涓嶉渶瑕侀偅涔堝锛屾墍浠ュ彧鍋氫竴浜涘繀瑕佺殑SQL瑙f瀽澶勭悊銆?.閫氳繃閰嶇疆绫伙紙閰嶇疆椤癸級鏌ョ湅娉ㄥ唽鏈烘簮鐮佸拰SQL璇彞灏佽锛歝n.bugstack.mybatis.session.ConfigurationpublicclassConfiguration{/***鏄犲皠娉ㄥ唽鏈?/protectedMapperRegistrymapperRegistry=newMapperRegistry锛堣繖锛?/***鏄犲皠璇彞锛屽瓨鍌ㄥ湪Map涓?/protectedfinalMapmappedStatements=newHashMap<>();publicvoidaddMapper(Classtype){mapperRegistry.addMapper(type);}publicvoidaddMappedStatement(MappedStatementms){mappedStatements.put(ms.getId(),ms);}}鍦ㄩ厤缃被涓坊鍔爉apper娉ㄥ唽鏈哄拰鏄犲皠璇彞鐨勫瓨鍌紱mapper娉ㄥ唽鏈烘槸鎴戜滑涓婁竴绔犲疄鐜扮殑鍐呭锛岀敤浜庢敞鍐孧apper鏄犲皠鍣ㄩ攣鎻愪緵鐨勬搷浣滅被銆傚彟涓€涓狹appedStatement鏄湰绔犳柊澧炵殑SQL淇℃伅璁板綍瀵硅薄锛屽寘鎷褰曪細SQL绫诲瀷銆丼QL璇彞銆佽緭鍏ュ弬鏁扮被鍨嬨€佽緭鍑哄弬鏁扮被鍨嬬瓑銆傚叿浣撳彲浠ュ弬鑰冩簮鐮?.DefaultSqlSession缁撳悎閰嶇疆椤硅幏鍙栦俊鎭€?{MappedStatementmappedStatement=configuration.getMappedStatement(statement);return(T)("浣犺浠g悊浜嗭紒"+"\n鏂规硶锛?+璇彞+"\n杈撳叆鍙傛暟锛?+鍙傛暟+"\n瑕佹墽琛岀殑SQL锛?+mappedStatement.getSql());}@OverridepublicTgetMapper(Classtype){returnconfiguration.getMapper(type,this);}}DefaultSqlSession涓庝笂涓€绔犵浉姣旓紝鍌呭ぇ鍝ヨ繖閲屽皢MapperRegistrymapperRegistry鎹㈡垚Configuration閰嶇疆锛屼紶閫掓洿涓板瘜鐨勪俊鎭唴瀹癸紝鑰屼笉浠呬粎鏄敞鍐岃〃鎿嶄綔銆備箣鍚庡湪DefaultSqlSession#selectOne鍜孌efaultSqlSession#getMapper杩欎袱涓柟娉曚腑浣跨敤閰嶇疆鑾峰彇鐩稿簲鐨勪俊鎭€傜洰鍓峴electOne鏂规硶鍙墦鍗拌幏鍙栧埌鐨勪俊鎭紝鍚庨潰浼氫粙缁峉QL鎵ц鍣ㄦ煡璇㈣繑鍥炵粨鏋溿€備簲銆佹祴璇?.鎻愬墠鍑嗗鎻愪緵DAO鎺ュ彛鍜屽搴旂殑Mapperxml閰嶇疆publicinterfaceIUserDao{StringqueryUserInfoById(StringuId);SELECTid,userId,userHead,createTimeFROMuserwhereid=#{id}2.鍗曞厓娴嬭瘯@Testpublicvoidtest_SqlSessionFactory()throwsIOException{//1.浠嶴qlSessionFactoryreader=Resources.getResourceAsReader("mybatis-config-datasource.xml")鑾峰彇SqlSessionReader;SqlBuildSessionFactorysqlSessionFactory=newSqlSessionFactory(newSqlSessionFactory).build(闃呰鍣?;SqlSessionsqlSession=sqlSessionFactory.openSession();//2.鑾峰彇鏄犲皠鍣ㄥ璞UserDaouserDao=sqlSession.getMapper(IUserDao.class);//3.娴嬭瘯楠岃瘉Stringres=userDao.queryUserInfoById("10001");缃梘ger.info("Testresult:{}",res);}鐩墠鐨勭敤娉曞拰Mybatis寰堝儚銆傞€氳繃鍔犺浇xml閰嶇疆鏂囦欢锛屼氦缁橲qlSessionFactoryBuilder杩涜鏋勫缓鍜岃В鏋愶紝鑾峰彇SqlSessionFactory宸ュ巶锛屼粠鑰岄『鍒╁紑鍚疭ession锛屽畬鎴愬悗缁搷浣溿€傛祴璇曠粨鏋?7:07:40.519[main]INFOcn.bugstack.mybatis.test.ApiTest-娴嬭瘯缁撴灉锛氭偍宸茶浠g悊锛佹柟娉曪細cn.bugstack.mybatis.test.dao.IUserDao.queryUserInfoById杈撳叆鍙傛暟锛歔Ljava.lang.Object;@23223dd8鎵ц鐨凷鈥嬧€婹L锛歋ELECTid,userId,userHead,createTimeFROMuserwhereid=?Processfinishedwithexitcode0浠庢祴璇曠粨鏋滃彲浠ョ湅鍑猴紝褰撳墠鐨勪唬鐞嗘搷浣滃凡缁忓彲浠ユ墦鍗板嚭鎴戜滑浠嶺ML涓В鏋愬嚭鏉ョ殑SQL淇℃伅锛屾垜浠皢缁撳悎杩欓儴鍒嗗鐞嗙户缁畬鎴愬鏁版嵁搴撶殑鎿嶄綔銆?.鎬荤粨浜嗚ВORM澶勭悊鐨勬牳蹇冩祦绋嬶紝鐭ラ亾鎴戜滑鎵€澶勭殑姝ラ鍜岃瀹屾垚鐨勫唴瀹广€傚彧鏈夐潪甯告竻妤氫唬鐞嗐€佸皝瑁呫€佽В鏋愩€佽繑鍥炵粨鏋滅殑杩囩▼锛屾墠鑳芥洿濂界殑瀹屾垚鏁翠釜妗嗘灦鐨勫疄鐜般€係qlSessionFactoryBuilder鐨勫紩鍏ュ寘瑁逛簡鏁翠釜鎵ц杩囩▼锛屽寘鎷細XML鏂囦欢瑙f瀽锛孋onfiguration閰嶇疆绫诲鐞嗭紝浣垮緱DefaultSqlSession鍙互鏇村姞鐏垫椿鐨勮幏鍙栫浉搴旂殑淇℃伅锛岃幏鍙朚apper鍜孲QL璇彞銆傚彟澶栵紝浠庢暣涓」鐩瀯寤鸿繃绋嬩腑锛屾垜浠彲浠ョ湅鍒板叾涓湁寰堝宸ュ巶妯″紡銆佸缓閫犺€呮ā寮忋€佷唬鐞嗘ā寮忥紝杩樻湁寰堝璁捐鍘熷垯銆傝繖浜涙妧鏈彲浠ヤ娇鏁翠釜椤圭洰鏄撲簬缁存姢鍜岃凯浠c€傝繖涔熸槸鐮斿彂浜哄憳鍦ㄥ涔犳簮鐮佺殑杩囩▼涓渶瑕佹敞鎰忕殑鍦版柟銆?/p>