锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲高清国产AV拍精品青青草原,亚洲爆乳大丰满无码专区,亚洲av无码一区二区三区乱子伦http://m.tkk7.com/cader/category/12840.html瑕佹兂璐熷鐢熷瀛愬皯縐嶆爲(wèi)zh-cnFri, 02 Mar 2007 02:42:41 GMTFri, 02 Mar 2007 02:42:41 GMT60CreateDAO_zhhttp://m.tkk7.com/cader/articles/57003.html璐熶漢鍗氬璐熶漢鍗氬Thu, 06 Jul 2006 09:53:00 GMThttp://m.tkk7.com/cader/articles/57003.htmlhttp://m.tkk7.com/cader/comments/57003.htmlhttp://m.tkk7.com/cader/articles/57003.html#Feedback0http://m.tkk7.com/cader/comments/commentRss/57003.htmlhttp://m.tkk7.com/cader/services/trackbacks/57003.html Part I: 在AppFuse建立DAO和对象 - 涓涓緩绔嬪璞?浠h〃鏁版嵁搴撶殑琛?鍜屾妸榪欎簺瀵硅薄瀛樺偍鍒版暟鎹簱鐨凧ava綾葷殑鏁欑▼銆?

鍏充簬鏈暀紼?/h3>鏈暀紼嬪皢鍚戜綘灞曠ず濡備綍鍦ㄤ竴涓暟鎹簱閲屽垱寤鴻〃錛屼互鍙?qiáng)濡備綍瀹屾垚璁块棶杩欎簺琛ㄧ殑Java浠g爜銆?

鎴戜滑灝嗗緩绔嬩竴涓璞′互鍙?qiáng)澶勭悊锛堜繚瀛?媯(gè)绱?鍒犻櫎錛夎繖浜涚被鍒版暟鎹簱鐨勪竴浜涗唬鐮併傜敤Java鏈錛屾垜浠彨瀹働lain Old Java Object(a.k.a. a POJO)銆傝繖涓璞¢氬父浠h〃浜?jiǎn)鏁版嵁搴撲腑鐨勪竴涓〃錛?i>鍏朵粬鐨勭被鍖呮嫭:

  • 涓涓暟鎹闂璞ata Access Object (a.k.a. a DAO), 涓涓?Interface鍜屼竴涓狧ibernate瀹炵幇
  • 涓涓?JUnit 綾繪潵嫻嬭瘯鎴戜滑鐨凞AO瀵硅薄
NOTE: 濡傛灉浣犱嬌鐢∕ySQL騫朵笖甯屾湜浣跨敤浜嬪姟 (寰堟湁鍙兘鏄繖涓儏鍐?,浣犻渶瑕佷嬌鐢↖nnoDB tables錛屼負(fù)浜?jiǎn)鍋氬埌杩欎竴鐐? 娣誨姞浠ヤ笅涓ゅ彞璇濆埌 (/etc/my.cnf 鎴栬?c:\Windows\my.ini)銆?鍏朵腑絎簩涓緗?(璁劇疆浣跨敤UTF-8瀛楃)鏄?.1.7+鎵蹇呴渶鐨勩?
[mysqld]
default-table-type=innodb
default-character-set=utf8
濡傛灉浣犱嬌鐢≒ostgreSQL騫朵笖鍦ㄦ垚鎵瑰鐞嗘椂寰楀埌璁稿榪鋒儜鐨勯敊璇紝璇曠潃鎶婂叧闂畠錛屾柟娉曟槸澧炲姞 <prop key="hibernate.jdbc.batch_size">0</prop> 鍒頒綘鐨?src/dao/**/hibernate/applicationContext-hibernate.xml鏂囦歡銆?

AppFuse浣跨敤Hibernate 浣滀負(fù)鎸佷箙鍖栧眰錛?Hibernate鏄竴濂楀璞?鍏崇郴Object/Relational (O/R)妗嗘灦錛屼粬鍏佽浣犳妸Java瀵硅薄鍜屾暟鎹簱涔嬮棿鑱旂郴璧鋒潵錛屽畠鍙互寰堟柟渚跨殑瀵逛綘鐨勫璞℃墽琛孋RUD (Create, Retrieve, Update, Delete)鎿嶄綔銆?

浣犱篃鍙互閫夋嫨浣跨敤iBATIS浣滀負(fù)鎸佷箙鍖栧眰錛屽鏋滆鍦ˋppFuse閲屽畨瑁卛BATIS錛?璇鋒煡鐪?tt>extras/ibatis涓殑README.txt銆傚鏋滀綘閫夋嫨iBATIS鑰屼笉鏄疕ibernate錛?甯屾湜浣犳湁鑷繁鐨勫師鍥犲茍涓旂啛鎮(zhèn)夎繖涓鏋訛紝鎴戜篃甯屾湜浣犺兘澶熼浼?xì)鍒板浣暈畣鏁櫧E嬪簲鐢ㄥ埌iBATIS ;-)

瀛椾綋鎯緥 (榪涜涓?

瑕佸湪鍛戒護(hù)琛屼笅鎵ц鐨勫懡浠ゆ槸榪欎釜鏍峰瓙: ant test-all.
瀵圭洰褰曟垨鑰呭寘涓殑鏂囦歡鐨勫紩鐢ㄦ槸榪欎釜鏍峰瓙: build.xml.
鎴戝湪聯(lián)鐪熷疄涓栫晫聰涓疄闄呮搷浣滅殑鏂瑰紡鐢ㄨ摑鑹叉枩浣撹〃紺恒?/i>

璁╂垜浠戶緇湪AppFuse欏圭洰鐨勭粨鏋勪笅鍒涘緩涓涓柊鐨勫璞°丏AO鍜屾祴璇曘?

鐩綍

  • [1] 寤虹珛涓涓璞★紝騫朵笖浣?a class="external" >XDoclet鏍囪
  • [2] 浣跨敤Ant鏍規(guī)嵁瀵硅薄寤虹珛鏁版嵁搴撲腑鐨勮〃
  • [3] 鍒涘緩涓涓狣aoTest鏉ヨ繍琛孌AO瀵硅薄鐨凧Unit嫻嬭瘯
  • [4] 鍒涘緩涓涓柊鐨凞AO鏉ユ墽琛屽叧浜庤繖涓璞$殑CRUD鎿嶄綔
  • [5] 鍦╯pring閲岄厤緗甈erson鍜孭ersonDao
  • [6] 榪愯DaoTest

寤虹珛涓涓璞★紝騫朵笖浣淴Doclet鏍囪 [#1]

鎴戜滑瑕佸仛鐨勭涓浠朵簨鎯呭氨鏄緩绔嬩竴涓渶瑕佹寔涔呭寲鐨勫璞★紝鎴戜滑瑕佸湪src/dao/**/model鐩綍涓嬪緩绔嬩竴涓畝鍗曠殑Person瀵硅薄錛岃繖涓璞″寘鎷琲d銆乫irstName鍜宭astName灞炴с?

娉ㄦ剰錛?/b> 鐩存帴鎷瘋礉鏈暀紼嬬殑浠g爜 &#22312;FireFox&#19979;&#26080;&#25928;錛屼絾鎴戜滑鍙互閫氳繃CTRL+Click閫夊畾涓涓唬鐮佹墍鍦ㄧ殑宸ヤ綔鍖?OS X涓嬫槸Command+Click)錛岀劧鍚庡啀鎷瘋礉銆?/span>


package聽(tīng)org.appfuse.model;

public聽(tīng)class聽(tīng)Person聽(tīng)extends聽(tīng)BaseObject聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)private聽(tīng)Long聽(tīng)id;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)private聽(tīng)String聽(tīng)firstName;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)private聽(tīng)String聽(tīng)lastName;

聽(tīng)聽(tīng)聽(tīng)聽(tīng)/*
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Generate聽(tīng)your聽(tīng)getters聽(tīng)and聽(tīng)setters聽(tīng)using聽(tīng)your聽(tīng)favorite聽(tīng)I(yíng)DE:聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)In聽(tīng)Eclipse:
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Right-click聽(tīng)->聽(tīng)Source聽(tīng)->聽(tīng)Generate聽(tīng)Getters聽(tīng)and聽(tīng)Setters
聽(tīng)聽(tīng)聽(tīng)聽(tīng)*/
}

榪欎釜綾誨繀欏繪墿灞?a class="external" >BaseObject錛岃岃繖涓狟aseObject鏈変笁涓娊璞℃柟娉?equals(), hashCode()鍜宼oString())闇瑕佷綘鍦≒erson綾婚噷瀹炵幇錛屽墠涓や釜鏄疕ibernate鐨勯渶瑕併備負(fù)浜?jiǎn)瀹屾垚杩欓儴鍒嗗伐浣滄渶綆鍗曠殑鏂瑰紡鏄嬌鐢?a class="external" >Commonclipse錛屽叧浜庤繖涓伐鍏鋒洿澶氱殑淇℃伅鍙互鍦?a class="external" >Lee Grey&#30340;&#32593;&#31449;閲岀湅鍒幫紝鍙﹀涓涓綘鍙互浣跨敤鐨凟clipse鐨勬彃浠舵槸Commons4E錛屾垜榪樻病鏈変嬌鐢ㄨ繃錛岃繖閲屼笉渚垮鍏跺姛鑳戒綔鍑?guó)櫙勮銆?

濡傛灉浣犱嬌鐢?a class="external" >IntelliJ IDEA錛屼綘鍙互鑷姩浜х敓equals()鍜宧ashCode()錛屼絾娌℃湁toString()錛屾湁涓涓?ToStringPlugin鎻掍歡鍋氬緱闈炲父涓嶉敊

鐜板湪鎴戜滑宸茬粡鍒涘緩浜?jiǎn)杩欎釜POJO瀵硅薄錛屾垜浠渶瑕佸鍔燲Doclet鏍囪鏉ヤ駭鐢烪ibernate鐨勬槧灝勬枃浠訛紝榪欎簺鏂囦歡鐢ㄦ潵鏄犲皠瀵硅薄鈫?琛ㄥ拰灞炴?鍙橀噺) 鈫?瀛楁銆?

棣栧厛錛屾垜浠鍔?a class="external" >@hibernate.class 鏉ュ憡璇塇ibernate鎴戜滑灝嗚鍜岄偅涓〃浣滃叧鑱旓細(xì)


/**
聽(tīng)*聽(tīng)@hibernate.class聽(tīng)table="person"
聽(tīng)*/
public聽(tīng)class聽(tīng)Person聽(tīng)extends聽(tīng)BaseObject聽(tīng){

鎴戜滑涔熻澧炲姞涓婚敭鐨勬槧灝?鍚﹀垯XDoclet浼?xì)鍦ㄤ骇鐢熸槧灏勬枃錃g鏃跺嚭閿?娉ㄦ剰鎵鏈夌殑@hibernate.*鏍囩蹇呴』鍦?b>getters'鐨凧avadocs閲岄潰銆?


聽(tīng)聽(tīng)聽(tīng)聽(tīng)/**
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)*聽(tīng)@return聽(tīng)Returns聽(tīng)the聽(tīng)id.
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)*聽(tīng)@hibernate.id聽(tīng)column="id"
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)*聽(tīng)聽(tīng)generator-class="increment"聽(tīng)unsaved-value="null"
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)*/

聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)Long聽(tīng)getId()聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)this.id;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}

鎴戜嬌鐢?tt>generator-class="increment"鑰屼笉浣跨敤generate-class="native" 鏄洜涓烘垜瀵規(guī)暟鎹簱浣跨敤"native"鏃?a class="wikipage" 鍊?/b>錛屾湰鏁欑▼浣跨敤increment銆?/i>

浣跨敤Ant鏍規(guī)嵁瀵硅薄浜х敓鏁版嵁搴撹〃[#2]

鍦ㄨ繖縐嶆儏鍐典笅,浣犲彲浠ラ氳繃榪愯ant setup-db鏉ュ緩绔媝erson琛紝榪欎釜浠誨姟浼?xì)漶旂敓鏂囦?tt>Person.hbm.xml騫朵笖浼?xì)寰忕珛鍙?person"鐨勮〃錛屼粠Ant鐨勬帶鍒跺彴紿楀彛錛屼綘鍙互鐪嬪埌Hibernate涓轟綘寤虹珛鐨勮〃緇撴瀯鐨勫唴瀹廣?
[schemaexport] create table person (
[schemaexport]    id bigint not null,
[schemaexport]    primary key (id)
[schemaexport] );

濡傛灉浣犳煡鐪婬ibernate鐢熸垚鐨勬枃浠?tt>Person.hbm.xml錛屽彲浠ュ埌build/dao/gen/**/model鐩綍錛岃繖閲屾槸Person.hbm.xml鐨勫唴瀹?鐩墠鐨勫唴瀹?:


<?xml聽(tīng)version="1.0"?>

<!DOCTYPE聽(tīng)hibernate-mapping聽(tīng)PUBLIC
聽(tīng)聽(tīng)聽(tīng)聽(tīng)"-//Hibernate/Hibernate聽(tīng)Mapping聽(tīng)DTD聽(tīng)2.0//EN"聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
聽(tīng)聽(tīng)聽(tīng)聽(tīng)<class
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)name="org.appfuse.model.Person"
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)table="person"
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)dynamic-update="false"
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)dynamic-insert="false"
聽(tīng)聽(tīng)聽(tīng)聽(tīng)>

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)<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)name="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)column="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)type="java.lang.Long"
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)unsaved-value="null"
聽(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)聽(tīng)聽(tīng)聽(tīng)<generator聽(tīng)class="increment">
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</generator>
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)</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)聽(tīng)聽(tīng)聽(tīng)To聽(tīng)add聽(tīng)non聽(tīng)XDoclet聽(tīng)property聽(tīng)mappings,聽(tīng)create聽(tīng)a聽(tīng)file聽(tīng)named
聽(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)hibernate-properties-Person.xml
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)containing聽(tīng)the聽(tīng)additional聽(tīng)properties聽(tīng)and聽(tīng)place聽(tīng)it聽(tīng)in聽(tīng)your聽(tīng)merge聽(tīng)dir.
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)-->

聽(tīng)聽(tīng)聽(tīng)聽(tīng)</class>

</hibernate-mapping>

鐜板湪鎴戜滑瑕佷負(fù)鍏跺畠鐨勫瓧孌?first_name, last_name)娣誨姞棰濆鐨?a class="external" >@hibernate.property鏍囩錛?


聽(tīng)聽(tīng)聽(tīng)聽(tīng)/**
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)*聽(tīng)@hibernate.property聽(tīng)column="first_name"聽(tīng)length="50"
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)*/
聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)String聽(tīng)getFirstName()聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)this.firstName;
聽(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)@hibernate.property聽(tīng)column="last_name"聽(tīng)length="50"
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)*/
聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)String聽(tīng)getLastName()聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)this.lastName;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}

鍦ㄨ繖涓緥瀛愰噷錛屾坊鍔?i>column灞炴х殑鍞竴鍘熷洜鏄洜涓鴻繖涓瓧孌靛悕涓庡畠鐨勫睘鎬у悕涓嶇浉鍚岋紝濡傛灉浠栦滑鐩稿悓錛屼綘娌℃湁蹇呰鏉ユ寚瀹?i>column灞炴э紝鍏充簬鍏跺畠鍙互浣跨敤鐨勬爣絳捐鐪?a class="external" >@hibernate.property銆?

鍐嶆榪愯ant setup-db鎶婃柊鍔犵殑灞炴у姞鍒版暟鎹簱琛ㄩ噷銆?

[schemaexport] create table person (
[schemaexport]    id bigint not null,
[schemaexport]    first_name varchar(50),
[schemaexport]    last_name varchar(50),
[schemaexport]    primary key (id)
[schemaexport] );

濡傛灉鏈熸湜淇敼瀛楁鐨勯暱搴︼紝淇敼@hibernate.property鏍囩鐨?i>length灞炴э紝濡傛灉甯屾湜鎶婂瓧孌墊敼涓哄繀娣誨瓧孌?NOT NULL)錛屽彲浠ュ鍔犲睘鎬ot-null="true"銆?

寤虹珛鏂扮殑DaoTest鏉ュ浣犵殑DAO榪愯JUnit嫻嬭瘯[#3]

娉ㄦ剰:浠嶢ppfuse鐗堟湰1.6.1+寮濮嬪寘鎷簡(jiǎn)涓涓?a class="wikipage" >AppGen宸ュ叿錛屽彲浠ョ敤鏉ョ敓鎴愭湰鏁欑▼浣欎笅鐨勬墍鏈夌殑綾葷殑浠g爜錛屼笉榪囷紝鎴戜滑鏈濂借繕鏄厛榪囦竴閬嶆暀紼嬪啀浣跨敤榪欎釜宸ュ叿浜х敓浠g爜銆?/span>

鐜板湪錛屾垜浠鍒涘緩涓涓狣aoTest鏉ユ祴璇曟垜浠殑DAO鐨勫伐浣滐紝聯(lián)絳変細(xì)鍎柯旓紝浣犺錛屄?lián)鎴戜滑杩樹(shù)笉鏇惧垱寰廌AO鍛紒聰錛屼綘璇村緱瀵廣傛棤璁哄浣曪紝鎴戝彂鐜?a class="external" >&#27979;&#35797;&#39537;&#21160;&#24320;&#21457;澶уぇ鐨勪績(jī)榪涗簡(jiǎn)杞歡璐ㄩ噺錛屽湪璁稿騫撮噷鎴戜竴鐩磋涓?b>鍦ㄥ啓浠g爜涔嬪墠鍐欐祴璇?/b>鏄儭璇村叓閬擄紝榪欑湅璧鋒潵寰堟剼锠紝浣嗗綋鎴戝皾璇曚箣鍚庢垜璁や負(fù)榪欐牱闈炲父濂斤紝鐜板湪鎴戞寜鐓ф祴璇曢┍鍔ㄧ殑鏂瑰紡宸ヤ綔瀹屽叏鍥犱負(fù)鎴戝彂鐜拌繖鏍峰彲浠ュぇ澶ф彁楂樻垜杞歡寮鍙戠殑鏁堢巼銆?

寮濮嬶紝鎴戜滑鍦?tt>test/dao/**/dao鐩綍涓嬪緩绔嬬被PersonDaoTest.java錛岃繖涓被蹇呴』鎵╁睍BaseDaoTestCase錛岃孊aseDAOTestCase榪欎釜綾繪槸JUnit綾?a class="external" >TestCase鐨勫瓙綾伙紝榪欎釜綾葷敤鏉ュ姞杞?a class="external" >Spring鐨凙pplicationContext錛堝洜涓篠pring鎶婂悇涓眰緇戝畾錛夊拰鍗曞厓嫻嬭瘯綾誨悓涓鐩綍涓嬪悓浣犵殑嫻嬭瘯綾繪枃浠跺悓鍚嶇殑.properties鏂囦歡錛圧esourceBundle錛夛紝榪欎釜灞炴ф枃浠剁殑灞炴у彲浠ラ氳繃聯(lián)rb聰灞炴ф潵璁塊棶銆?

鎴戠粡甯告嫹璐?鎵撳紑鈫掑彟瀛樹(shù)負(fù))涓涓凡瀛樺湪鐨勬祴璇?濡俇serDaoTest.java)錛岀劧鍚庢煡鎵?鏇挎崲 [Uu]ser涓篬Pp]erson錛屾垨鑰呬換浣曞叾瀹冮渶瑕佹浛鎹㈢殑鍐呭銆?/i>


package聽(tīng)org.appfuse.dao;

import聽(tīng)org.appfuse.model.Person;
import聽(tīng)org.springframework.dao.DataAccessException;

public聽(tīng)class聽(tīng)PersonDaoTest聽(tīng)extends聽(tīng)BaseDaoTestCase聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)private聽(tīng)Person聽(tīng)person聽(tīng)=聽(tīng)null;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)private聽(tīng)PersonDao聽(tīng)dao聽(tīng)=聽(tīng)null;

聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)void聽(tīng)setPersonDao(PersonDao聽(tīng)dao)聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)this.dao聽(tīng)=聽(tīng)dao;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
}

浠ヤ笂鏄垜浠嬌鐢↗Unit嫻嬭瘯鑰屽垵濮嬪寲鍜岄攢姣丳ersonDao鐨勫熀鏈唬鐮侊紝瀵硅薄聯(lián)ctx聰寮曠敤浜?jiǎn)Spring鐨凙pplicationContext錛屽畠鍦?a class="external" >BaseDaoTestCase綾葷殑闈?rùn)鎬佷唬鐮佸尯閲岃鍒濆鍖栥?

鐜板湪鎴戜滑闇瑕佸疄闄呮祴璇旸AO涓殑CRUD(create, retrieve, update, delete)鏂規(guī)硶錛屼負(fù)姝ゆ垜浠渶瑕佷負(fù)姣忎釜鏂規(guī)硶寤虹珛浠est錛堝叏閮ㄥ皬鍐欙級(jí)寮澶寸殑嫻嬭瘯鏂規(guī)硶錛屽彧瑕佽繖涓柟娉曟槸鍏叡鐨勶紝榪斿洖綾誨瀷鏄痸oid,瀹冧滑灝變細(xì)琚垜浠琤uild.xml涓殑Ant鐨?lt;junit>浠誨姟璋冪敤錛屽涓嬫槸涓浜涚畝鍗曠殑CRUD嫻嬭瘯錛岄渶瑕佹敞鎰忕殑涓鐐規(guī)槸鎵鏈夌殑鏂規(guī)硶錛堟垨鑰呭彨鍋氭祴璇曪級(jí)蹇呴』鏄嚜娌葷殑錛屾坊鍔犲涓嬩唬鐮佸埌鏂囦歡PersonDaoTest.java錛?


聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)void聽(tīng)testGetPerson()聽(tīng)throws聽(tīng)Exception聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)person聽(tīng)=聽(tīng)new聽(tīng)Person();
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)person.setFirstName("Matt");
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)person.setLastName("Raible");

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)dao.savePerson(person);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertNotNull(person.getId());

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)person聽(tīng)=聽(tīng)dao.getPerson(person.getId());
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertEquals(person.getFirstName(),聽(tīng)"Matt");
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}

聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)void聽(tīng)testSavePerson()聽(tīng)throws聽(tīng)Exception聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)person聽(tīng)=聽(tīng)dao.getPerson(new聽(tīng)Long(1));
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)person.setFirstName("Matt");

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)person.setLastName("Last聽(tīng)Name聽(tīng)Updated");

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)dao.savePerson(person);

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(log.isDebugEnabled())聽(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)log.debug("updated聽(tīng)Person:聽(tīng)"聽(tīng)+聽(tīng)person);
聽(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)assertEquals(person.getLastName(),聽(tīng)"Last聽(tīng)Name聽(tīng)Updated");
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}

聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)void聽(tīng)testAddAndRemovePerson()聽(tīng)throws聽(tīng)Exception聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)person聽(tīng)=聽(tīng)new聽(tīng)Person();
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)person.setFirstName("Bill");
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)person.setLastName("Joy");

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)dao.savePerson(person);

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertEquals(person.getFirstName(),聽(tīng)"Bill");
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertNotNull(person.getId());

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(log.isDebugEnabled())聽(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)log.debug("removing聽(tīng)person...");
聽(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)dao.removePerson(person.getId());

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)try聽(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)person聽(tīng)=聽(tīng)dao.getPerson(person.getId());
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)fail("Person聽(tīng)found聽(tīng)in聽(tīng)database");
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}聽(tīng)catch聽(tīng)(DataAccessException聽(tīng)dae)聽(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)log.debug("Expected聽(tīng)exception:聽(tīng)"聽(tīng)+聽(tīng)dae.getMessage());
聽(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(dae);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}

鍦╰estGetPerson鏂規(guī)硶錛屾垜浠垱寤轟簡(jiǎn)涓涓猵erson騫朵笖璋冪敤get鏂規(guī)硶錛屾垜閫氬父浼?xì)澧炲姞涓鏉℃垜鎵闇瑕佺殑璁板綍鍒版暟鎹簱錛屽洜涓哄湪嫻嬭瘯榪愯涔嬪墠DBUnit浼?xì)湄?fù)鏁版嵁搴撳噯澶囨祴璇曟暟鎹紝鎴戜滑鍙互綆鍗曠殑鍦╩etadata/sql/sample-data.xml閲屾坊鍔犳祴璇曟墍蹇呴』鐨勮褰?/i>

<table name='person'>
    <column>id</column>
    <column>first_name</column>
    <column>last_name</column>
    <row>
      <value>1</value>
      <value>Matt</value>
      <value>Raible</value>
    </row>
</table>
閫氳繃榪欑鏂瑰紡浣犲彲浠ュ湪testGetPerson鏂規(guī)硶閲屾秷闄ゅ垱寤烘柊綰綍鐨勫姩浣滐紝濡傛灉浣犳効鎰忕洿鎺ユ彃鍏ヨ褰曞埌鏁版嵁搴擄紙浣跨敤SQL鎴栬匞UI錛夛紝浣犲彲浠ョ敤ant db-export鍜?b>cp db-export.xml metadata/sql/sample-data.xml閲嶆柊鏋勫緩浣犵殑sample-data.xml鏂囦歡銆?/i>

鍦ㄤ笂闈㈢殑渚嬪瓙閲岋紝浣犲彲浠ョ湅鍒版垜浠皟鐢╬erson.set*(value)鏉ュ噯澶囨垜浠渶瑕佷繚瀛樼殑瀵硅薄錛屽湪榪欎釜渚嬪瓙閲屽緢綆鍗曪紝浣嗘槸褰撲綘瑕佹彃鍏?0鏉″繀娣誨瓧孌?not-null="true")鏃跺氨姣旇緝楹葷儲(chǔ)浜?jiǎn)锛寴q欏氨鏄垜涓轟粈涔堣鍦˙aseDaoTestCase浣跨敤ResourceBundle鏂囦歡錛屽彧瑕佸湪PersonDaoTest.java鍚屼竴涓洰褰曞垱寤轟竴涓?tt>PersonDaoTest.properties騫朵笖鍦ㄩ噷闈㈠畾涔変綘鐨勫睘鎬у鹼細(xì)

鎴戦氬父鍙槸鍦↗ava閲岀‖緙栫爜錛屼絾鏄繖涓?properties瀵逛簬澶у璞″緢鏈夌敤銆?/i>
firstName=Matt
lastName=Raible
姝ゆ椂錛屼綘瑕侀氳繃璋冪敤BaseDaoTestCase.populate(java.lang.Object)鏂規(guī)硶鏉ュ噯澶囧璞★紝鑰屼笉鏄嬌鐢╬erson.set*銆?


person聽(tīng)=聽(tīng)new聽(tīng)Person();
person聽(tīng)=聽(tīng)(Person)聽(tīng)populate(person);

鍦ㄧ洰鍓嶆儏鍐典笅錛岃繕?shù)笉鍙互缂栬瘧PersonDaoTest錛屽洜涓哄湪綾昏礬寰勯噷榪樻病鏈塒ersonDao.class錛屾垜浠渶瑕佸垱寤哄畠銆侾ersonDao.java鏄竴涓帴鍙o紝PersonDaoHibernate.java鏄畠鐨凥ibernate瀹炵幇錛岃鎴戜滑緇х畫(huà)錛屽紑濮嬪垱寤恒?

鍒涘緩涓涓瀵硅薄鎵цCRUD鎿嶄綔鐨勬柊DAO[#4]

椹笂錛屽湪src/dao/**/dao鐩綍閲屽緩绔婸ersonDao.java鎺ュ彛錛屽茍涓旀寚瀹氭墍鏈夊疄鐜扮被瑕佸疄鐜扮殑鍩烘湰CRUD鎿嶄綔錛屼負(fù)浜?jiǎn)鏄窘C烘柟渚匡紝鎴戝凡緇忓幓鎺変簡(jiǎn)鎵鏈塉avaDocs銆?


package聽(tīng)org.appfuse.dao;

import聽(tīng)org.appfuse.model.Person;

public聽(tīng)interface聽(tīng)PersonDao聽(tīng)extends聽(tīng)Dao聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)Person聽(tīng)getPerson(Long聽(tīng)personId);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)void聽(tīng)savePerson(Person聽(tīng)person);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)void聽(tīng)removePerson(Long聽(tīng)personId);
}

娉ㄦ剰錛屽湪浠ヤ笂鐨勬柟娉曞0鏄庝笂騫舵病鏈塭xceptions璇存槑錛岃繖鏄洜涓?a class="external" >Spring浣跨敤RuntimeExceptions鏉ュ寘瑁笶xceptions鐨勬柟寮忥紝姝ゆ椂錛屼綘宸茬粡鍙互浣跨敤ant compile-dao鏉ョ紪璇?tt>src/dao鍜?tt>test/dao涓嬬殑鎵鏈夋簮鏂囦歡錛岀劧鑰屽綋浣犺繍琛?b>ant test-dao -Dtestcase=PersonDao榪涜嫻嬭瘯鏃訛紝浣犱細(xì)寰楀埌涓涓敊璇細(xì)No bean named 'personDao' is defined錛岃繖鏄竴涓猄pring鐨勯敊璇紝璇存槑浣犲繀欏誨湪applicationContext-hibernate.xml鎸囧畾涓涓悕瀛椾負(fù)personDAO鐨刡ean錛屽湪姝や箣鍓嶆垜浠渶瑕佸垱寤篜ersonDao鐨勫疄鐜扮被銆?

榪愯dao嫻嬭瘯鐨刟nt浠誨姟鍙仛test-dao錛屽鏋滀綘浼犻抰estcase鍙傛暟(鐢?b>-Dtestcase=name)錛屽畠浼?xì)鏌ョ?tt>**/*${testcase}*鍏佽鎴戜滑浼犻扨erson銆丳ersonDao銆佹垨鑰匬ersonDaoTest浠ュ強(qiáng)鎵鏈変細(xì)鎵цPersonDaoTest鐨勭被銆?/i>

璁╂垜浠垱寤轟竴涓疄鐜癙ersonDao鐨勭被PersonDaoHibernate騫朵嬌鐢℉ibernate鏉et/save/delete榪欎釜Person瀵硅薄錛屼負(fù)姝わ紝鎴戜滑鍦?tt>src/dao/**/dao/hibernate鍒涘緩涓涓柊綾?tt>PersonDaoHibernate.java錛屽畠搴旇鎵╁睍BaseDaoHibernate錛屽茍涓斿疄鐜癙ersonDao銆?i>涓轟簡(jiǎn)綆媧侊紝鐪佺暐Javadocs銆?/i>


package聽(tīng)org.appfuse.dao.hibernate;

import聽(tīng)org.appfuse.model.Person;
import聽(tīng)org.appfuse.dao.PersonDao;
import聽(tīng)org.springframework.orm.ObjectRetrievalFailureException;

public聽(tīng)class聽(tīng)PersonDaoHibernate聽(tīng)extends聽(tīng)BaseDaoHibernate聽(tīng)implements聽(tīng)PersonDao聽(tīng){

聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)Person聽(tīng)getPerson(Long聽(tīng)id)聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Person聽(tīng)person聽(tīng)=聽(tīng)(Person)聽(tīng)getHibernateTemplate().get(Person.class,聽(tīng)id);

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(person聽(tīng)==聽(tīng)null)聽(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)throw聽(tīng)new聽(tīng)ObjectRetrievalFailureException(Person.class,聽(tīng)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)聽(tīng)聽(tīng)return聽(tīng)person;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}

聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)void聽(tīng)savePerson(Person聽(tīng)person)聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)getHibernateTemplate().saveOrUpdate(person);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}

聽(tīng)聽(tīng)聽(tīng)聽(tīng)public聽(tīng)void聽(tīng)removePerson(Long聽(tīng)id)聽(tīng){
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//聽(tīng)object聽(tīng)must聽(tīng)be聽(tīng)loaded聽(tīng)before聽(tīng)it聽(tīng)can聽(tīng)be聽(tīng)deleted
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)getHibernateTemplate().delete(getPerson(id));
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
}

鐜板湪錛屽鏋滀綘榪愯ant test-dao -Dtestcase=PersonDao錛屼綘浼?xì)寰楀埌鍚屾狅L(fēng)殑閿欒錛屾垜浠繀欏婚厤緗甋pring鏉ヨ瀹冪煡閬揚(yáng)ersonDaoHibernate鏄疨ersonDao鐨勫疄鐜幫紝鍚屾牱鐨勶紝鎴戜滑涔熻鍛婅瘔瀹冭繕鏈変釜Person瀵硅薄銆?

閰嶇疆Spring涓殑Person鍜孭ersonDao [#5]

棣栧厛鎴戜滑瑕佸憡璇塖pring鎵鏈塇ibernate鏂囦歡鐨勪綅緗紝涓烘錛屾墦寮src/dao/**/dao/hibernate/applicationContext-hibernate.xml錛屽湪浠ヤ笅浠g爜鍧楁坊鍔?tt>"Person.hbm.xml"銆?


<property聽(tīng)name="mappingResources">聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)<list>聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)<value>org/appfuse/model/Person.hbm.xml</value>聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)<value>org/appfuse/model/Role.hbm.xml</value>聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)<value>org/appfuse/model/User.hbm.xml</value>
聽(tīng)聽(tīng)聽(tīng)聽(tīng)</list>聽(tīng)
</property>聽(tīng)

鐜板湪鎴戜滑闇瑕佹坊鍔犱竴浜沊ML鏁版嵁鏉ョ粦瀹歅ersonDaoHibernate鍒癙ersonDao錛屼負(fù)姝わ紝娣誨姞濡備笅浠g爜鍒版枃浠跺簳閮細(xì)


<!--聽(tīng)PersonDao:聽(tīng)Hibernate聽(tīng)implementation聽(tīng)-->聽(tīng)
<bean聽(tīng)id="personDao"聽(tīng)class="org.appfuse.dao.hibernate.PersonDaoHibernate">聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)<property聽(tīng)name="sessionFactory"><ref聽(tīng)local="sessionFactory"/></property>聽(tīng)
</bean>聽(tīng)

浣犱篃鍙互涓?lt;bean>浣跨敤autowire="byName"灞炴ф潵娑堥櫎"sessionFactory"灞炴?/i>銆?span style="COLOR: blue">浠庝釜浜烘潵璁詫紝鎴戝枩嬈㈠湪XML鏂囦歡閲屼繚鐣欏璞$殑渚濊禆銆?/i>

榪愯DaoTest[#6]

淇濆瓨鎵鏈変慨鏀圭殑鏂囦歡錛岃繍琛?b>ant test-dao -Dtestcase=PersonDao銆?

Yeah Baby, Yeah:BUILD SUCCESSFUL
Total time: 9 seconds


涓嬩竴閮ㄥ垎:Part II:&#21019;&#24314;&#31649;&#29702;&#22120;Manager - 鏄竴涓緩绔嬬被浼間簬Session Facades鐨勶紝浣嗕笉浣跨敤EJBs鐨勪笟鍔acade璇存槑錛岃繖涓猣acades鐢ㄦ潵寤虹珛浠庡墠绔埌DAO灞傜殑鑱旂郴銆?



]]>
主站蜘蛛池模板: 91黑丝国产线观看免费| 一级一级一片免费高清| 久视频精品免费观看99| 最新国产精品亚洲| 亚洲视频免费在线播放| 久久久亚洲AV波多野结衣| 99xxoo视频在线永久免费观看| 亚洲AV日韩AV鸥美在线观看| 国产色在线|亚洲| 中字幕视频在线永久在线观看免费 | 成人免费视频77777| 亚洲国产视频一区| 毛片a级毛片免费观看品善网| 99亚偷拍自图区亚洲| 免费看少妇作爱视频| 亚洲国语精品自产拍在线观看| 亚洲AV综合永久无码精品天堂| 免费观看国产精品| 国产区在线免费观看| 久久亚洲精品中文字幕三区| 日韩亚洲人成网站| 青苹果乐园免费高清在线| 91在线精品亚洲一区二区| 在线v片免费观看视频| 亚洲av无码片vr一区二区三区| 亚洲精品乱码久久久久久不卡| 国产成人精品日本亚洲11| 成年女人男人免费视频播放| 羞羞漫画登录页面免费| 日本19禁啪啪无遮挡免费动图| 亚洲人成电影网站| 国产精品嫩草影院免费| 中文字幕亚洲情99在线| 亚洲精品综合久久| 久久w5ww成w人免费| 亚洲午夜精品一区二区| 成人午夜18免费看| 成av免费大片黄在线观看| 亚洲人成在线免费观看| 亚洲精品高清在线| 99久久久精品免费观看国产|