锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一级毛片在线观,亚洲男人天堂2022,亚洲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 />

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

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

涓轟粈涔堜綘鐨勬暟鎹闂唬鐮侀渶瑕佷竴涓被鍨嬪畨鍏ㄧ殑鎺ュ彛錛熸垜璁や負(fù)瀹冨噺灝戜簡緙栫▼閿欒錛屾彁楂樹簡鐢熶駭鐜囷紝灝ゅ叾鏄湪浣跨敤鐜頒唬楂樼駭IDE鐨勬椂鍊欍傞鍏堬紝涓涓被鍨嬪畨鍏ㄧ殑鎺ュ彛娓呮櫚鐨勫埗瀹氫簡鍝簺棰嗗煙瀵硅薄鍏鋒湁鎸佷箙鍖栧姛鑳姐傚叾嬈★紝瀹冩秷闄や簡綾誨瀷杞崲甯︽潵鐨勬綔鍦ㄩ棶棰樸傛渶鍚庯紝瀹冨鉤琛′簡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鎿嶄綔銆備笅闈㈢殑鎺ュ彛瀹氫箟浜嗚寖鍨婦AO鐨勬柟娉曪細(xì)

						public
						interface GenericDao <T, PK extends Serializable> {/** Persist the newInstance object into database */
    PK create(T newInstance);
聽
    /** Retrieve an object that was previously persisted to the database using
     *   the indicated id as primary key
     */
    T read(PK id);
聽
    /** Save changes made to a persistent object.  */void update(T transientObject);
聽
    /** 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;
聽
    public GenericDaoHibernateImpl(Class<T> type){this.type = type;
    }public PK create(T o){return(PK) getSession().save(o);
    }public T read(PK id){return(T) getSession().get(type, id);
    }publicvoid update(T o){
        getSession().update(o);
    }publicvoid delete(T o){
        getSession().delete(o);
    }// Not showing implementations of getSession() and setSessionFactory()}

Spring 閰嶇疆

鏈鍚庯紝Spring閰嶇疆錛屾垜鍒涘緩浜嗕竴涓狦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

鎴戣繕娌℃湁鍏ㄩ儴瀹屾垚錛屼絾鎴戠幇鍦ㄥ凡緇忔湁浜嗕竴涓彲渚涗綔鐨勪唬鐮併備笅闈㈢殑浠g爜灞曠ず浜嗚寖鍨婦AO濡備綍浣跨敤錛?

						public
						void someMethodCreatingAPerson(){
    ...
    GenericDao dao = (GenericDao)
     beanFactory.getBean("personDao"); // This should normally be injected
聽
    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"/><beanid="abstractDaoTarget"class="genericdao.impl.GenericDaoHibernateImpl"abstract="true"><propertyname="sessionFactory"><refbean="sessionFactory"/></property></bean><beanid="abstractDao"class="org.springframework.aop.framework.ProxyFactoryBean"abstract="true"><propertyname="interceptorNames"><list><value>finderIntroductionAdvisor</value></list></property></bean>

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

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

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

鎵╁睍閫氱敤DAO

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

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

涓婇潰鐨勪唬鐮佹竻鏅扮殑灞曠ず浜嗛氳繃鐢ㄦ埛鍚嶆煡鎵綪erson瀵硅薄鍒楄〃銆傛墍闇鐨凧ava瀹炵幇綾諱笉闇瑕佸寘鍚換浣曠殑鏇存柊鎿嶄綔錛屽洜涓鴻繖浜涘凡緇忓寘鍚湪浜嗛氱敤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
聽
    Person p = new Person("Per", 90);
    dao.create(p);
聽
    List<Person> result = dao.findByName("Per"); // Runtime exception}

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

Hibernate鍛藉悕鏌ヨ

浣跨敤Hibernate錛屼綘鍙互瀹氫箟浠諱綍HQL鏌ヨ鍦ㄦ槧灝勬枃浠墮噷錛屽茍涓旂粰瀹冧竴涓悕瀛椼備綘鍙互鍦ㄤ箣鍚庣殑浠g爜閲岄潰鏂逛究鐨勯氳繃鍚嶅瓧寮曠敤榪欎釜鏌ヨ銆傝繖涔堝仛鐨勪竴涓紭鐐瑰氨鏄兘澶熷湪閮ㄧ講鐨勬椂鍊欒皟鑺傛煡璇㈣屼笉闇瑕佹敼鍙樹唬鐮併傛濡備綘涓浼?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>
						<queryname="Person.findByName"><![CDATA[select p from Person p where p.name = ? ]]></query></hibernate-mapping>

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

鎬昏

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

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

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

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

						public
						class FinderIntroductionAdvisor extends DefaultIntroductionAdvisor {public FinderIntroductionAdvisor(){super(new FinderIntroductionInterceptor());
    }}publicclass FinderIntroductionInterceptor implements IntroductionInterceptor {publicObject invoke(MethodInvocation methodInvocation)throwsThrowable{
聽
        FinderExecutor genericDao = (FinderExecutor) methodInvocation.getThis();
聽
        String methodName = methodInvocation.getMethod().getName();
        if(methodName.startsWith("find")){Object[] arguments = methodInvocation.getArguments();
            return genericDao.executeFinder(methodInvocation.getMethod(), arguments);
        }else{return methodInvocation.proceed();
        }}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();
}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鐨勯厤緗枃浠惰礬寰勫氨鍙互鑾峰緱涓婁笅鏂囦簡
榪欓噷闇瑕佹敞鎰忕殑鏄繖涓猻pring涓婁笅鏂囨槸ClassPathApplicationContext,鑰屾垜浠湪web鐜涓粡甯擱亣鍒扮殑鏄疻ebApplicationContext
/**
聽*聽$Id:$
聽*
聽*聽Copyright聽2005聽easou,聽Inc.聽All聽Rights聽Reserved.
*/

package聽test.spring.common;

import聽org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;

import聽test.PathConfig;

publicclass聽BaseSpringTestCase聽extends
聽聽聽聽聽聽聽聽AbstractTransactionalDataSourceSpringContextTests聽
{聽聽聽聽

聽聽聽聽@Override
聽聽聽聽
protected聽String[]聽getConfigLocations()聽{

聽聽聽聽聽聽聽聽String[]聽config聽
=聽PathConfig.springxml;

聽聽聽聽聽聽聽聽
return聽config;

聽聽聽聽}
聽聽聽聽聽聽聽聽
聽聽聽聽
publicvoid聽testConfig()聽{聽聽聽聽聽聽聽聽
聽聽聽聽聽聽聽聽assertNotNull(
"spring-mock聽context聽has聽bean聽init()",this.applicationContext);
聽聽聽聽}


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

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

聽聽聽聽聽聽聽聽
returnthis.executeHQL("聽from聽CsHomepageArea聽聽h聽where聽h.csChannel.id='"
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
+聽channelId聽+"'聽order聽by聽h.theOrder");
聽聽聽聽}


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

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

聽聽聽聽}

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

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

publicvoid聽saveComment(CsComment聽comment)聽{
聽聽聽聽聽聽聽聽getHibernateTemplate().saveOrUpdate(comment);聽聽聽聽聽聽聽聽
聽聽聽聽}

聽聽聽聽
publicvoid聽deleteComment(CsComment聽comment)聽{聽聽聽聽聽聽聽聽
聽聽聽聽聽聽聽聽getHibernateTemplate().delete(comment);聽聽聽聽聽聽聽聽
聽聽聽聽}

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

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

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

鍏跺疄榪欑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="6611161" class="code_title">xml 浠g爜</div> <div id="6166666" class="dp-highlighter"> <div id="1611666" class="bar"> </div> <ol class="dp-xml"> <li id="6166616" class="alt"> <span> <span id="1611611" class="tag"><</span> <span id="1116166" class="tag-name">dynamic</span> <span>聽</span> <span id="1166666" class="attribute">prepend</span> <span>=</span> <span id="1116166" class="attribute-value">"where"</span> <span id="6611666" class="tag">></span> <span>聽聽聽聽聽 聽聽</span> </span> </li> <li id="1616616" class=""> <span>聽聽聽聽聽聽</span> <span id="6166116" class="tag"><</span> <span id="6661666" class="tag-name">isNotEmpty</span> <span>聽</span> <span id="6611166" class="attribute">prepend</span> <span>=</span> <span id="6666116" class="attribute-value">"and"</span> <span>聽</span> <span id="6616666" class="attribute">property</span> <span>=</span> <span id="1111166" class="attribute-value">"csendUserId"</span> <span id="1611161" class="tag">></span> <span>聽聽聽聽聽 聽聽</span> </li> <li id="6616611" class="alt"> <span>聽聽聽聽聽聽聽聽聽聽</span> <span id="6116616" class="attribute">csendUserId</span> <span>聽=聽#csendUserId#聽聽聽聽聽聽 聽聽</span> </li> <li id="1166161" class=""> <span>聽聽聽聽聽聽</span> <span id="6616611" class="tag"> <span id="1666616" class="tag-name">isNotEmpty</span> <span id="1661111" class="tag">></span> <span>聽聽聽聽聽 聽聽</span> </span> </li> <li id="6111611" class="alt"> <span>聽聽</span> <span id="6611661" class="tag"> <span id="6666611" class="tag-name">dynamic</span> <span id="6166166" class="tag">></span> <span>聽聽聽</span> </span> </li> </ol> </div> <p>聽</p> <p> <font face="Arial">2錛氶氬父鐢ㄦ硶鐨勫皬灝忔墿鍏咃紝鍦ㄩ噷闈㈠鍔犱竴涓猘nd</font> </p> <div id="1111166" class="code_title">xml 浠g爜</div> <div id="1116611" class="dp-highlighter"> <div id="1166116" class="bar"> </div> <ol class="dp-xml"> <li id="1666661" class="alt"> <span> <span id="6666166" class="tag"><</span> <span id="6616666" class="tag-name">dynamic</span> <span>聽</span> <span id="1666611" class="attribute">prepend</span> <span>=</span> <span id="1161616" class="attribute-value">"where"</span> <span id="6611111" class="tag">></span> <span>聽聽聽聽聽 聽聽</span> </span> </li> <li id="1666616" class=""> <span>聽聽聽聽</span> <span id="1116661" class="tag"><</span> <span id="1661166" class="tag-name">isNotEmpty</span> <span>聽</span> <span id="1616666" class="attribute">prepend</span> <span>=</span> <span id="6661666" class="attribute-value">"and"</span> <span>聽</span> <span id="6666661" class="attribute">property</span> <span>=</span> <span id="1616166" class="attribute-value">"csendUserId"</span> <span id="6661116" class="tag">></span> <span>聽聽聽聽聽 聽聽</span> </li> <li id="1616616" class="alt"> <span>聽聽聽聽聽聽聽聽</span> <span id="6666666" class="attribute">csendUserId</span> <span>聽=聽#csendUserId#聽聽聽聽聽聽 聽聽</span> </li> <li id="1166616" class=""> <span>聽聽聽聽聽聽聽聽and聽聽聽聽聽聽 聽聽</span> </li> <li id="6161661" class="alt"> <span>聽聽聽聽聽聽聽聽</span> <span id="1161611" class="attribute">isenddr</span> <span>聽=聽</span> <span id="6161666" class="attribute-value">0</span> <span>聽聽聽聽聽 聽聽</span> </li> <li id="6661666" class=""> <span>聽聽聽聽</span> <span id="6161666" class="tag"> <span id="6166161" class="tag-name">isNotEmpty</span> <span id="6116611" class="tag">></span> <span>聽聽聽聽聽 聽聽</span> </span> </li> <li id="6616166" class="alt"> <span> </span> <span id="1666166" class="tag"> <span id="6611616" class="tag-name">dynamic</span> <span id="1616111" class="tag">></span> <span>聽聽聽聽 聽聽</span> </span> </li> </ol> </div> <p>聽</p> <p> <font face="Arial">3錛氬湪鏁版嵁搴撹〃榪炴帴澶勪嬌鐢紝鑷繁浠ュ墠浠庢潵娌℃湁榪囩殑鎯蟲硶錛氾級(jí)</font> </p> <div id="6661661" class="code_title">xml 浠g爜</div> <div id="1161166" class="dp-highlighter"> <div id="1616166" class="bar"> </div> <ol class="dp-xml"> <li id="1111161" class="alt"> <span> <span id="6116666" class="tag"><</span> <span id="6166666" class="tag-name">dynamic</span> <span>聽</span> <span id="6111661" class="attribute">prepend</span> <span>=</span> <span id="6666166" class="attribute-value">"left聽outer聽join聽cms_user聽U聽on聽"</span> <span id="6166661" class="tag">></span> <span>聽聽聽聽聽 聽聽</span> </span> </li> <li id="1611166" class=""> <span>聽聽聽聽</span> <span id="1616166" class="tag"><</span> <span id="1116661" class="tag-name">isNotEmpty</span> <span>聽</span> <span id="1666611" class="attribute">prepend</span> <span>=</span> <span id="6116611" class="attribute-value">""</span> <span>聽</span> <span id="6661666" class="attribute">property</span> <span>=</span> <span id="1666666" class="attribute-value">"creceiveUserid"</span> <span id="6116161" class="tag">></span> <span>聽聽聽聽聽 聽聽</span> </li> <li id="6166611" class="alt"> <span>聽聽聽聽聽聽聽聽</span> <span id="6166666" class="attribute">M.csendUserId</span> <span>聽=聽U.pk_user聽聽聽聽聽聽 聽聽</span> </li> <li id="1166611" class=""> <span>聽聽聽聽</span> <span id="6116661" class="tag"> <span id="1661661" class="tag-name">isNotEmpty</span> <span id="1616666" class="tag">></span> <span>聽聽聽聽聽 聽聽</span> </span> </li> <li id="1161611" class="alt"> <span> </span> <span id="6666166" class="tag"> <span id="1666161" class="tag-name">dynamic</span> <span id="1666616" class="tag">></span> <span>聽聽聽聽</span> </span> </li> </ol> </div> <p>聽</p> <p> <font face="Arial">4錛氭绱㈡潯浠跺浣跨敤錛屽姩鎬佸鍔犳绱㈡潯浠?/font> </p> <div id="6611166" class="code_title">xml 浠g爜</div> <div id="1616611" class="dp-highlighter"> <div id="6116666" class="bar"> </div> <ol class="dp-xml"> <li id="1161111" class="alt"> <span> <span id="6166616" class="tag"><</span> <span id="6661166" class="tag-name">dynamic</span> <span>聽</span> <span id="6611661" class="attribute">prepend</span> <span>=</span> <span id="6666166" class="attribute-value">""</span> <span id="6666161" class="tag">></span> <span>聽聽聽聽聽 聽聽</span> </span> </li> <li id="6611616" class=""> <span>聽聽聽聽</span> <span id="6116666" class="tag"><</span> <span id="1666611" class="tag-name">isNotEmpty</span> <span>聽</span> <span id="1166611" class="attribute">prepend</span> <span>=</span> <span id="6661616" class="attribute-value">""</span> <span>聽</span> <span id="1661616" class="attribute">property</span> <span>=</span> <span id="6666666" class="attribute-value">"creceiveUserid"</span> <span id="6666616" class="tag">></span> <span>聽聽聽聽聽 聽聽</span> </li> <li id="1661616" class="alt"> <span>聽聽聽聽聽聽聽聽,csendUserId聽聽聽聽聽聽 聽聽</span> </li> <li id="1166116" class=""> <span>聽聽聽聽聽聽聽聽,U.VTRUENAME聽as聽sendUserName聽聽聽聽聽聽 聽聽</span> </li> <li id="1611666" class="alt"> <span>聽聽聽聽</span> <span id="1611661" class="tag"> <span id="6661611" class="tag-name">isNotEmpty</span> <span id="6661611" class="tag">></span> <span>聽聽聽聽聽 聽聽</span> </span> </li> <li id="1111661" class=""> <span> </span> <span id="6166616" class="tag"> <span id="6611666" class="tag-name">dynamic</span> <span id="1161166" class="tag">></span> <span>聽聽聽聽 聽聽</span> </span> </li> <li id="1116166" class="alt"> <span>聽聽</span> </li> </ol> </div> <p>聽</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鎻愪緵浜嗕竴涓己澶х殑鏍囩鏉ュ鐢ㄨ繖浜涢噸澶嶇墖孌碉紝綆鍗曚婦渚嬶紝鎴戜滑鎯蟲绱竴浜涘瓧孌碉紝騫朵笖鎯崇粺璁″畠浠?/p>

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

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

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:

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

聽xml 浠g爜

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

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).

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

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

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

聽xml 浠g爜

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


]]>
主站蜘蛛池模板: 免费在线观看理论片| 成人A片产无码免费视频在线观看| 亚洲伦理中文字幕| 亚洲国产精品线在线观看| 亚洲日韩精品A∨片无码| 久久亚洲精品无码播放| 亚洲综合精品香蕉久久网| 国产亚洲av人片在线观看| 国产精品亚洲mnbav网站 | 亚洲AV成人无码天堂| 亚洲日韩乱码久久久久久| 亚洲综合无码一区二区三区| 4480yy私人影院亚洲| 亚洲欧洲另类春色校园小说| 亚洲六月丁香六月婷婷蜜芽 | 国产大片91精品免费看3| 国产免费变态视频网址网站| 免费在线观看的黄色网址| 亚洲男女内射在线播放| 亚洲色WWW成人永久网址| 亚洲av永久无码精品古装片 | 免费黄网在线观看| 国产18禁黄网站免费观看| 亚洲AV无码乱码精品国产| 久久精品国产亚洲7777| 亚洲成AV人片天堂网无码| 亚洲欧洲免费视频| 亚洲一区二区三区不卡在线播放| 亚洲男人天堂2022| 免费无码国产V片在线观看| 中国一级特黄的片子免费 | 久久久国产亚洲精品| 精品亚洲成A人在线观看青青| 免费VA在线观看无码| 97在线免费视频| 99视频精品全部免费观看| 台湾一级毛片永久免费| 日韩成全视频观看免费观看高清| 四虎亚洲国产成人久久精品| 亚洲综合AV在线在线播放| 久久久久亚洲AV无码观看|