锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产成人久久精品亚洲小说,亚洲国产精品自在自线观看,亚洲AV日韩AV天堂久久http://m.tkk7.com/wuxufeng8080/category/18455.htmlzh-cnWed, 07 Mar 2007 16:27:02 GMTWed, 07 Mar 2007 16:27:02 GMT60Don鈥檛 repeat the DAO!http://m.tkk7.com/wuxufeng8080/articles/101870.html椋庝漢鍥?/dc:creator>椋庝漢鍥?/author>Mon, 05 Mar 2007 03:51:00 GMThttp://m.tkk7.com/wuxufeng8080/articles/101870.html璇戣咃細(xì)Nicholas @ Nirvana Studio
鍘熸枃鍦板潃錛歨ttp://www-128.ibm.com/developerworks/java/library/j-genericdao.html

浣跨敤Hibernate鍜孲pring AOP璐緩涓涓寖鍨嬬被鍨嬪畨鍏ㄧ殑DAO
2006騫翠簲鏈?2鏃?br />

鍦ㄩ噰鐢ㄤ簡(jiǎn)Java 5鐨勮寖鍨嬩箣鍚庯紝瑕佸疄鐜頒竴涓熀浜庤寖鍨嬬被鍨嬪畨鍏ㄧ殑鏁版嵁璁塊棶瀵硅薄錛圖AO錛夊氨鍙樺緱鍒囧疄鍙浜?jiǎn)銆傚湪榪欑瘒鏂囩珷閲岋紝緋葷粺鏋舵瀯甯圥er Mellqvist灞曠ず浜?jiǎn)涓涓熀浜嶩ibernate鐨勮寖鍨婦AO瀹炵幇銆傜劧鍚庡皢浠嬬粛濡備綍浣跨敤Spring AOP鐨刬ntroduction涓轟竴涓被澧炲姞涓涓被鍨嬪畨鍏ㄧ殑鎺ュ彛浠ヤ究浜庢墽琛屾煡璇€?/blockquote>

瀵逛簬澶у鏁板紑鍙戣呮潵璇達(dá)紝鍦ㄧ郴緇熶腑涓烘瘡涓涓狣AO緙栧啓鍑犱箮涓鏍風(fēng)殑浠g爜宸茬粡鎴愪負(fù)浜?jiǎn)涓縐嶄範(fàn)鎯傚悓鏃跺ぇ瀹朵篃閮借鍙繖縐嶉噸澶嶅氨鏄滀唬鐮佺殑鍛抽亾鈥濓紝鎴戜滑涓殑澶у鏁板凡緇忎範(fàn)鎯姝ゃ傚綋鐒朵篃鏈夊彟澶栫殑鍔炴硶銆備綘鍙互浣跨敤寰堝ORM宸ュ叿鏉ラ伩鍏嶄唬鐮佺殑閲嶅緙栧啓銆備婦涓緥瀛愶紝鐢℉ibernate錛屼綘鍙互綆鍗曠殑浣跨敤session鎿嶄綔鐩存帴鎺у埗浣犵殑鎸佷箙鍖栭鍩熷璞°傝繖縐嶆柟寮忕殑璐熼潰褰卞搷灝辨槸涓㈠け浜?jiǎn)绫诲瀷瀹夊叏銆?

涓轟粈涔堜綘鐨勬暟鎹闂唬鐮侀渶瑕佷竴涓被鍨嬪畨鍏ㄧ殑鎺ュ彛錛熸垜璁や負(fù)瀹冨噺灝戜簡(jiǎn)緙栫▼閿欒錛屾彁楂樹(shù)簡(jiǎn)鐢熶駭鐜囷紝灝ゅ叾鏄湪浣跨敤鐜頒唬楂樼駭IDE鐨勬椂鍊欍傞鍏堬紝涓涓被鍨嬪畨鍏ㄧ殑鎺ュ彛娓呮櫚鐨勫埗瀹氫簡(jiǎn)鍝簺棰嗗煙瀵硅薄鍏鋒湁鎸佷箙鍖栧姛鑳姐傚叾嬈★紝瀹冩秷闄や簡(jiǎn)綾誨瀷杞崲甯︽潵鐨勬綔鍦ㄩ棶棰樸傛渶鍚庯紝瀹冨鉤琛′簡(jiǎn)IDE鐨勮嚜鍔ㄥ畬鎴愬姛鑳姐備嬌鐢ㄨ嚜鍔ㄥ畬鎴愬姛鑳芥槸鏈蹇殑鏂瑰紡鏉ヨ浣忓浜庨傚綋鐨勯鍩熺被鍝簺鏌ヨ鏄彲鐢ㄧ殑銆?

鍦ㄨ繖綃囨枃绔犻噷錛屾垜灝嗗睍紺虹粰澶у濡備綍閬垮厤涓嬈℃鍦伴噸澶嶇紪鍐橠AO浠g爜錛屼絾鍚屾椂榪樻敹鐩婁簬綾誨瀷瀹夊叏鐨勬帴鍙c備簨瀹炰笂錛屾墍鏈夊唴闇瑕佺紪鍐欑殑鏄負(fù)鏂扮殑DAO緙栧啓涓涓狧ibernate鏄犲皠鏂囦歡錛屼竴涓狿OJO鐨凧ava鎺ュ彛錛屽茍涓?0琛孲pring閰嶇疆鏂囦歡銆?

DAO瀹炵幇

DAO妯″紡瀵逛簬浠諱綍Java寮鍙戜漢鍛樻潵璇撮兘鏄崇啛鑳借鐨勩傝繖涓ā寮忕殑瀹炵幇鐩稿綋澶氾紝鎵浠ヨ鎴戜滑浠旂粏鎺ㄦ暡涓涓嬫垜榪欑瘒鏂囩珷閲岄潰瀵逛簬DAO瀹炵幇鐨勪竴浜涘亣璁撅細(xì)

  • 鎵鏈夌郴緇熶腑鐨勬暟鎹簱璁塊棶閮芥槸閫氳繃DAO鏉ュ畬鎴愬皝瑁?
  • 姣忎竴涓狣AO瀹炰緥瀵逛竴涓富瑕佺殑棰嗗煙瀵硅薄鎴栬呭疄浣撹礋璐c傚鏋滀竴涓鍩熷璞″叿鏈夌嫭绔嬬殑鐢熷懡鍛ㄦ湡錛岄偅涔堝畠闇瑕佸叿鏈夎嚜宸辯殑DAO銆?
  • DAO鍏鋒湁CRUD鎿嶄綔
  • DAO鍙互鍏佽鍩轟簬criteria鏂瑰紡鐨勬煡璇㈣屼笉浠呬粎鏄氳繃涓婚敭鏌ヨ銆傛垜灝嗚繖浜涙垚涓篺inder鏂規(guī)硶鎴栬協(xié)inders銆傝繖涓猣inder鐨勮繑鍥炲奸氬父鏄疍AO鎵璐熻矗鐨勯鍩熷璞$殑闆嗗悎銆?

鑼冨瀷DAO鎺ュ彛

鑼冨瀷DAO鐨勫熀紜灝辨槸CRUD鎿嶄綔銆備笅闈㈢殑鎺ュ彛瀹氫箟浜?jiǎn)鑼冨瀷DAO鐨勬柟娉曪細(xì)

						public
						interface GenericDao <T, PK extends Serializable> {
聽(tīng)
    /** Persist the newInstance object into database */
    PK create(T newInstance);
聽(tīng)
    /** Retrieve an object that was previously persisted to the database using
     *   the indicated id as primary key
     */
    T read(PK id);
聽(tīng)
    /** Save changes made to a persistent object.  */void update(T transientObject);
聽(tīng)
    /** Remove an object from persistent storage in the database */void delete(T persistentObject);
}

瀹炵幇榪欎釜鎺ュ彛

浣跨敤Hibernate瀹炵幇涓婇潰鐨勬帴鍙f槸闈炲父綆鍗曠殑銆備篃灝辨槸璋冪敤涓涓婬ibernate鐨勬柟娉曞拰澧炲姞涓浜涚被鍨嬭漿鎹€係pring璐熻矗session鍜宼ransaction綆$悊銆?

						public
						class GenericDaoHibernateImpl <T, PK extends Serializable>
    implements GenericDao<T, PK>, FinderExecutor {private Class<T> type;
聽(tīng)
    public GenericDaoHibernateImpl(Class<T> type){this.type = type;
    }
聽(tīng)
    public PK create(T o){return(PK) getSession().save(o);
    }
聽(tīng)
    public T read(PK id){return(T) getSession().get(type, id);
    }
聽(tīng)
    publicvoid update(T o){
        getSession().update(o);
    }
聽(tīng)
    publicvoid delete(T o){
        getSession().delete(o);
    }
聽(tīng)
    // Not showing implementations of getSession() and setSessionFactory()}

Spring 閰嶇疆

鏈鍚庯紝Spring閰嶇疆錛屾垜鍒涘緩浜?jiǎn)涓涓狦enericDaoHibernateImpl鐨勫疄渚嬨侴enericDaoHibernateImpl鐨勬瀯閫犲櫒蹇呴』琚憡鐭ラ鍩熷璞$殑綾誨瀷錛岃繖鏍稤AO瀹炰緥鎵嶈兘涓轟箣璐熻矗銆傝繖涓悓鏍烽渶瑕丠ibernate榪愯鏃剁煡閬撹繖涓璞$殑綾誨瀷銆備笅闈㈢殑浠g爜涓紝鎴戝皢棰嗗煙綾籔erson浼犻掔粰鏋勯犲櫒騫朵笖灝咹ibernate鐨剆ession宸ュ巶浣滀負(fù)涓涓弬鏁扮敤鏉ュ疄渚嬪寲DAO錛?

						
								<bean
								id="personDao"class="genericdao.impl.GenericDaoHibernateImpl">
						
								<constructor-arg>
						
						
								<value>
						genericdaotest.domain.Person</value></constructor-arg><propertyname="sessionFactory"><refbean="sessionFactory"/></property></bean>

鍙敤鐨勮寖鍨婦AO

鎴戣繕娌℃湁鍏ㄩ儴瀹屾垚錛屼絾鎴戠幇鍦ㄥ凡緇忔湁浜?jiǎn)涓涓彲渚涗綔鐨勪唬鐮併備笅闈㈢殑浠g爜灞曠ず浜?jiǎn)鑼冨瀷DAO濡備綍浣跨敤錛?

						public
						void someMethodCreatingAPerson(){
    ...
    GenericDao dao = (GenericDao)
     beanFactory.getBean("personDao"); // This should normally be injected
聽(tīng)
    Person p = new Person("Per", 90);
    dao.create(p);
}

榪欐椂鍊欙紝鎴戞湁涓涓寖鍨婦AO鏈夎兘鍔涜繘琛岀被鍨嬪畨鍏ㄧ殑CRUD鎿嶄綔銆傚悓鏃朵篃鏈夌悊鐢辯紪鍐橤enericDaoHibernateImpl鐨勫瓙綾繪潵涓烘瘡涓鍩熷璞″鍔犳煡璇㈠姛鑳姐備絾鏄繖綃囨枃绔犵殑涓繪棬鍦ㄤ簬灞曠ず濡備綍瀹屾垚榪欓」鍔熻兘鑰屼笉鏄負(fù)姣忎釜鏌ヨ緙栧啓鏄庣‘鐨勪唬鐮侊紝鐒惰岋紝鎴戝皢浼?xì)鋴社敤澶氫釜宸ュ呬h潵浠嬬粛DAO鐨勬煡璇紝榪欏氨鏄疭pring AOP鍜孒ibernate鍛藉悕鏌ヨ銆?

Spring AOP浠嬬粛

浣犲彲浠ヤ嬌鐢⊿pring AOP鎻愪緵鐨刬ntroduction鍔熻兘灝嗕竴涓幇瀛樼殑瀵硅薄鍖呰鍒頒竴涓唬鐞嗛噷闈㈡潵澧炲姞鏂扮殑鍔熻兘錛屽畾涔夊畠闇瑕佸疄鐜扮殑鏂版帴鍙o紝騫朵笖灝嗕箣鍓嶆墍鏈変笉鏀寔鐨勬柟娉曞媧懼埌涓涓鐞嗘満銆傚湪鎴戠殑DAO瀹炵幇閲岄潰錛屾垜鐢╥ntroduction灝嗕竴瀹氭暟閲忕殑finder鏂規(guī)硶澧炲姞鍒扮幇瀛樼殑鑼冨瀷DAO綾婚噷闈€傚洜涓篺inder鏂規(guī)硶閽堝鐗瑰畾鐨勯鍩熷璞★紝鎵浠ュ畠浠搴旂敤鍒拌〃鏄庢帴鍙g殑鑼冨瀷DAO涓?

						
								<bean
								id="finderIntroductionAdvisor"class="genericdao.impl.FinderIntroductionAdvisor"/>
聽(tīng)
<beanid="abstractDaoTarget"class="genericdao.impl.GenericDaoHibernateImpl"abstract="true"><propertyname="sessionFactory"><refbean="sessionFactory"/></property></bean>
聽(tīng)
<beanid="abstractDao"class="org.springframework.aop.framework.ProxyFactoryBean"abstract="true"><propertyname="interceptorNames"><list><value>finderIntroductionAdvisor</value></list></property></bean>

鍦ㄤ笂闈㈢殑閰嶇疆涓紝鎴戝畾涔変簡(jiǎn)涓変釜Spring bean錛岀涓涓猙ean錛孎inderIntroductionAdvisor錛屽鐞嗛偅浜沬ntroduce鍒癉AO涓絾鏄笉灞炰簬GenericDaoHibernateImpl綾葷殑鏂規(guī)硶銆備竴浼?xì)鎴戝啀浠嬀l岮dvisor bean鐨勮緇嗘儏鍐點(diǎn)?

絎簩涓猙ean瀹氫箟涓衡渁bstract鈥濄傚湪Spring涓紝榪欎釜bean鍙互琚叾浠朾ean閲嶇敤浣嗘槸瀹冭嚜宸變笉浼?xì)琚疄渚嬪寲銆備笉鍚屼簬鎶借薄灞炴э紝bean鐨勫畾涔夌畝鍗曠殑鎸囧嚭浜?jiǎn)鎴戦渶瑕佷竴涓狦enericDaoHibernateImpl鐨勫疄渚嬪悓鏃墮渶瑕佷竴涓猄essionFactory鐨勫紩鐢ㄣ傛敞鎰廏enericDaoHibernateImpl綾誨彧瀹氫箟浜?jiǎn)涓涓瀯閫犲櫒鎺ュ彈棰嗗煙綾諱綔涓哄弬鏁般傚洜涓鴻繖涓猙ean鏄娊璞$殑錛屾垜鍙互鏃犻檺嬈$殑閲嶇敤騫朵笖璁懼畾鍚堥傜殑棰嗗煙綾匯?

鏈鍚庯紝絎笁涓紝涔熸槸鏈鏈夋剰鎬濈殑鏄痓ean灝咷enericDaoHibernateImpl鐨勫疄渚嬪寘瑁呰繘浜?jiǎn)涓涓唬鐞嗭紝緇欎簣浜?jiǎn)瀹冩墽琛宖inder鏂規(guī)硶鐨勮兘鍔涖傝繖涓猙ean瀹氫箟鍚屾牱鏄娊璞$殑騫朵笖娌℃湁鎸囧畾浠諱綍鎺ュ彛銆傝繖涓帴鍙d笉鍚屼簬浠諱綍鍏蜂綋鐨勫疄渚嬨?

鎵╁睍閫氱敤DAO

姣忎釜DAO鐨勬帴鍙o紝閮芥槸鍩轟簬GenericDAO鎺ュ彛鐨勩傛垜闇瑕佸皢涓虹壒瀹氱殑棰嗗煙綾婚傞厤鎺ュ彛騫朵笖灝嗗叾鎵╁睍鍖呭惈鎴戠殑finder鏂規(guī)硶銆?

						public
						interface PersonDao extends GenericDao<Person, Long> {
    List<Person> findByName(String name);
}

涓婇潰鐨勪唬鐮佹竻鏅扮殑灞曠ず浜?jiǎn)閫氳繃鐢ㄦ埛鍚嶆煡鎵綪erson瀵硅薄鍒楄〃銆傛墍闇鐨凧ava瀹炵幇綾諱笉闇瑕佸寘鍚換浣曠殑鏇存柊鎿嶄綔錛屽洜涓鴻繖浜涘凡緇忓寘鍚湪浜?jiǎn)閫氱敤DAO閲屻?

閰嶇疆PersonDao

鍥犱負(fù)Spring閰嶇疆渚濊禆涔嬪墠鐨勯偅浜涙娊璞ean錛屾墍浠ュ畠鍙樺緱寰堢揣鍑戙傛垜闇瑕佹寚瀹欴AO璐熻矗鐨勯鍩熺被錛屽茍涓旀垜闇瑕佸憡璇塖pring鎴戣繖涓狣AO闇瑕佸疄鐜扮殑鎺ュ彛銆?

						
								<bean
								id="personDao"parent="abstractDao">
						
								<property
								name="proxyInterfaces">
						
								<value>
						genericdaotest.dao.PersonDao</value></property><propertyname="target"><beanparent="abstractDaoTarget"><constructor-arg><value>genericdaotest.domain.Person</value></constructor-arg></bean></property></bean>

浣犲彲浠ヨ繖鏍蜂嬌鐢細(xì)

						public
						void someMethodCreatingAPerson(){
    ...
    PersonDao dao = (PersonDao)
     beanFactory.getBean("personDao"); // This should normally be injected
聽(tīng)
    Person p = new Person("Per", 90);
    dao.create(p);
聽(tīng)
    List<Person> result = dao.findByName("Per"); // Runtime exception}

涓婇潰鐨勪唬鐮佹槸浣跨敤綾誨瀷瀹夊叏鎺ュ彛PersonDao鐨勪竴縐嶆紜斿緞錛屼絾鏄疍AO鐨勫疄鐜板茍娌℃湁瀹屾垚銆傚綋璋冪敤findByName()鐨勬椂鍊欏鑷翠簡(jiǎn)涓涓繍琛屾椂寮傚父銆傝繖涓棶棰樻槸鎴戣繕娌℃湁findByName()銆傚墿涓嬬殑宸ヤ綔灝辨槸鎸囧畾鏌ヨ璇彞銆傝瀹屾垚榪欎釜錛屾垜浣跨敤Hibernate鍛藉悕鏌ヨ銆?

Hibernate鍛藉悕鏌ヨ

浣跨敤Hibernate錛屼綘鍙互瀹氫箟浠諱綍HQL鏌ヨ鍦ㄦ槧灝勬枃浠墮噷錛屽茍涓旂粰瀹冧竴涓悕瀛椼備綘鍙互鍦ㄤ箣鍚庣殑浠g爜閲岄潰鏂逛究鐨勯氳繃鍚嶅瓧寮曠敤榪欎釜鏌ヨ銆傝繖涔堝仛鐨勪竴涓紭鐐瑰氨鏄兘澶熷湪閮ㄧ講鐨勬椂鍊欒皟鑺傛煡璇㈣屼笉闇瑕佹敼鍙樹(shù)唬鐮併傛濡備綘涓浼?xì)灏嗙湅鍒扮殑锛屽彟涓涓ソ澶勫氨鏄疄鐜頒竴涓滃畬鏁粹濈殑DAO鑰屼笉闇瑕佺紪鍐欎換浣旿ava瀹炵幇浠g爜銆?

						
								<hibernate-mapping
								package="genericdaotest.domain">
						
								<class
								name="Person">
						
								<id
								name="id">
						
								<generator
								class="native"/>
						
								</id>
						
						
								<property
								name="name"/>
						
								<property
								name="weight"/>
						
								</class>
						
聽(tīng)
     <queryname="Person.findByName"><![CDATA[select p from Person p where p.name = ? ]]></query></hibernate-mapping>

涓婇潰鐨勪唬鐮佸畾涔変簡(jiǎn)棰嗗煙綾籔erson鐨凥ibernate鏄犲皠鏂囦歡錛屾湁涓や釜灞炴э細(xì)name鍜寃eight銆侾erson鏄竴涓叿鏈変笂闈㈠睘鎬х殑綆鍗曠殑POJO銆傝繖涓枃浠跺悓鏃跺寘鍚簡(jiǎn)涓涓煡璇紝閫氳繃鎻愪緵鐨刵ame灞炴т粠鏁版嵁搴撴煡鎵綪erson瀹炰緥銆侶ibernate涓哄懡鍚嶆煡璇㈡彁渚涗簡(jiǎn)涓嶇湡瀹炵殑鍛藉悕絀洪棿鍔熻兘銆備負(fù)浜?jiǎn)渚夸簬璁ㄨ锛屾垜灏嗘墍鏈夌殑鏌ヨ鍚嶅瓧鐨勫墠緙鍙樻垚棰嗗煙綾葷殑鐨勫悕縐般傚湪鐜板疄鍦烘櫙涓紝浣跨敤瀹屾暣鐨勭被鍚嶏紝鍖呭惈鍖呭悕錛屾槸涓涓洿濂界殑涓繪剰銆?

鎬昏

浣犲凡緇忕湅鍒頒簡(jiǎn)涓轟換浣曢鍩熷璞″垱寤哄茍閰嶇疆DAO鐨勬墍闇姝ラ浜?jiǎn)銆傝繖涓変釜綆鍗曠殑姝ラ灝辨槸錛?

  1. 瀹氫箟涓涓帴鍙g戶鎵縂enericDao騫朵笖鍖呭惈浠諱綍鎵闇鐨刦inder鏂規(guī)硶
  2. 鍦ㄦ槧灝勬枃浠朵腑涓烘瘡涓鍩熺被鐨刦inder鏂規(guī)硶澧炲姞涓涓懡鍚嶆煡璇€?
  3. 涓篋AO澧炲姞10琛孲pring閰嶇疆

鍙噸鐢ㄧ殑DAO綾?/h2>

Spring advisor鍜宨nterceptor鐨勫姛鑳芥瘮杈冪悙紕庯紝浜嬪疄涓婁粬浠殑宸ヤ綔閮藉紩鐢ㄥ洖浜?jiǎn)GenericDaoHibernateImpl綾匯傛墍鏈夊甫鏈夆渇ind鈥濆紑澶寸殑鏂規(guī)硶閮借浼犻掔粰DAO鐨勫崟涓鏂規(guī)硶executeFinder()銆?

						public
						class FinderIntroductionAdvisor extends DefaultIntroductionAdvisor {public FinderIntroductionAdvisor(){super(new FinderIntroductionInterceptor());
    }}
聽(tīng)
publicclass FinderIntroductionInterceptor implements IntroductionInterceptor {
聽(tīng)
    publicObject invoke(MethodInvocation methodInvocation)throwsThrowable{
聽(tīng)
        FinderExecutor genericDao = (FinderExecutor) methodInvocation.getThis();
聽(tīng)
        String methodName = methodInvocation.getMethod().getName();
        if(methodName.startsWith("find")){Object[] arguments = methodInvocation.getArguments();
            return genericDao.executeFinder(methodInvocation.getMethod(), arguments);
        }else{return methodInvocation.proceed();
        }}
聽(tīng)
    publicboolean implementsInterface(Class intf){return intf.isInterface() && FinderExecutor.class.isAssignableFrom(intf);
    }}

executeFinder() 鏂規(guī)硶

涓婇潰鐨勪唬鐮佸敮涓緙虹殑灝辨槸executeFinder鐨勫疄鐜般傝繖涓唬鐮佽瀵熻璋冪敤鐨勭被鐨勫悕瀛楀拰鏂規(guī)硶錛屽茍涓斿皢浠栦滑涓嶩ibernate鐨勬煡璇㈠悕鐩稿尮閰嶃備綘鍙互浣跨敤涓涓狥inderNamingStrategy鏉ユ縺媧誨叾浠栨柟寮忕殑鍛藉悕鏌ヨ銆傞粯璁ょ殑瀹炵幇鏌ユ壘涓涓悕涓衡淐lassName.methodName鈥濈殑鏌ヨ錛孋lassName鏄櫎鍖呭悕涔嬪鐨勭被鍚嶃?

						public List<T> executeFinder(Method method, finalObject[] queryArgs){finalString queryName = queryNameFromMethod(method);
     finalQuery namedQuery = getSession().getNamedQuery(queryName);
     String[] namedParameters = namedQuery.getNamedParameters();
     for(int i = 0; i < queryArgs.length; i++){Object arg = queryArgs[i];
             Type argType =  namedQuery.setParameter(i, arg);
      }return(List<T>) namedQuery.list();
}
聽(tīng)
publicString queryNameFromMethod(Method finderMethod){return type.getSimpleName() + "." + finderMethod.getName();
}

鎬葷粨

鍦↗ava 5涔嬪墠錛孞ava璇█騫朵笉鏀寔浠g爜鍚屾椂鍏鋒湁綾誨瀷瀹夊叏鍜岃寖鎬х殑鐗規(guī)э紱浣犱笉寰椾笉浜岃呴変竴銆傚湪榪欑瘒鏂囩珷閲岋紝浣犲彲浠ョ湅鍒頒嬌鐢↗ava 5鑼冨瀷鏀寔騫朵笖緇撳悎Spring鍜孒ibernate錛堝拰AOP錛変竴璧鋒潵鎻愰珮鐢熶駭鍔涖備竴涓寖鍨嬬被鍨嬪畨鍏ㄧ殑DAO綾婚潪甯稿鏄撶紪鍐欙紝鎵鏈変綘闇瑕佸仛鐨勫氨鏄竴涓帴鍙o紝涓浜涘懡鍚嶆煡璇紝騫朵笖10琛孲pring閰嶇疆錛屽茍涓斿彲浠ユ瀬澶х殑鍑忓皯閿欒錛屽悓鏃惰妭鐪佹椂闂淬?



]]>Spring DAO 嫻嬭瘯http://m.tkk7.com/wuxufeng8080/articles/94597.html椋庝漢鍥?/dc:creator>椋庝漢鍥?/author>Thu, 18 Jan 2007 03:37:00 GMThttp://m.tkk7.com/wuxufeng8080/articles/94597.html棣栧厛鎴戜滑鏉ョ‘璁や竴涓媎ao闇瑕佷粈涔堟牱鐨勭幆澧冿紝鎴戠殑dao鏄敤Spring+hibernate鏉ユ瀯寤虹殑錛岃屽搴旂殑鏁版嵁婧愭槸oracle9銆傛墍浠ヨ榪涜dao鐨勬祴璇曟垜闇瑕佷粠Spring鐨勮繛鎺racle鐨刢ontext涓幏鍙杁ao鐨勫疄渚嬪嚭鏉ワ紝榪欓噷鎴戜嬌鐢ㄧ殑鏄痵pring-mock
spring-mock浣跨敤姣旇緝綆鍗曠殑錛屽彧闇瑕佽緗畇pring鐨勯厤緗枃浠惰礬寰勫氨鍙互鑾峰緱涓婁笅鏂囦簡(jiǎn)
榪欓噷闇瑕佹敞鎰忕殑鏄繖涓猻pring涓婁笅鏂囨槸ClassPathApplicationContext,鑰屾垜浠湪web鐜涓粡甯擱亣鍒扮殑鏄疻ebApplicationContext
/**
聽(tīng)*聽(tīng)$Id:$
聽(tīng)*
聽(tīng)*聽(tīng)Copyright聽(tīng)2005聽(tīng)easou,聽(tīng)I(yíng)nc.聽(tīng)All聽(tīng)Rights聽(tīng)Reserved.
聽(tīng)
*/

package聽(tīng)test.spring.common;

import聽(tīng)org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;

import聽(tīng)test.PathConfig;

public聽(tīng)class聽(tīng)BaseSpringTestCase聽(tīng)extends
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)AbstractTransactionalDataSourceSpringContextTests聽(tīng)
{聽(tīng)聽(tīng)聽(tīng)聽(tīng)

聽(tīng)聽(tīng)聽(tīng)聽(tīng)@Override
聽(tīng)聽(tīng)聽(tīng)聽(tīng)
protected聽(tīng)String[]聽(tīng)getConfigLocations()聽(tīng){

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)String[]聽(tīng)config聽(tīng)
=聽(tīng)PathConfig.springxml;

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)
return聽(tīng)config;

聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)
public聽(tīng)void聽(tīng)testConfig()聽(tīng){聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertNotNull(
"spring-mock聽(tīng)context聽(tīng)has聽(tīng)bean聽(tīng)init()",this.applicationContext);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}


}
榪欓噷testConfig鏄敤鏉ユ鏌ヤ綘spring閰嶇疆鐨勫姞杞芥槸鍚︽紜殑

涓嬮潰緇欏嚭涓涓狣AO鐨勭畝鍗曟煡璇㈡柟娉?
public聽(tīng)List聽(tīng)getHomepageAreasByChannelId(long聽(tīng)channelId)聽(tīng){

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)
return聽(tīng)this.executeHQL("聽(tīng)from聽(tīng)CsHomepageArea聽(tīng)聽(tīng)h聽(tīng)where聽(tīng)h.csChannel.id='"
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)
+聽(tīng)channelId聽(tīng)+聽(tīng)"'聽(tīng)order聽(tīng)by聽(tīng)h.theOrder");
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}


涓婇潰鐨勬柟娉曟寚紺烘牴鎹竴涓猧d鍙栧垪琛ㄥ嚭鏉ワ紝鑰屾垜浠嫻嬭瘯鐨勭洰鏍囨湁錛堝叾瀹炰篃灝辨槸鎴戜滑榪欎釜鏂規(guī)硶瑕佸疄鐜扮殑鐩爣錛夛細(xì)
1銆佺粰鍑烘紜殑id鏄惁鑳藉惁榪斿洖姝g‘鐨勭粨鏋?br />2銆佽繑鍥炵殑緇撴灉闆嗚兘澶熸牴鎹甴ibernate閰嶇疆鏂囦歡鑰屽緱鍒版垜浠湡鏈涚殑緇撴灉闆嗭紙姣斿璇村瀛愰泦鐨刲azy璇誨彇錛?br />3銆佽繑鍥炵殑緇撴灉闆嗘槸鍚︽寜鐓т綘鎵鏈熸湜鐨勬帓搴?br />4銆佺粰鍑洪敊璇殑id鏄惁鍦ㄨ幏鍙栨暟鎹椂浼?xì)鍑洪?br />鏍規(guī)嵁涓婇潰鐨勬祴璇曠洰鏍囨垜浠氨寰堝鏄撶殑寰楀埌涓嬮潰鐨勬祴璇曟柟娉曚簡(jiǎn)

public聽(tīng)void聽(tīng)testGetHomepageAreasByChannelId()聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)List聽(tīng)list聽(tīng)
=聽(tīng)channelDAO.getHomepageAreasByChannelId(1);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertNotNull(
"homepage聽(tīng)list聽(tīng)is聽(tīng)not聽(tīng)null",聽(tīng)list);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)CsHomepageArea聽(tīng)homepage聽(tīng)
=聽(tīng)(CsHomepageArea)聽(tīng)list.get(0);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertNotNull(
"homepage'name聽(tīng)is聽(tīng)not聽(tīng)null",聽(tīng)homepage.getName());
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertNotNull(
"homepage'channel聽(tīng)has聽(tīng)been聽(tīng)lazy",聽(tīng)homepage.getCsChannel()
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng).getName());
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertNotNull(
"homepage'column聽(tīng)has聽(tīng)been聽(tīng)lazy",聽(tīng)homepage.getCsColumn()
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng).getName());
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertNotNull(
"homepage'subject聽(tīng)has聽(tīng)been聽(tīng)lazy",聽(tīng)homepage
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng).getCsSubjects().iterator().next().getName());
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)CsSubject聽(tīng)subject聽(tīng)
=聽(tīng)(CsSubject)聽(tīng)homepage.getCsSubjects().iterator()
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng).next();
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertNotNull(
"homepage'subject'keyword聽(tīng)has聽(tīng)been聽(tīng)lazy",聽(tīng)subject
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng).getCsSubjectKeywords().iterator().next().getName());

聽(tīng)聽(tīng)聽(tīng)聽(tīng)}

瀵逛簬DAO灞傜殑鏌ヨ鏂規(guī)硶錛屾垜浠祴璇曠殑灝辨槸鍒ゆ柇榪斿洖鐨勬暟鎹槸鍚︽槸鎴戜滑闇瑕佺殑

涓嬮潰榪欎釜鏂規(guī)硶鏄疍AO鐨勫鏀規(guī)柟娉曪紝鍜屽垹闄ゆ柟娉?br />

public聽(tīng)void聽(tīng)saveComment(CsComment聽(tīng)comment)聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)getHibernateTemplate().saveOrUpdate(comment);聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}

聽(tīng)聽(tīng)聽(tīng)聽(tīng)
public聽(tīng)void聽(tīng)deleteComment(CsComment聽(tīng)comment)聽(tīng){聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)getHibernateTemplate().delete(comment);聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}

聽(tīng)

瀵逛簬榪欑鏃犺繑鍥炲煎緱鏂規(guī)硶鎴戜滑涓昏嫻嬭瘯鐨勬槸錛?br />1銆佸浜庢紜殑鏁版嵁鏄惁鑳藉姝g‘鐨勫瓨鍏ユ暟鎹簱鎴栬呬粠鏁版嵁搴撳垹闄?br />2銆佸浜庨敊璇殑鏁版嵁鎿嶄綔鑳藉鏈夐敊璇俊鎭紙濡備富閿噸澶嶏級(jí)

public聽(tīng)void聽(tīng)testSaveComment(){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)CsComment聽(tīng)comment聽(tīng)
=聽(tīng)new聽(tīng)CsComment();
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)comment.setCommentDate(
new聽(tīng)Date());
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)comment.setContent(
"comment聽(tīng)test");
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)channelDAO.saveComment(comment);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)CsComment聽(tīng)dbComment聽(tīng)
=(CsComment)channelDAO.getEntity(comment.getId());
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertNotNull(
"comment聽(tīng)has聽(tīng)bean聽(tīng)saved",聽(tīng)dbComment);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}

聽(tīng)聽(tīng)聽(tīng)聽(tīng)
public聽(tīng)void聽(tīng)testDeleteComment(){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)CsComment聽(tīng)comment聽(tīng)
=聽(tīng)new聽(tīng)CsComment();
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)comment.setId(
new聽(tīng)Long(13));
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)channelDAO.delete(comment);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)CsComment聽(tīng)dbComment聽(tīng)
=(CsComment)channelDAO.getEntity(comment.getId());
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertNull(
"comment聽(tīng)has聽(tīng)bean聽(tīng)delete",聽(tīng)dbComment);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}

鍏跺疄榪欑save鎴栬卍elete鐨勬柟娉曠敱浜庝嬌鐢ㄦ椂閮芥槸鍩烘湰璋冪敤hibernate鐨勬柟娉曪紝鎵浠ュ湪鎴戠湅鏉ユ祴璇曠殑鎰忎箟騫朵笉鏄緢澶?br />

]]>
iBATIS鎶宸?/title><link>http://m.tkk7.com/wuxufeng8080/articles/88175.html</link><dc:creator>椋庝漢鍥?/dc:creator><author>椋庝漢鍥?/author><pubDate>Sat, 16 Dec 2006 07:06:00 GMT</pubDate><guid>http://m.tkk7.com/wuxufeng8080/articles/88175.html</guid><description><![CDATA[ <p>鐜板湪欏圭洰涓嬌鐢╥batis浣滀負(fù)鏁版嵁搴撴搷浣滃伐鍏鳳紝鍦ㄦ繁鎰焛batis鍔熻兘寮哄ぇ鐨勫悓鏃訛紝涓鐩翠篃鍦ㄤ負(fù)濡備綍鍐欏嚭鍔ㄦ丼QL鑰屽洶鎯戯紝鑷繁涔熸槸鍦ㄤ竴鐐圭偣鐨勬懜绱腑錛岀幇鍦ㄥ彂鐜皃repend榪欎釜灝忓伐鍏風(fēng)‘瀹炰笉閿欙紝涓嬮潰灝辨槸鍦ㄩ」鐩腑鑷繁鎽哥儲(chǔ)鐨勫嚑涓皬鐢ㄦ硶銆?</p> <p>1錛氶氬父鐢ㄦ硶錛屼篃鏄ぇ澶氭暟鍙傝冩枃绔犱笂闈粙緇嶇殑鏂規(guī)硶</p> <div id="pnhoilf" class="code_title">xml 浠g爜</div> <div id="iqfqyhd" class="dp-highlighter"> <div id="sdikudr" class="bar"> </div> <ol class="dp-xml"> <li id="gcqkdfi" class="alt"> <span> <span id="rgftogj" class="tag"><</span> <span id="eeyprfx" class="tag-name">dynamic</span> <span>聽(tīng)</span> <span id="rvqpsrj" class="attribute">prepend</span> <span>=</span> <span id="bqfavcb" class="attribute-value">"where"</span> <span id="whylrbt" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </span> </li> <li id="wlvqznx" class=""> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span> <span id="alkfldr" class="tag"><</span> <span id="iqarbtt" class="tag-name">isNotEmpty</span> <span>聽(tīng)</span> <span id="fgjihgy" class="attribute">prepend</span> <span>=</span> <span id="fftkfxo" class="attribute-value">"and"</span> <span>聽(tīng)</span> <span id="wlzulon" class="attribute">property</span> <span>=</span> <span id="yrfxscb" class="attribute-value">"csendUserId"</span> <span id="yqavfeh" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </li> <li id="exsytad" class="alt"> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span> <span id="atsrbog" class="attribute">csendUserId</span> <span>聽(tīng)=聽(tīng)#csendUserId#聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </li> <li id="zhntsrj" class=""> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span> <span id="jgftojt" class="tag"> <span id="ownmwzy" class="tag-name">isNotEmpty</span> <span id="ckutdvu" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </span> </li> <li id="pmlvubp" class="alt"> <span>聽(tīng)聽(tīng)</span> <span id="fvulgut" class="tag"> <span id="zaridcb" class="tag-name">dynamic</span> <span id="ajpzfts" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)</span> </span> </li> </ol> </div> <p>聽(tīng)</p> <p> <font face="Arial">2錛氶氬父鐢ㄦ硶鐨勫皬灝忔墿鍏咃紝鍦ㄩ噷闈㈠鍔犱竴涓猘nd</font> </p> <div id="fdfezyx" class="code_title">xml 浠g爜</div> <div id="zwrfehv" class="dp-highlighter"> <div id="tridcfp" class="bar"> </div> <ol class="dp-xml"> <li id="ljtoyqa" class="alt"> <span> <span id="pjtdnbi" class="tag"><</span> <span id="xcxazru" class="tag-name">dynamic</span> <span>聽(tīng)</span> <span id="mcxdjxh" class="attribute">prepend</span> <span>=</span> <span id="euprxpg" class="attribute-value">"where"</span> <span id="lmdjedr" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </span> </li> <li id="vwkqwgq" class=""> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span> <span id="mgblzym" class="tag"><</span> <span id="ravqlzn" class="tag-name">isNotEmpty</span> <span>聽(tīng)</span> <span id="dxsnmlk" class="attribute">prepend</span> <span>=</span> <span id="ijlrxhs" class="attribute-value">"and"</span> <span>聽(tīng)</span> <span id="nzylcbe" class="attribute">property</span> <span>=</span> <span id="hmsjezn" class="attribute-value">"csendUserId"</span> <span id="xgfazyx" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </li> <li id="wbwgfxw" class="alt"> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span> <span id="mvqwrql" class="attribute">csendUserId</span> <span>聽(tīng)=聽(tīng)#csendUserId#聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </li> <li id="gwcxogj" class=""> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)and聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </li> <li id="vpzuasn" class="alt"> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span> <span id="kesnthr" class="attribute">isenddr</span> <span>聽(tīng)=聽(tīng)</span> <span id="lfaouis" class="attribute-value">0</span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </li> <li id="revfeor" class=""> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span> <span id="bvblvqt" class="tag"> <span id="bzutzjq" class="tag-name">isNotEmpty</span> <span id="inpdyqi" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </span> </li> <li id="kihnpdv" class="alt"> <span> </span> <span id="tvulvnm" class="tag"> <span id="kpzntlo" class="tag-name">dynamic</span> <span id="uzfpryx" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </span> </li> </ol> </div> <p>聽(tīng)</p> <p> <font face="Arial">3錛氬湪鏁版嵁搴撹〃榪炴帴澶勪嬌鐢紝鑷繁浠ュ墠浠庢潵娌℃湁榪囩殑鎯蟲(chóng)硶錛氾級(jí)</font> </p> <div id="nhvfwkj" class="code_title">xml 浠g爜</div> <div id="luezqak" class="dp-highlighter"> <div id="gtdfpvr" class="bar"> </div> <ol class="dp-xml"> <li id="tgqwgba" class="alt"> <span> <span id="jsgtsrf" class="tag"><</span> <span id="qzqagjx" class="tag-name">dynamic</span> <span>聽(tīng)</span> <span id="qdnpkcm" class="attribute">prepend</span> <span>=</span> <span id="dfavbls" class="attribute-value">"left聽(tīng)outer聽(tīng)join聽(tīng)cms_user聽(tīng)U聽(tīng)on聽(tīng)"</span> <span id="oxwcmpo" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </span> </li> <li id="pridyxa" class=""> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span> <span id="fhulzbl" class="tag"><</span> <span id="zmdqhzc" class="tag-name">isNotEmpty</span> <span>聽(tīng)</span> <span id="rprxsgb" class="attribute">prepend</span> <span>=</span> <span id="vxhnpzn" class="attribute-value">""</span> <span>聽(tīng)</span> <span id="fzmsgue" class="attribute">property</span> <span>=</span> <span id="erblgyx" class="attribute-value">"creceiveUserid"</span> <span id="uhrfphg" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </li> <li id="ragblkf" class="alt"> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span> <span id="vwytdnm" class="attribute">M.csendUserId</span> <span>聽(tīng)=聽(tīng)U.pk_user聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </li> <li id="eyehrqb" class=""> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span> <span id="fouedru" class="tag"> <span id="yarxhrb" class="tag-name">isNotEmpty</span> <span id="omwrxsv" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </span> </li> <li id="kizulon" class="alt"> <span> </span> <span id="ljtkbaz" class="tag"> <span id="nwnxlpd" class="tag-name">dynamic</span> <span id="tgqagba" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span> </span> </li> </ol> </div> <p>聽(tīng)</p> <p> <font face="Arial">4錛氭绱㈡潯浠跺浣跨敤錛屽姩鎬佸鍔犳绱㈡潯浠?/font> </p> <div id="zxwvbih" class="code_title">xml 浠g爜</div> <div id="irxhyxl" class="dp-highlighter"> <div id="tviscym" class="bar"> </div> <ol class="dp-xml"> <li id="npgiogm" class="alt"> <span> <span id="mkuidgb" class="tag"><</span> <span id="kidntak" class="tag-name">dynamic</span> <span>聽(tīng)</span> <span id="sfiojxd" class="attribute">prepend</span> <span>=</span> <span id="ivbazcf" class="attribute-value">""</span> <span id="veoytlk" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </span> </li> <li id="dmhnqeo" class=""> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span> <span id="mrblgux" class="tag"><</span> <span id="lnttftz" class="tag-name">isNotEmpty</span> <span>聽(tīng)</span> <span id="rpgblkn" class="attribute">prepend</span> <span>=</span> <span id="ktduphg" class="attribute-value">""</span> <span>聽(tīng)</span> <span id="mvfpknf" class="attribute">property</span> <span>=</span> <span id="xzflgfi" class="attribute-value">"creceiveUserid"</span> <span id="ztsniwo" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </li> <li id="jlvqlzy" class="alt"> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng),csendUserId聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </li> <li id="xojpoyb" class=""> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng),U.VTRUENAME聽(tīng)as聽(tīng)sendUserName聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </li> <li id="btzuesv" class="alt"> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)</span> <span id="ermwgnj" class="tag"> <span id="lnikuml" class="tag-name">isNotEmpty</span> <span id="jwcidye" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </span> </li> <li id="otkupor" class=""> <span> </span> <span id="mrxdnfa" class="tag"> <span id="qsxscqp" class="tag-name">dynamic</span> <span id="oagxkjt" class="tag">></span> <span>聽(tīng)聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)</span> </span> </li> <li id="udjedrf" class="alt"> <span>聽(tīng)聽(tīng)</span> </li> </ol> </div> <p>聽(tīng)</p> <p>闇瑕佹敞鎰忕殑鏄紝媯(gè)绱㈢殑鏃跺欙紝濡傛灉鍔ㄦ佹绱㈡潯浠剁殑璇濓紝闇瑕佸鍔?font face="Arial">remapResults="true"</font></p> <img src ="http://m.tkk7.com/wuxufeng8080/aggbug/88175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/wuxufeng8080/" target="_blank">椋庝漢鍥?/a> 2006-12-16 15:06 <a href="http://m.tkk7.com/wuxufeng8080/articles/88175.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>iBATIS濡備綍澶嶇敤SQL鐗囨(zt)http://m.tkk7.com/wuxufeng8080/articles/88167.html椋庝漢鍥?/dc:creator>椋庝漢鍥?/author>Sat, 16 Dec 2006 06:38:00 GMThttp://m.tkk7.com/wuxufeng8080/articles/88167.html 鍘熸枃閾炬帴

http://opensource.atlassian.com/confluence/oss/display/IBATIS/How+do+I+reuse+SQL-fragments


When writing SqlMaps, you often encounter duplicate fragments of SQL, for example a FROM-clause or constraint-statement; iBATIS offers a simple yet powerful tag to reuse them. For the sake of simplicity, let's assume we want to get some items and we want to do a count on them.

Normally, you would write something like this:

褰撴垜浠啓SqlMaps鐨勬椂鍊欙紝緇忓父浼?xì)纰板埌閲嶅鐨凷QL鐗囨錛屼緥濡侳rom璇彞鎴栬呯害鏉熸潯浠訛紱iBATIS鎻愪緵浜?jiǎn)涓涓己澶х殑鏍囩鏉ュ鐢ㄨ繖浜涢噸澶嶇墖孌碉紝綆鍗曚婦渚嬶紝鎴戜滑鎯蟲(chóng)绱竴浜涘瓧孌碉紝騫朵笖鎯崇粺璁″畠浠?/p>

閫氬父鎯呭喌涓嬶紝浣犱細(xì)榪欐牱鍐欙細(xì)

xml 浠g爜
  1. < select 聽(tīng) id = "selectItemCount" 聽(tīng) resultClass = "int" > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  2. 聽(tīng)聽(tīng)SELECT聽(tīng)COUNT(*)聽(tīng)AS聽(tīng)total聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  3. 聽(tīng)聽(tīng)FROM聽(tīng)items聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  4. 聽(tīng)聽(tīng)WHERE聽(tīng) parentid 聽(tīng)=聽(tīng) 6 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  5. </select > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  6. < select 聽(tīng) id = "selectItems" 聽(tīng) resultClass = "Item" > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  7. 聽(tīng)聽(tīng)SELECT聽(tīng)id,聽(tīng)name聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  8. 聽(tīng)聽(tīng)FROM聽(tīng)items聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  9. 聽(tīng)聽(tīng)WHERE聽(tīng) parentid 聽(tīng)=聽(tīng) 6 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  10. </select > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  11. 聽(tīng)聽(tīng)

聽(tīng)To eliminate this duplication, we use the tags 銆恠ql銆?and 銆恑nclude銆? The 銆恠ql銆?tag contains the fragment to reuse, the 銆恑nclude銆?tag to include such a fragment:

涓轟簡(jiǎn)娑堥櫎閲嶅鐗囨錛屾垜浠嬌鐢ㄣ恠ql銆戝拰銆恑nclude銆戞爣絳俱傘恠ql銆戞爣絳劇敤鏉ュ寘鍚噸澶嶇墖孌碉紝銆恑nclude銆戞爣絳劇敤鏉ュ紩鍏ョ墖孌碉細(xì)

聽(tīng)xml 浠g爜

  1. < sql 聽(tīng) id = "selectItem_fragment" > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  2. 聽(tīng)聽(tīng)FROM聽(tīng)items聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  3. 聽(tīng)聽(tīng)WHERE聽(tīng) parentid 聽(tīng)=聽(tīng) 6 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  4. </sql > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  5. < select 聽(tīng) id = "selectItemCount" 聽(tīng) resultClass = "int" > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  6. 聽(tīng)聽(tīng)SELECT聽(tīng)COUNT(*)聽(tīng)AS聽(tīng)total聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  7. 聽(tīng)聽(tīng) < include 聽(tīng) refid = "selectItem_fragment" /> 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  8. </select > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  9. < select 聽(tīng) id = "selectItems" 聽(tīng) resultClass = "Item" > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  10. 聽(tīng)聽(tīng)SELECT聽(tīng)id,聽(tīng)name聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  11. 聽(tīng)聽(tīng) < include 聽(tīng) refid = "selectItem_fragment" /> 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  12. </select > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  13. 聽(tīng)聽(tīng)

聽(tīng)The 銆恑nclude銆?tag is namespace-aware so you can refer to fragments even when they are located in another map (however, due to the way iBATIS loads the SqlMaps, the included fragment should be loaded before the including statement).聽(tīng)

銆恑nclued銆戞爣絳炬槸涓涓懡鍚嶇┖闂村彲鐭ョ殑錛屾墍浠ヤ綘鍙互寮曞叆鍏朵粬map鐨勭墖孌?(浣嗘槸錛屽洜涓篿BATIS寮曞叆SqlMap鐨勯『搴忥紝琚紩鍏ョ殑鐗囨錛岃浼樺厛浜庢寮曞叆鐨剆ql閮ㄥ垎琚鍏ワ級(jí)

The fragments are included and processed on query-execution so parameters can be used too:

閲嶅鐗囨鍦ㄦ煡璇㈡墽琛屾椂琚紩鍏ュ拰鎵ц錛屾墍浠ュ弬鏁頒緷鐒跺彲浠ヤ嬌鐢細(xì)

聽(tīng)xml 浠g爜

  1. < sql 聽(tīng) id = "selectItem_fragment" > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  2. 聽(tīng)聽(tīng)FROM聽(tīng)items聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  3. 聽(tīng)聽(tīng)WHERE聽(tīng) parentid 聽(tīng)=聽(tīng)#value#聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  4. </sql > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  5. < select 聽(tīng) id = "selectItemCount" 聽(tīng) parameterClass = "int" 聽(tīng) resultClass = "int" > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  6. 聽(tīng)聽(tīng)SELECT聽(tīng)COUNT(*)聽(tīng)AS聽(tīng)total聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  7. 聽(tīng)聽(tīng) < include 聽(tīng) refid = "selectItem_fragment" /> 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  8. </select > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  9. < select 聽(tīng) id = "selectItems" 聽(tīng) parameterClass = "int" 聽(tīng) resultClass = "Item" > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  10. 聽(tīng)聽(tīng)SELECT聽(tīng)id,聽(tīng)name聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  11. 聽(tīng)聽(tīng) < include 聽(tīng) refid = "selectItem_fragment" /> 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)
  12. </select > 聽(tīng)聽(tīng) 聽(tīng)聽(tīng)


]]>
主站蜘蛛池模板: 二区久久国产乱子伦免费精品| 久久精品国产亚洲AV麻豆不卡 | 亚洲资源最新版在线观看| 亚洲va中文字幕无码久久不卡 | 8x8×在线永久免费视频| 国产免费爽爽视频在线观看| 全黄大全大色全免费大片| 岛国精品一区免费视频在线观看| 一个人看的www视频免费在线观看 一个人看的免费观看日本视频www | 久久亚洲AV成人无码软件| 图图资源网亚洲综合网站| 亚洲AV美女一区二区三区| 久久国产精品亚洲综合| 亚洲黄网在线观看| 99999久久久久久亚洲| 亚洲日韩国产二区无码| 亚洲成在人线aⅴ免费毛片| 亚洲精品无码成人| 菠萝菠萝蜜在线免费视频| 新最免费影视大全在线播放| a级毛片免费网站| 国产一级片免费看| 2020因为爱你带字幕免费观看全集| 最近新韩国日本免费观看| 国产大片线上免费观看| 暖暖在线日本免费中文| 免费国产在线观看老王影院| 亚洲午夜AV无码专区在线播放| 亚洲精品成人片在线观看精品字幕| 亚洲AV成人一区二区三区AV| 亚洲校园春色小说| 亚洲变态另类一区二区三区| 免费无毒a网站在线观看| 日本高清不卡aⅴ免费网站| 特级无码毛片免费视频尤物| 999国内精品永久免费视频| 在线观看亚洲免费| 亚洲中文字幕在线第六区| 亚洲综合视频在线观看| 亚洲heyzo专区无码综合| 中文字幕成人免费高清在线|