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

Mybatis实战(二)创建一个简单的mapper代理工厂

时间:2023-04-02 09:30:19 Java

鐑埍瀛︿範锛岀儹鐖辩敓娲伙紒馃槃娌夋穩銆佸垎浜€佹垚闀匡紝璁╀綘鍜屼粬浜烘湁鎵€鏀惰幏锛侌煒?.鍓嶈█鎴戜滑鍦ㄤ娇鐢∕ybatis鐨勬椂鍊欙紝鎬讳細鏈夎繖鏍蜂竴涓枒闂細鈥滀负浠€涔圡ybatis鍙渶瑕佸畾涔変竴涓帴鍙o紝涓嶇敤鍐欏疄鐜扮被灏卞彲浠ョ敤XML涓殑SQL璇彞鎴栬€呮敞瑙f潵瀹屾垚瀵规暟鎹簱鐨勫鍒犳敼鏌ワ紵鈥濄€傜湅浜哅ybatis鐨勬簮鐮侊紝鎵嶇煡閬揗ybatis浣跨敤浜哅apper鎺ュ彛浠g悊绫伙紝鎶婃墍鏈夌殑鏁版嵁搴撴搷浣滈兘浜ょ粰浜嗕唬鐞嗙被銆?.Binding妯″潡Mapper鎺ュ彛浠g悊绫诲湪Binding妯″潡涓紝鏍稿績绫绘槸org.apache.ibatis.binding.MapperProxy銆侭inding妯″潡鐨勬牳蹇冪被濡備笅锛歰rg.apach.ibatis.binding.MapperRegistry锛歁apper鎺ュ彛娉ㄥ唽绫伙紝绠$悊Mapper鎺ュ彛绫诲瀷涔嬮棿鐨勬槧灏勫強鍏朵唬鐞嗗垱寤哄伐浣溿€傛垜浠湪寮€鍙戞椂鍒涘缓鐨凪apper鎺ュ彛绫婚兘浼氭敞鍐屽埌杩欓噷杩涜绠$悊銆俹rg.apach.ibatis.binding.MapperProxyFactory锛歁apper鎺ュ彛浠g悊绫诲垱寤哄伐鍘傜被銆俹rg.apach.ibatis.binding.MapperProxy锛歁apper鎺ュ彛浠g悊绫伙紝灏佽浜哠qlSession鐩稿叧鐨勬搷浣滐紝鍚庨潰鎴戜滑浼氬涔犲埌锛屾槸SQL鎵ц銆俹rg.apach.ibatis.binding.MapperMethod锛氬皝瑁呬簡Mapper鎺ュ彛瀵瑰簲鐨勬柟娉曞拰SQL鎵ц淇℃伅銆傝繖鏄垜浠紑鍙戞椂鍒涘缓鐨凪apper鎺ュ彛绫荤殑姣忎釜鏂规硶鐨刋ML閰嶇疆瀵瑰簲鐨凷QL璇彞銆傛祦绋嬪浘濡備笅锛?銆佷竴鑸鏋滆璁¤兘鎵惧埌澶у鍦ㄥ仛鐨勪簨鎯呯殑鍏卞悓鍐呭锛屾湁缁熶竴鐨勬祦绋嬪鐞嗭紝閭d箞灏卞彲浠ユ祿缂╂彁鐐硷紝灏佽鎴愪竴涓叡鍚岀殑缁勪欢鎴栨湇鍔★紝鍏变韩缁欏ぇ瀹跺ぇ瀹惰鍑忓皯閲嶅鏃犵敤鐨勫伐浣溿€傚弬鑰冩垜浠娇鐢ㄦ渶澶氱殑JDBC鏂瑰紡锛屼粠鑾峰彇鏁版嵁搴撹繛鎺ワ紝鏌ヨ锛屽皝瑁呯粨鏋滈泦锛岃繑鍥炵粨鏋滈泦锛岃繖浜涙楠ゆ槸涓€涓浐瀹氱殑娴佺▼锛屾墍浠ユ垜浠彲浠ユ妸杩欎釜娴佺▼灏佽鎴愪竴涓€氱敤鐨勭粍浠舵垨鑰呮湇鍔°€傛垜浠湪璁捐ORM妗嗘灦鐨勬椂鍊欙紝棣栧厛瑕佽€冭檻鐨勬槸濡備綍灏嗙敤鎴疯嚜瀹氫箟鐨勬暟鎹簱鎿嶄綔鎺ュ彛銆乆ML閰嶇疆鐨凷QL璇彞鍜屾暟鎹簱杩炴帴璧锋潵銆傚叾瀹炴渶鍚堥€傜殑鎿嶄綔灏辨槸浣跨敤proxy鏂规硶杩涜澶勭悊锛屽洜涓簆roxy鍙互灏嗕竴涓鏉傜殑娴佺▼灏佽涓烘帴鍙e璞$殑瀹炵幇绫汇€傝璁″涓嬶細棣栧厛鎻愪緵涓€涓狹apper鎺ュ彛浠g悊绫籑apperPoxy锛岄€氳繃浠g悊绫诲皝瑁呭鏁版嵁鐨勬搷浣滐紝鑷虫鏈珷鎴戜滑灏嗘彁渚涗竴涓畝鍗曠殑wrapper鏉ユā鎷熷鏁版嵁搴撶殑璋冪敤銆傜劧鍚庝负Mapper鎺ュ彛浠g悊绫绘彁渚涗竴涓畝鍗曠殑宸ュ巶绫籑apperProxyFactory璋冪敤瀹炰緥鏂规硶鎴愪负鍚勪釜Mapper鎺ュ彛鐨勪唬鐞嗙被銆?.瀹炵幇鍦ㄥ疄鐜颁箣鍓嶏紝鎴戜滑鍏堝涔犱唬鐞嗙煡璇嗐€傛垜浠娇鐢ㄤ簡鍔ㄦ€佷唬鐞嗘ā寮忋€傛垜浠€氳繃涓€涓皬demo瀛︿範浜嗗姩鎬佷唬鐞嗘ā寮忋€傝繕鏈夊彟澶栦袱绉嶄唬鐞嗘ā寮忥細闈欐€佷唬鐞嗗拰Cglib浠g悊銆傚姩鎬佷唬鐞嗗姩鎬佷唬鐞嗘湁浠ヤ笅鐗圭偣锛氬姩鎬佷唬鐞嗗璞′笉闇€瑕佸疄鐜版帴鍙o紝鍙渶瑕佺洰鏍囧璞″疄鐜版帴鍙e嵆鍙€傚疄鐜板熀浜庢帴鍙g殑鍔ㄦ€佷唬鐞嗭紝闇€瑕佷娇鐢↗DK涓殑API锛屽湪JVM鍐呭瓨涓姩鎬佹瀯寤轰唬鐞嗭紝鍦ㄨ繍琛屾椂鐢熸晥銆傛偍闇€瑕佷娇鐢╦ava.lang.reflect.Proxy鍙婂叾newProxyInstance()鏂规硶銆傝鏂规硶闇€瑕佷紶鍏ヤ笁涓弬鏁般€傛簮鐮佸涓嬶細@CallerSensitivepublicstaticObjectnewProxyInstance(ClassLoaderloader,Class[]interfaces,InvocationHandlerh)throwsIllegalArgumentException{//...}ClassLoaderloader锛氭寚瀹氬綋鍓嶇洰鏍囧璞′娇鐢ㄧ殑绫诲姞杞姐€傝幏鍙栧姞杞藉櫒鐨勬柟娉曟槸getClassLoader()銆俰nterfaces锛氱洰鏍囧璞″疄鐜版帴鍙g殑绫诲瀷锛屼娇鐢ㄦ硾鍨嬫柟娉曠‘璁ょ被鍨嬨€侷nvocationHandlerh锛氫簨浠跺鐞嗭紝褰撶洰鏍囨柟娉曞璞$殑鏂规硶鎵ц鏃讹紝浼氳Е鍙戜簨浠跺鐞嗙▼搴忕殑鏂规硶锛屽苟灏嗗綋鍓嶆鍦ㄦ墽琛岀殑鐩爣瀵硅薄鐨勬柟娉曚綔涓哄弬鏁颁紶鍏ャ€傛垜浠€氳繃鍏蜂綋鐨勫疄鐜板鍔ㄦ€佷唬鐞嗚繘琛屾搷浣溿€傜被缁撴瀯鍥惧涓嬶細浠g爜瀹炵幇锛歁apper鎺ュ彛浠g悊绫伙細publicclassMapperProxyimplementsInvocationHandler,Serializable{privatestaticfinallongserialVersionUID=-6424540398559729838L;绉佷汉鍦板浘<瀛楃涓诧紝瀛楃涓?sqlSession锛涚鏈夋渶缁堢被鏄犲皠鍣ㄦ帴鍙o紱publicMapperProxy(MapsqlSession,ClassmapperInterface){this.sqlSession=sqlSession;this.mapperInterface=mapperInterface;}@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{if(Object.class.equals(method.getDeclaringClass())){//Object涓殑鏂规硶锛岀洿鎺ユ墽琛宺eturnmethod.invoke(杩欎釜锛屽弬鏁帮級锛泒else{return"class"+mapperInterface.getName()+"琚唬鐞嗭紝鏂规硶鎵ц锛?+method.getName()+"锛宻qlSession涓猴細"+sqlSession;}}}Mapper鎺ュ彛浠g悊绫诲垱寤哄伐鍘傜被锛歱ublicclassMapperProxyFactory<T>{/***Mapper鎺ュ彛绫诲瀷*/privatefinalClassmapperInterface;publicMapperProxyFactory(ClassmapperInterface){this.mapperInterface=mapperInterface;}publicTnewInstance(MapsqlSession){MapperProxymapperProxy=newMapperProxy(sqlSession,mapperInterface);杩斿洖(T)Proxy.newProxyInstance(mapperInterface.getClassLoader(),newClass[]{mapperInterface},mapperProxy);}}IUserDao绫伙細publicinterfaceIUserDao{StringqueryUserName(StringuId);}娴嬭瘯绫伙細publicclassMapperProxyTest{@Testpublicvoidtest(){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("1");System.out.println(res);}}娴嬭瘯缁撴灉濡備笅锛氫唬鐞嗙被qtspace.cn.binding.IUserDao锛屾墽琛屾柟娉曪細queryUserName锛宻qlSession涓猴細{cn.bugstack.mybatis.test.dao.IUserDao.queryUserAge=妯℃嫙鎵цMapper.xml涓璖QL璇彞鐨勬搷浣滐細鏌ヨ鐢ㄦ埛骞撮緞锛宑n.bugstack.mybatis.test.dao.IUserDao.queryUserName=妯℃嫙鎵ц鎿嶄綔Mapper.xml涓殑SQL璇彞锛氭煡璇㈢敤鎴峰悕}鏄殑浠庝笂闈㈢殑娴嬭瘯缁撴灉鍙互鐪嬪嚭IUserDao琚唬鐞嗕簡锛屽綋鎵цMapperProxy#invoker()鏂规硶鏃讹紝浠g悊鎵ц鐨勬槸IUserDao#queryUserName()鏂规硶銆傞渶瑕佹敞鎰忕殑鏄紝鍦ㄥ姩鎬佷唬鐞嗘柟娉曚腑锛屾墍鏈夌殑鏂规硶閮戒細閫氳繃invoker()鏂规硶鎵ц锛屼絾鏄姩鎬佷唬鐞嗙殑闂鍦ㄤ簬瀹冨彧鑳戒唬鐞嗗疄鐜版煇涓帴鍙g殑瀹炵幇绫伙紝鑰屼唬鐞嗙被鍙兘浠g悊鎺ュ彛涓疄鐜扮殑鏂规硶銆傚鏋滃疄鐜扮被鏈夎嚜宸辩殑绉佹湁鏂规硶锛屼絾涓嶅湪鎺ュ彛涓紝鍒欐柟娉曚笉鑳借浠g悊銆?/p>

最新推荐
猜你喜欢