浣滆€咃細浠樺摜鍗氬锛歨ttps://bugstack.cn娌夋穩銆佸垎浜€佹垚闀匡紝璁╄嚜宸卞拰浠栦汉鏈夋墍鏀惰幏锛侌煒?.鍓嶈█鎬ュ拰蹇槸鏈€澶х殑闅滅锛佹參涓€鐐癸紝鎱竴鐐癸紝鍙湁鎱笅鏉ワ紝鎵嶈兘鐪嬪埌鏇村畬鏁寸殑淇℃伅锛屾墠鑳藉鍒版洿鎵庡疄鐨勬妧鏈€傝€岄偅浜涙弧瓒充綘閫熷害鐨勫皬鏁呬簨锛屾湁鏃舵洿鍚稿紩鐪肩悆锛屼絾涔熷鏄撹浜哄湪鎶€鏈涔犱笂璇叆姝ч€旓紝鎬讳互涓鸿秺蹇秺濂姐€傚皬鍌呭湪鍐欐妧鏈枃绔犵殑杩囩▼涓紝涔熶細閬囧埌杩欐牱鐨勬儏鍐碉紝寰堝璇昏€呮瘮杈冨枩娆㈢湅锛涗竴涓郴鍒楀唴瀹圭殑寮€绡囷紝涓€涓垚闀挎晠浜嬬殑鍒嗕韩锛屾灦鏋勭绫嶄竴鏃ュ畬鎴愩€傚綋鐒讹紝鎴戜篃鑳界悊瑙h繖绉嶅亸鐖便€傛瘯绔熷ぇ澶氭暟浜洪兘鍠滄璧版嵎寰勶紝灏卞儚鍐ぉ涔拌繍鍔ㄥ仴韬櫒鏉愶紝澶忓ぉ杩囧悗涓嶆媶鍖呬竴鏍枫€傚ソ鍚э紝璁╂垜浠█褰掓浼狅紒2.鐩爣褰撲綘鐪嬪埌杩欑瘒鏂囩珷鐨勬椂鍊欙紝鐩镐俊浣犲凡缁忔槸MybatisORM妗嗘灦宸ュ叿鐨勭啛缁冨伐浜嗐€備綘鐭ラ亾杩欎釜ORM妗嗘灦鏄浣曞睆钄芥垜浠暟鎹簱鎿嶄綔缁嗚妭鐨勫悧锛熶緥濡傦紝鎴戜滑鍦ㄤ娇鐢↗DBC鏃讹紝闇€瑕佽嚜宸辨墜鍔ㄥ缓绔嬫暟鎹簱閾炬帴锛屽SQL璇彞杩涜缂栫爜锛岃繘琛屾暟鎹簱鎿嶄綔锛屽杩斿洖缁撴灉杩涜灏佽銆傝€屼娇鐢∣RM妗嗘灦鍚庯紝鍙渶瑕侀€氳繃绠€鍗曠殑閰嶇疆锛屽氨鍙互瀵瑰畾涔夊ソ鐨凞AO鎺ュ彛杩涜鏁版嵁搴撴搷浣溿€傞偅涔堝湪鏈珷涓紝鎴戜滑灏嗚В鍐砄RM妗嗘灦涓璞℃帴鍙d笌鏄犲皠绫诲叧鑱旂殑绗竴涓棶棰橈紝浣跨敤DAO鎺ュ彛鐨勪唬鐞嗙被鏉ュ寘瑁呮槧灏勬搷浣溿€?銆佷竴鑸潵璇达紝濡傛灉璁捐鑳芥壘鍒板ぇ瀹跺伐浣滅殑鍏卞悓鍐呭锛屾湁缁熶竴鐨勬祦绋嬶紝閭d箞灏卞彲浠ュ皢鍏舵祿缂╂彁鐐硷紝鍋氭垚涓€涓叡鍚岀殑缁勪欢鎴栨湇鍔★紝渚涘ぇ瀹朵娇鐢紝鍑忓皯閲嶅鐨勪汉宸ヨ緭鍏ャ€傝€屽弬鑰冩垜浠竴寮€濮嬩娇鐢↗DBC鐨勬柟寮忥紝鍏跺疄浠庤繛鎺ワ紝鏌ヨ锛屽皝瑁咃紝杩斿洖閮芥湁涓€涓浐瀹氱殑娴佺▼锛屾墍浠ヨ繖涓祦绋嬪彲浠ョ粏鍖栵紝灏佽锛屽畬鎴愪綘闇€瑕佺殑鍔熻兘銆傛垜浠湪璁捐ORM妗嗘灦鐨勬椂鍊欙紝棣栧厛瑕佽€冭檻鐨勬槸濡備綍灏嗙敤鎴疯嚜瀹氫箟鐨勬暟鎹簱鎿嶄綔鎺ュ彛銆亁ml閰嶇疆鐨凷QL璇彞鍜屾暟鎹簱杩炴帴璧锋潵銆傚叾瀹炴渶鍚堥€傜殑鎿嶄綔鏄娇鐢ㄤ唬鐞嗘潵澶勭悊锛屽洜涓轰唬鐞嗗彲浠ュ皢澶嶆潅鐨勬祦绋嬪皝瑁呬负鎺ュ彛瀵硅薄鐨勫疄鐜扮被锛屽鍥?-1鎵€绀猴細棣栧厛锛屾彁渚涗竴涓唬鐞嗗疄鐜扮被MapperProxymapper锛屽苟閫氳繃浠g悊绫昏繘琛屽皝瑁呭浜庢暟鎹簱鐨勬搷浣滐紝鏈珷鎴戜滑鍏堟彁渚涗竴涓畝鍗曠殑灏佽鏉ユā鎷熷鏁版嵁搴撶殑璋冪敤銆傜劧鍚庯紝瀵逛簬MapperProxy浠g悊绫伙紝鎻愪緵宸ュ巶瀹炰緥鍖栨搷浣淢apperProxyFactory#newInstance锛屼负姣忎釜IDAO鎺ュ彛鐢熸垚涓€涓唬鐞嗙被銆傝繖鍧楀叾瀹炴槸鐢ㄤ簡涓€涓畝鍗曠殑宸ュ巶妯″紡銆備笅闈㈡垜浠氨鎸夌収杩欎釜璁捐鏉ュ疄鐜颁竴涓畝鍗曠殑mapper浠g悊鎿嶄綔銆傜紪鐮佽繃绋嬬浉瀵圭畝鍗曘€傚鏋滃浠g悊鐭ヨ瘑涓嶇啛鎮夛紝鍙互鍏堣ˉ鍏呫€傚洓.瀹炵幇1.椤圭洰缁撴瀯mybatis-step-01鈹斺攢鈹€src鈹溾攢鈹€main鈹傗敂鈹€鈹€java鈹傗敂鈹€鈹€cn.bugstack.mybatis.binding鈹傗敎鈹€鈹€MapperProxy.java鈹傗敂鈹€鈹€MapperProxyFactory.java鈹斺攢鈹€娴嬭瘯鈹斺攢鈹€java鈹斺攢鈹€cn.bugstack.mybatis.test.dao鈹溾攢鈹€dao鈹傗敂鈹€鈹€IUserDao.java鈹斺攢鈹€ApiTest.java椤圭洰婧愮爜锛歨ttps://t.zsxq.com/bmqNFQ7Mybatismapper浠g悊绫诲叧绯伙紝濡傚浘2-2鎵€绀恒€傜洰鍓峂ybatis妗嗘灦鐨勪唬鐞嗘搷浣滃彧瀹炵幇浜嗘牳蹇冨姛鑳斤紝鐩稿綋浜庝竴涓病鏈夊姞琛f湇鐨勫厜灞佽偂濞冨▋銆備絾鏄繖鏍风殑寰簭娓愯繘鐨勫疄鐜帮紝璁╁ぇ瀹跺厛浜嗚В浜嗘牳蹇冨唴瀹癸紝鍚庣画鎴戜滑浼氫笉鏂畬鍠勩€侻apperProxy璐熻矗瀹炵幇InvocationHandler鎺ュ彛鐨刬nvoke鏂规硶锛屾渶缁堟墍鏈夌殑瀹為檯璋冪敤閮戒細璋冪敤杩欎釜鏂规硶鍖呰9鐨勯€昏緫銆侻apperProxyFactory鏄疢apperProxy鐨勫寘瑁呭櫒锛屾彁渚涘疄渚嬪寲瀵硅薄鐨勫閮ㄦ搷浣溿€傚悗闈㈡垜浠紑濮嬩负姣忎釜鎿嶄綔鏁版嵁搴撶殑鎺ュ彛鏄犲皠鍣ㄦ敞鍐屼唬鐞嗙殑鏃跺€欙紝灏遍渶瑕佺敤鍒拌繖涓伐鍘傜被銆?銆乵apper浠g悊绫绘簮鐮佽锛歝n.bugstack.mybatis.binding.MapperProxypublicclassMapperProxyimplementsInvocationHandler,Serializable{privatestaticfinallongserialVersionUID=-6424540398559729838L;privateMapsqlSession;绉佹湁鏄犲皠鍣ㄦ帴鍙o紱publicMapperProxy(MapsqlSession,ClassmapperInterface){this.sqlSession=sqlSession;this.mapperInterface=mapperInterface;}@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{if(Object.class.equals(method.getDeclaringClass())){returnmethod.invoke(this,args);}else{return"浣犵殑浠g悊琚唬鐞嗕簡锛?+sqlSession.get(mapperInterface.getName()+"."+method.getName());}}}閫氳繃瀹炵幇InvocationHandler#invoke浠g悊绫绘帴鍙o紝灏佽鎿嶄綔閫昏緫锛屽澶栨帴鍙f彁渚涙暟鎹簱鎿嶄綔瀵硅薄銆傜洰鍓嶆垜浠繖閲屽彧鏄畝鍗曠殑灏佽浜嗕竴涓猻qlSessionMap瀵硅薄銆備綘鍙互鎯宠薄锛屾墍鏈夌殑鏁版嵁搴撹鍙ユ搷浣滈兘鏄互鎺ュ彛鍚?鏂规硶鍚嶄负key锛屾寜鐓ч€昏緫鐨勬柟寮忚繘琛屾搷浣溿€傜劧鍚庡湪鍙嶅皠璋冪敤涓紝鍙互鐩存帴鑾峰彇鍒扮浉搴旂殑鎿嶄綔骞舵墽琛岋紝杩斿洖缁撴灉銆傚綋鐒讹紝杩欏彧鏄牳蹇冪殑绠€鍖栬繃绋嬨€傛坊鍔犲唴瀹瑰悗锛屼細鐪嬪埌鏁版嵁搴撶殑杩愯鎯呭喌銆傚彟澶栭渶瑕佹敞鎰忕殑鏄紝濡傛灉Object鎻愪緵鐨則oString銆乭ashCode绛夋柟娉曚笉闇€瑕佷唬鐞嗘墽琛岋紝閭d箞娣诲姞Object.class銆俥quals(method.getDeclaringClass())鍒ゆ柇銆?銆佸叿浣撹浠g悊绫诲伐鍘傛簮鐮侊細cn.bugstack.mybatis.binding.MapperProxyFactorypublicclassMapperProxyFactory{privatefinalClassmapperInterface;publicMapperProxyFactory(ClassmapperInterface){this.mapperInterface=mapperInterface;}publicTnewInstance(MapsqlSession){finalMapperProxymapperProxy=newMapperProxy<>(sqlSession,mapperInterface);杩斿洖(T)Proxy.newProxyInstance(mapperInterface.getClassLoader(),newClass[]{mapperInterface},mapperProxy);}}宸ュ巶鎿嶄綔鐩稿綋浜庡皝瑁呬簡浠g悊鐨勫垱寤恒€傚鏋滀笉鍋氳繖灞傚皝瑁咃紝閭d箞姣忎竴涓垱寤轰唬鐞嗙被鐨勬搷浣滈兘闇€瑕佽嚜宸变娇鐢≒roxy.newProxyInstance鏉ュ鐞嗭紝鎵€浠ヨ繖绉嶆搷浣滄柟寮忔樉寰楁瘮杈冮夯鐑︺€傚彟澶栵紝濡傛灉浣犲proxy涓嶆槸寰堢啛鎮夛紝鍙互閲嶇偣鍋氬嚑涓狫DKProxy鍐呭鐨勬渚嬫潵琛ュ厖涓€涓嬭繖閮ㄥ垎鍐呭銆備簲銆佹祴璇?銆佹彁鍓嶅噯澶嘽n.bugstack.mybatis.test.dao.IUserDaopublicinterfaceIUserDao{StringqueryUserName(StringuId);IntegerqueryUserAge(StringuId);}棣栧厛鎻愪緵涓€涓狣AO鎺ュ彛锛屽畾涔?涓帴鍙f柟娉曘€?.娴嬭瘯鐢ㄤ緥@Testpublicvoidtest_MapperProxyFactory(){MapperProxyFactoryfactory=newMapperProxyFactory<>(IUserDao.class);MapsqlSession=newHashMap<>();sqlSession.put("cn.bugstack.mybatis.test.dao.IUserDao.queryUserName","妯℃嫙鎵цMapper.xml涓璖QL璇彞鐨勬搷浣滐細鏌ヨ鐢ㄦ埛鍚?);sqlSession.put("cn.bugstack.mybatis.test.dao.IUserDao.queryUserAge","妯℃嫙鎵цMapper.xml涓璖QL璇彞鐨勬搷浣滐細鏌ヨ鐢ㄦ埛骞撮緞");IUserDaouserDao=factory.newInstance(sqlSession);Stringres=userDao.queryUserName("10001");logger.info("Testresult:{}",res);}鍦ㄥ崟鍏冩祴璇曚腑鍒涘缓MapperProxyFactory宸ュ巶锛屾墜鍔ㄧ粰sqlSessionMap璧嬪€笺€傝繖閲岀殑璧嬪€肩浉褰撲簬妯℃嫙鏁版嵁搴撲腑鐨勬搷浣溿€傛帴涓嬫潵灏嗚祴鍊间俊鎭紶閫掔粰浠g悊瀵硅薄瀹炰緥鍖栨搷浣滐紝杩欐牱鎴戜滑鍦ㄨ皟鐢ㄥ叿浣撶殑DAO鏂规硶鏃跺氨鍙互浠巗qlSession涓幏鍙栧€间簡銆傛祴璇曠粨鏋?7:03:41.817[main]INFOcn.bugstack.mybatis.test.ApiTest-娴嬭瘯缁撴灉锛氫綘鐨勮浠g悊浜嗭紒妯℃嫙鎵цMapper.xml涓璖QL璇彞鐨勬搷浣滐細queryusernameProcessfinishedwithexitcode0浠庢祴璇曠粨鏋滃彲浠ョ湅鍑烘垜浠殑鎺ュ彛宸茬粡琚唬鐞嗙被瀹炵幇浜嗭紝鎴戜滑鍙互灏嗚嚜宸辩殑鎿嶄綔灏佽鍦ㄤ唬鐞嗙被銆傞偅涔堝湪鎴戜滑鍚庣画鐨勬暟鎹簱鎿嶄綔涓紝鍙互瀵硅繖閮ㄥ垎鍐呭杩涜鎵╁睍銆?.灏忕粨鏈珷鎴戜滑鍒濇灏哅ybatis妗嗘灦涓殑鏁版嵁搴揇AO鎿嶄綔鎺ュ彛鍜宮apper閫氳繃浠g悊绫昏仈绯昏捣鏉ャ€傝繖涓€姝ヤ篃鏄疧RM妗嗘灦涓潪甯告牳蹇冪殑閮ㄥ垎銆傛湁浜嗚繖鍧楀唴瀹癸紝灏卞彲浠ュ湪浠g悊绫讳腑鎵╁睍鑷繁鐨勯€昏緫浜嗐€傚湪妗嗘灦瀹炵幇涓婏紝寮曞叆绠€鍗曞伐鍘傛ā寮忓皝瑁呬唬鐞嗙被锛屽睆钄藉垱寤虹粏鑺傘€傝繖浜涗篃鏄ぇ瀹跺湪瀛︿範杩囩▼涓渶瑕佹敞鎰忕殑璁捐妯″紡鐨勮鐐广€傜洰鍓嶅唴瀹规瘮杈冪畝鍗曪紝鍙互鎵嬪姩缁冧範銆傞殢鐫€鎴戜滑鍐呭鐨勫鍔狅紝浼氬紩鍏ヨ秺鏉ヨ秺澶氱殑鍖呭拰绫绘潵瀹屽杽ORM妗嗘灦鐨勫姛鑳姐€?.绯诲垪鎺ㄨ崘銆奡pring 鎵嬫捀涓撴爮銆嬬涓€绔狅細寮€绡囦粙缁嶏紝甯︿綘鐪嬫槬澶╋紒閲嶅Java璁捐妯″紡锛氬疄鎴樺伐鍘傛柟娉曟ā寮忊€滃绫诲晢鍝佷笉鍚屾帴鍙o紝缁熶竴濂栧姳鏈嶅姟鏋勫缓鍦烘櫙鈥濇柟妗堣璁★細鍩轰簬搴撹〃鍒嗘鎵弿鍜屾暟鎹甊edis棰勭儹锛屼紭鍖栧垎甯冨紡鏃舵晥鎬elayedtaskreach涓や笁骞翠簡锛屼笉鐭ラ亾鏋舵瀯鍥捐鐢讳粈涔堬紵6涓湀鎷涜仒绛涢€?00+浠界畝鍘嗭紝鍛婅瘔浣犳€庝箞鍐欏鏄撹鎾╋紒