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

跟着码农《手写Mybatis》进步3:实现映射器的注册和使用

时间:2023-04-01 22:43:36 Java

浣滆€咃細浠樺摜鍗氬锛歨ttps://bugstack.cn娌夋穩锛屽垎浜紝鎴愰暱锛岃浣犲拰浠栦汉鏈夋墍鏀惰幏锛侌煒?.鍓嶈█濡備綍闈㈠澶嶆潅绯荤粺鐨勮璁★紵鎴戜滑鍙互璋冪敤Spring銆丮ybatis銆丏ubbo绛夊ぇ鍨嬫鏋讹紝涔熷彲浠ヨ皟鐢ㄥ叕鍙稿唴閮ㄧ殑涓€浜涙牳蹇冮」鐩紝閮藉彲浠ョО涓哄鏉傜郴缁熴€傝繖绉嶉」鐩笉鍐嶆槸缂栫▼鍒濆鑰呮墜涓殑鐜╁叿椤圭洰銆傛病鏈夋墍璋撶殑CRUD銆傛洿澶氱殑鏃跺€欙紝鎴戜滑瑕侀潰瀵圭殑鏄郴缁熷眰娆$粨鏋勭殑璁捐鍜岃仛鍚堥€昏緫鍔熻兘鐨勫疄鐜帮紝鐒跺悗閫氳繃灞傚眰杞崲鏉ュ疄鐜板拰瀹炴柦銆傝浆绉汇€傚浜庡緢澶氬垰鍏ラ棬鐨勫皬鐮佸啘鏉ヨ锛屼細瑙夊緱寰堜笉閫傚簲銆備粬浠笉鐭ラ亾浠庝綍涓嬫墜锛屽嵈鎯充竴鍙e悆鎺変竴涓儢瀛愩€傚叾瀹炶繖鏄笉鐜板疄鐨勶紝鍥犱负鍦ㄨ繖浜涘鏉傜殑绯荤粺妗嗘灦涓紝鏈夊お澶氱殑鍐呭鏄綘杩樻病鏈変簡瑙e拰鐔熸倝鐨勩€備簨瀹炰笂锛岃В鍐冲姝ゅ鏉傜殑椤圭洰闂锛屾牳蹇冨湪浜庣缉灏忎富瑕侀棶棰樼殑鑼冨洿銆傚叿浣撴墜娈靛寘鎷細鍒嗘不娉曘€佹娊璞℃硶鍜岀煡璇嗘硶銆傚埄鐢ㄨ璁℃ā寮忋€佽璁″師鍒欑瓑鐩稿叧鐭ヨ瘑锛屽皢闂绌洪棿鍚堢悊鍒掑垎涓鸿嫢骞蹭釜瀛愰棶棰樸€傞棶棰樿秺灏忥紝灏辫秺瀹规槗鐞嗚В鍜屽鐞嗐€傚氨鍍忎綘鍙互鎶婂緢澶氬唴瀹瑰仛鎴愪竴涓嫭绔嬬殑妗堜緥锛屾渶鍚庤仛鍚堣捣鏉ヤ娇鐢ㄣ€?.鐩爣鍦ㄤ笂涓€绔犱腑锛屾垜浠垵姝ヤ簡瑙d簡濡備綍涓烘帴鍙g被鐢熸垚瀵瑰簲鐨刴apper浠g悊锛屽苟鍦ㄤ唬鐞嗕腑瀹屾垚鐢ㄦ埛瀵规帴鍙f柟娉曠殑涓€浜涜皟鐢ㄣ€傝櫧鐒舵垜浠湅鍒颁簡涓€涓牳蹇冮€昏緫澶勭悊鏂规硶锛屼絾鏄粛鐒舵湁涓€浜涘垁鑰曠伀绉嶇殑鎿嶄綔鍦ㄤ娇鐢紝鍖呮嫭锛氶渶瑕佸湪浠g爜涓憡璇塎apperProxyFactory浠g悊鍝釜鎺ュ彛锛屽湪瀹為檯璋冪敤鐨勬椂鍊欏啓涓€涓亣鐨凷qlSession鏉ュ鐞嗚繑鍥炵粨鏋滅晫闈€傞偅涔堢粨鍚堣繖涓や釜闂锛屾垜浠皢鍦ㄦ湰绔犱腑涓簃apper娉ㄥ唽鎻愪緵娉ㄥ唽鏈哄鐞嗭紝鏂逛究鐢ㄦ埛鍦ㄤ娇鐢ㄦ椂鎻愪緵鍖呰矾寰勫畬鎴愭壂鎻忔敞鍐屻€傚悓鏃堕渶瑕佸SqlSession杩涜鏍囧噯鍖栵紝浣垮叾鑳藉鍖呰鎴戜滑鐨刴apper浠g悊鍜屾柟娉曡皟鐢紝寤虹珛鐢熷懡鍛ㄦ湡妯″瀷缁撴瀯锛屾柟渚垮悗缁殑鍐呭娣诲姞銆?銆佽璁¢壌浜庢垜浠灏嗘暣涓伐绋嬪寘涓嬬殑鏁版嵁搴撴搷浣滅殑DAO鎺ュ彛涓嶮apper鏄犲皠鍣ㄥ叧鑱旇捣鏉ワ紝闇€瑕佸皝瑁呬竴涓彲浠ユ壂鎻忓寘璺緞鐨勫瘎瀛樺櫒绫绘潵瀹屾垚鏄犲皠銆傚綋鐒讹紝鎴戜滑杩橀渶瑕佸涓婁竴绔犱腑绠€鍖栫殑SqlSession杩涜瀹屽杽銆係qlSession瀹氫箟浜嗘暟鎹簱澶勭悊鎺ュ彛鍜岃幏鍙朚apper瀵硅薄鐨勬搷浣滐紝浼犻€掔粰mapper浠g悊绫讳娇鐢ㄣ€傝繖閮ㄥ垎鏄涓婁竴绔犲唴瀹圭殑鏀硅繘銆傛湁浜哠qlSession涔嬪悗锛屼綘鍙互鎶婂畠鐞嗚В涓轰竴涓嚱鏁板紡鏈嶅姟銆傚綋浣犳湁浜嗕竴涓姛鑳芥湇鍔′箣鍚庯紝浣犻渶瑕佷负杩欎釜鍔熻兘鏈嶅姟鎻愪緵涓€涓伐鍘傛潵瀵瑰鎻愪緵杩欐牱鐨勬湇鍔°€傛瘮濡傛垜浠湪Mybatis涓緢甯歌鐨勬搷浣滃氨鏄紑鍚竴涓猄qlSession銆傛暣涓璁″彲浠ュ鍥?-1鎵€绀猴紝鐩爣鏄负灏佽鎺ュ彛鎻愪緵mapper浠g悊绫伙紝涓巑apper娉ㄥ唽涓績鐨凪apperRegistry浜掕ˉ锛岃嚜鍔ㄦ壂鎻忓皝瑁呬笅鐨勬帴鍙o紝瀛樺偍鎵€鏈夋槧灏勭殑浠g悊绫婚€氳繃姣忎釜鎺ュ彛绫昏繘鍏ョ紦瀛樹腑鏄犲皠鍣ㄤ唬鐞嗙殑HashMap銆係qlSession鍜孲qlSessionFactory鏄杩欓噷娉ㄥ唽鐨刴apper浠g悊鐨勪笂灞傛彁渚涚殑鏍囧噯瀹氫箟鍜屽澶栨湇鍔$殑灏佽锛屾柟渚跨敤鎴蜂娇鐢ㄣ€傛垜浠皢鐢ㄦ埛瑙嗕负鐢ㄦ埛銆傝繖鏍峰皝瑁呬箣鍚庯紝鎴戜滑缁х画鎵╁睍妗嗘灦鐨勫姛鑳戒細鏇村姞鏂逛究銆備篃甯屾湜澶у鍦ㄥ涔犵殑杩囩▼涓兘澶熸€濊€冭繖鏍蜂竴涓璁$粨鏋勶紝鑳藉甯姪澶у瑙e喅涓€浜涢棶棰樸€備笟鍔″姛鑳藉紑鍙戣繃绋嬩腑鐨勯鍩熸湇鍔″皝瑁呫€傚洓銆佸疄鐜?銆侀」鐩粨鏋刴ybatis-step-02鈹斺攢鈹€src鈹溾攢鈹€main鈹傗敂鈹€鈹€java鈹傗敂鈹€鈹€cn.bugstack.mybatis鈹傗敎鈹€鈹€binding鈹傗敎鈹€鈹€MapperProxy.java鈹傗攤鈹溾攢鈹€MapperProxyFactory.java鈹傗攤鈹斺攢鈹€MapperRegistry.java鈹傗敂鈹€鈹€session鈹傗敎鈹€鈹€defaults鈹傗攤鈹溾攢鈹€DefaultSqlSession.java鈹傗攤鈹斺攢鈹€DefaultSqlSessionFactory.java鈹傗敎鈹€鈹€jaSqlSessionSqlSessionFactory.java鈹斺攢鈹€test鈹斺攢鈹€java鈹斺攢鈹€cn.bugstack.mybatis.test.dao鈹溾攢鈹€dao鈹傗敎鈹€鈹€ISchoolDao.java鈹傗敂鈹€鈹€IUserDao.java鈹斺攢鈹€ApiTest.java椤圭洰婧愮爜:https://t.zsxq.com/bmqNFQ7mapper鏍囧噯瀹氫箟浜嗗疄鐜板叧绯伙紝濡傚浘3-2MapperRegistry鎻愪緵鍖呰矾寰勬壂鎻忓拰mapper浠g悊绫绘敞鍐屾満鏈嶅姟锛屽畬鎴愭帴鍙e璞$殑浠g悊绫绘敞鍐岃繃绋?SqlSession銆丏efaultSqlSession鐢ㄤ簬瀹氫箟浠ュ悗鎵цSQL鏍囧噯銆佽幏鍙栨槧灏勫櫒銆佺鐞嗕簨鍔$殑鎿嶄綔銆傚熀鏈笂鎴戜滑骞虫椂浣跨敤Mybatis鐨凙PI鎺ュ彛涔熸槸浠庤繖涓帴鍙g被瀹氫箟鐨勬柟娉曚腑浣跨敤鐨勩€係qlSessionFactory鏄竴涓畝鍗曠殑宸ュ巶妯″紡锛岀敤浜庢彁渚汼qlSession鏈嶅姟锛屽睆钄藉垱寤虹粏鑺傦紝寤惰繜鍒涘缓杩囩▼銆?銆乵apperregistry婧愮爜璇﹁锛歝n.bugstack.mybatis.binding.MapperRegistrypublicclassMapperRegistry{/***灏嗘坊鍔犵殑mapper浠g悊娣诲姞鍒癏ashMap涓?/privatefinalMap,MapperProxyFactory<锛?>knownMappers=newHashMap<>();publicTgetMapper(Classtype,SqlSessionsqlSession){finalMapperProxyFactorymapperProxyFactory=(MapperProxyFactory)knownMappers.get(type);}if(mapperProxyFactory==null){thrownewRuntimeException("Type"+type+"涓嶄负MapperRegistry鎵€鐭ャ€?);}try{returnmapperProxyFactory.newInstance(sqlSession);}catch(Exceptione){thrownewRuntimeException("鑾峰彇鏄犲皠鍣ㄥ疄渚嬫椂鍑洪敊銆傚師鍥狅細"+e,e);}}publicvoidaddMapper(Classtype){/*Mapper蹇呴』鏄娉ㄥ唽鐨勬帴鍙?/if(type.isInterface()){if(hasMapper(type)){//閲嶅娣诲姞浼氭姤閿檛hrownewRuntimeException("Type"+type+"isalreadyknowntotheMapperRegistry.");}//娉ㄥ唽鏄犲皠鍣ㄤ唬鐞嗗伐鍘俴nownMappers.put(type,newMapperProxyFactory<>(type));}}publicvoidaddMappers(StringpackageName){Set>mapperSet=ClassScanner.scanPackage(packageName);for(ClassmapperClass:mapperSet){addMapper(mapperClass);}}}MapperRegistry鏄犲皠鍣ㄦ敞鍐岀被鐨勬牳蹇冧富瑕佹槸鎻愪緵ClassScanner.scanPackage鎵弿鍖呰矾寰勶紝璋冪敤addMapper鏂规硶锛屼负鎺ュ彛绫诲垱寤轰竴涓狹apperProxyFactory鏄犲皠鍣ㄤ唬鐞嗙被锛屽啓鍏ュ埌knownMappers鐨凥ashMap缂撳瓨涓€傚彟澶栵紝杩欎釜绫昏繕鎻愪緵浜嗙浉搴旂殑getMapper鏂规硶鏉ヨ幏鍙杕apper浠g悊绫伙紝鍏跺疄鍦ㄤ笂涓€绔犵殑鎵嬪姩瀹炰緥鍖栬繃绋嬩腑宸茬粡琚寘瑁硅捣鏉ヤ簡锛屽湪DefaultSqlSession涓幏鍙朚apper鏃朵娇鐢ㄨ捣鏉ユ洿鏂逛究銆?銆丼qlSession鏍囧噯瀹氫箟鍜屽疄鐜版簮鐮佽瑙侊細cn.bugstack.mybatis.session.SqlSessionpublicinterfaceSqlSession{/***鑾峰彇璇彞key鏄犲皠鐨勫崟琛?鑾峰彇涓€涓皝瑁呭璞℃牴鎹寚瀹氱殑SqlID璁板綍**@param杩斿洖鐨勫璞$被鍨嬪皝瑁呭璞$被鍨?@param璇彞sqlID*@return鏄犲皠瀵硅薄灏佽瀵硅薄*/TselectOne(Stringstatement);/***妫€绱粠璇彞閿拰鍙傛暟鏄犲皠鐨勫崟琛屻€?鏍规嵁鎸囧畾鐨凷qlID鑾峰彇涓€鏉¤褰曠殑灏佽瀵硅薄锛屼絾鏄繖涓柟娉曞厑璁告垜浠粰sql浼犻€掍竴浜涘弬鏁?涓€鑸湪瀹為檯浣跨敤涓紝杩欎釜鍙傛暟鏄€氳繃pojo锛屾垨鑰匨ap鎴栬€匢mmutableMap**@param杩斿洖鐨刼bjecttype*@paramstatement涓庤浣跨敤鐨勮鍙ュ尮閰嶇殑鍞竴鏍囪瘑绗︺€?@paramparameter浼犻€掔粰璇彞鐨勫弬鏁板璞°€?@return鏄犲皠瀵硅薄*/TselectOne(Stringstatement,Objectparameter);/***妫€绱㈡槧灏勫櫒銆?鑾峰彇鏄犲皠鍣紝杩欑瀵规硾鍨嬬殑宸у浣跨敤浣跨被鍨嬪畨鍏?*@param鏄犲皠鍣ㄧ被鍨?@paramtypeMapper鎺ュ彛绫?@return涓€涓粦瀹氬埌杩欎釜SqlSession涓婄殑mapper*/TgetMapper(Classtype);}瀹氫箟鍦⊿qlSession涓墽琛孲QL锛岃幏鍙杕apper瀵硅薄鍜屽悗缁鐞嗕簨鍔℃搷浣滅殑鏍囧噯鎺ュ彛璇ユ帴鍙g洰鍓嶅彧鎻愪緵浜唖electOne鐢ㄤ簬鏁版嵁搴撴搷浣滐紝鍚庣画浼氭湁鍏朵粬鏂规硶鐨勭浉搴斿畾涔夈€傝瑙佹簮鐮侊細cn.bugstack.mybatis.session.defaultspublicclassDefaultSqlSessionimplementsSqlSession{/***MapperRegistry*/privateMapperRegistrymapperRegistry;@OverridepublicTselectOne(Stringstatement,Objectparameter){return(T)("浣犺浠g悊浜嗭紒"+"鏂规硶锛?+璇彞+"杈撳叆鍙傛暟锛?+parameter);}@OverridepublicTgetMapper(Classtype){returnmapperRegistry.getMapper(type,this);}}閫氳繃DefaultSqlSession瀹炵幇绫诲疄鐜癝qlSession鎺ュ彛銆俫etMapper鏂规硶涓幏鍙栫殑mapper瀵硅薄鏄€氳繃MapperRegistry绫昏幏鍙栫殑锛屽悗闈㈣繖閮ㄥ垎浼氳閰嶇疆绫绘浛浠c€傚湪selectOne涓紝鏄畝鍗曠殑鍐呭杩斿洖锛岃繕娌℃湁鍏宠仈鍒版暟鎹簱銆傝繖閮ㄥ垎鏄湪鎴戜滑閫愭寮€鍙戠殑杩囩▼涓€愭瀹炵幇鐨勩€?.SqlSessionFactory宸ュ巶瀹氫箟鍙婂疄鐜版簮鐮佽锛歝n.bugstack.mybatis.session.SqlSessionFactorypublicinterfaceSqlSessionFactory{/***鎵撳紑涓€涓猻ession*@returnSqlSession*/SqlSessionopenSession();}杩欏叾瀹炴槸涓€涓畝鍗曠殑瀹氫箟factory锛屽湪宸ュ巶涓彁渚涙帴鍙e疄鐜扮被鐨勮兘鍔涳紝鍗砈qlSessionFactory宸ュ巶涓彁渚涚殑寮€鍚疭qlSession鐨勮兘鍔涖€傛簮鐮佽瑙侊細cn.bugstack.mybatis.session.defaults.DefaultSqlSessionFactorypublicclassDefaultSqlSessionFactoryimplementsSqlSessionFactory{privatefinalMapperRegistry鏄犲皠鍣ㄦ敞鍐岃〃锛沺ublicDefaultSqlSessionFactory(MapperRegistrymapperRegistry){this.mapperRegistry=mapperRegistry;}@OverridepublicSqlSessionopenSession(){杩斿洖鏂扮殑DefaultSqlSession(mapperRegistry);}}榛樿鐨勭畝鍗曞伐鍘傚疄鐜板鐞嗕簡DefaultSqlSession鐨勫垱寤哄拰SqlSession寮€鍚椂mapperRegistry鐨勪紶閫掞紝浠庤€屽湪浣跨敤SqlSession鏃跺彲浠ヨ幏鍙栧埌鍚勪釜浠g悊绫荤殑mapper瀵硅薄銆備簲銆佹祴璇?銆佹彁鍓嶅噯澶囧湪鍚屼竴涓寘璺緞涓嬫彁渚?涓互涓婄殑Dao鎺ュ彛锛歱ublicinterfaceISchoolDao{StringquerySchoolName(StringuId);}publicinterfaceIUserDao{StringqueryUserName(StringuId);IntegerqueryUserAge(StringuId);}2.鍗曞厓娴嬭瘯@Testpublicvoidtest_MapperProxyFactory(){//1.娉ㄥ唽MapperMapperRegistryregistry=newMapperRegistry();registry.addMappers("cn.bugstack.mybatis.test.dao");//2.浠嶴qlSession宸ュ巶鑾峰彇SessionSqlSessionFactorysqlSessionFactory=newDefaultSqlSessionFactory(registry);SqlSessionsqlSession=sqlSessionFactory.openSession();//3.鑾峰彇鏄犲皠鍣ㄥ璞UserDaouserDao=sqlSession.getMapper(IUserDao.class);//4.娴嬭瘯楠岃瘉Stringres=userDao.queryUserName("10001");logger.info("娴嬭瘯缁撴灉锛歿}",res);}鍦ㄥ崟鍏冩祴璇曚腑閫氳繃娉ㄥ唽鏈烘壂鎻忓寘璺緞娉ㄥ唽mapper浠g悊瀵硅薄锛屽苟灏嗘敞鍐屾満浼犻€掔粰SqlSessionFactory宸ュ巶锛屼粠鑰屽畬鎴愪竴涓摼鎺ヨ繃绋嬨€傜劧鍚庨€氳繃SqlSession鑾峰彇瀵瑰簲DAO绫诲瀷鐨勫疄鐜扮被锛岃繘琛屾柟娉曟牎楠屻€傛祴璇曠粨鏋?2:43:23.254[main]INFOcn.bugstack.mybatis.test.ApiTest-娴嬭瘯缁撴灉锛氭偍宸茶浠g悊锛佹柟娉曪細queryUserName杈撳叆鍙傛暟锛歔Ljava.lang.Object;@50cbc42fProcessfinishedwithexitcode0閫氳繃娴嬭瘯锛屽彲浠ョ湅鍒版垜浠凡缁忓畬鎴愪簡鍦ㄤ竴涓墜鍐欑殑ORM妗嗘灦涓娇鐢∕ybatisshadow浠g悊绫荤殑娉ㄥ唽鍜屼娇鐢ㄣ€?.鎬荤粨棣栧厛锛屾垜浠浠庤璁$粨鏋勪笂鐞嗚В宸ュ巶妯″紡瀵瑰叿浣撳姛鑳界粨鏋勭殑灏佽锛屽睆钄芥祦绋嬬粏鑺傦紝闄愬埗涓婁笅鏂囷紝闄嶄綆澶栭儴浣跨敤鐨勮€﹀悎搴︺€備粠杩欎釜杩囩▼涓鑰呬篃鍙互鍙戠幇锛屼娇鐢⊿qlSessionFactory鐨勫伐鍘傚疄鐜扮被鍖呰浜哠qlSession鐨勬爣鍑嗗畾涔夊疄鐜扮被锛孲qlSession瀹屾垚浜唌apper瀵硅薄鐨勬敞鍐屽拰浣跨敤銆傛湰绔犺娉ㄦ剰鍑犱釜閲嶈鐨勭煡璇嗙偣锛屽寘鎷細鏄犲皠鍣ㄣ€佷唬鐞嗙被銆佹敞鍐屾満銆佹帴鍙f爣鍑嗐€佸伐鍘傛ā寮忋€佷笂涓嬫枃銆傝繖浜涘伐绋嬪紑鍙戞妧宸ф槸鎵嬪啓Mybatis杩囩▼涓潪甯搁噸瑕佺殑閮ㄥ垎銆傚彧鏈変簡瑙e拰鐔熸倝锛屾墠鑳芥洿濂藉湴杩愮敤鍒拌嚜宸辩殑涓氬姟涓€?/p>