北大青鳥-y2-java課件1使用hibernate開發(fā)租房系統(tǒng)_第1頁
北大青鳥-y2-java課件1使用hibernate開發(fā)租房系統(tǒng)_第2頁
北大青鳥-y2-java課件1使用hibernate開發(fā)租房系統(tǒng)_第3頁
北大青鳥-y2-java課件1使用hibernate開發(fā)租房系統(tǒng)_第4頁
北大青鳥-y2-java課件1使用hibernate開發(fā)租房系統(tǒng)_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

HQL高級第四章回顧與作業(yè)點評Hibernate主要提供哪兩種數(shù)據(jù)查詢方式?為什么使用HQL?HQL查詢參數(shù)綁定有幾種方式?HQL常用的聚合函數(shù)有哪些?Hibernate如何實現(xiàn)分頁?預(yù)習(xí)檢查如何優(yōu)化HQL?Hibernate數(shù)據(jù)加載方式有哪些?有什么區(qū)別?HQL聯(lián)接查詢有幾種方式?如何使用本地SQL查詢?本章任務(wù)實現(xiàn)租房信息查詢的優(yōu)化實現(xiàn)使用聯(lián)接查詢租房信息實現(xiàn)使用命名查詢租房信息實現(xiàn)使用本地SQL查詢租房信息本章目標(biāo)掌握Hibernate查詢優(yōu)化掌握Hibernate命名查詢掌握本地SQL查詢?nèi)绾螌ibernate進(jìn)行性能優(yōu)化數(shù)據(jù)庫設(shè)計HQL優(yōu)化配置參數(shù)方法使用緩存管理HQL優(yōu)化3-1避免or操作where子句包含or操作,執(zhí)行時不使用索引可以使用in條件來替換fromHousewherestreet_id='1000'orstreet_id='1001'fromHousewherestreet_idin('1001','1000')HQL優(yōu)化3-2避免使用notwhere子句包含not關(guān)鍵字,執(zhí)行時該字段的索引失效使用比較運(yùn)算符替換notfromHouseashwherenot(h.price>1800)fromHouseashwhereh.price<=1800HQL優(yōu)化3-3避免like的特殊形式查詢時,盡可能少使用like避免having子句盡可能在where子句中指定條件避免使用distinct在不要求或允許冗余時,應(yīng)避免使用distinctHibernate數(shù)據(jù)檢索策略Hibernate提供多種數(shù)據(jù)檢索策略,常用的有:立即檢索延遲檢索不同檢索策略的作用域及默認(rèn)檢索策略作用域可選的檢索策略默認(rèn)的檢索策略運(yùn)行時行為受影響的檢索方法類級別立即檢索延遲檢索延遲檢索僅影響Session的load()方法關(guān)聯(lián)級別立即檢索延遲檢索延遲檢索影響Session的load()和get()方法檢索策略的運(yùn)行機(jī)制

類型類級別關(guān)聯(lián)級別優(yōu)點缺點立即檢索立即加載檢索方法指定的對象立即加載與檢索方法指定的對象關(guān)聯(lián)的對象,可以設(shè)定批量檢索數(shù)量對應(yīng)用程序完全透明,不管對象處于持久化狀態(tài),還是游離狀態(tài),應(yīng)用程序都可以方便地從一個對象導(dǎo)航到與它關(guān)聯(lián)的對象(1)select語句數(shù)目多(2)可能會加載應(yīng)用程序不需要訪問的對象,造成內(nèi)存空間的浪費(fèi)延遲檢索延遲加載檢索方法指定的對象延遲加載與檢索方法指定的對象關(guān)聯(lián)的對象,可以設(shè)定批量檢索數(shù)量由應(yīng)用程序決定需要加載那些對象,可以避免執(zhí)行多余的select語句,以及避免加載應(yīng)用程序不需要訪問的對象。提高檢索性能,節(jié)省內(nèi)存空間應(yīng)用程序如果希望訪問游離狀態(tài)的代理類實例,必須保證它在持久化狀態(tài)時已經(jīng)被初始化設(shè)定檢索策略的常用屬性屬性類級別一對多關(guān)聯(lián)級別多對一關(guān)聯(lián)級別lazy1.<class>元素中l(wèi)azy屬性的可選值為:true(延遲檢索)和false(立即檢索)2.<class>元素中l(wèi)azy屬性的默認(rèn)值為true1.<set>元素中l(wèi)azy屬性的可選值為:true(延遲檢索)、false(立即檢索)和extra(增強(qiáng)延遲檢索)2.<set>元素中l(wèi)azy屬性的默認(rèn)值為true1.<many-to-one>元素中的lazy屬性的可選值為:proxy(延遲檢索)、no-proxy(無代理延遲檢索)和false(立即檢索)2.<many-to-one>元素中的lazy屬性的默認(rèn)值為truefetch沒有此屬性1.<set>元素中fetch屬性的可選值為:select(查詢語句)、subselect(子查詢語句)和join(迫切左外連接檢索)2.<set>元素的fetch屬性的默認(rèn)值為select1.<many-to-one>元素中fetch屬性的可選值為:select(查詢語句)和join(迫切左外連接檢索)2.<many-to-one>元素的fetch屬性的默認(rèn)值為select即時加載(ImmediateLoading)當(dāng)實體加載完成后,立即加載其關(guān)聯(lián)數(shù)據(jù)在配置文件(xx.hbm.xml)中設(shè)置lazy=false表示采用即時加載策略<hibernate-mapping><classname="cn.jbit.houserent.bean.District"table="district"><idname="id"type="java.lang.Integer"><columnname="id"/><generatorclass="native"/></id><propertyname="name"type="java.lang.String"><columnname="district_name"length="50"not-null="true"/></property><!---->

<setname="streets"table="street"cascade="all"inverse="true"lazy="false"><key><columnname="district_id"not-null="true"/></key><one-to-manyclass="cn.jbit.houserent.bean.Street"/>

</set></class></hibernate-mapping>設(shè)置lazy屬性為false,立即加載關(guān)聯(lián)的對象演示示例:即時加載延遲加載(LazyLoading)4-1延遲加載就是當(dāng)在真正需要數(shù)據(jù)的時候,才真正執(zhí)行數(shù)據(jù)加載操作類級別的默認(rèn)加載策略為延遲加載Hibernate提供了:對實體對象的延遲加載集合的延遲加載屬性的延遲加載延遲加載(LazyLoading)4-2集合類型的延遲加載意義最為重大,可使性能大為提高修改映射文件的關(guān)聯(lián)部分<hibernate-mapping><classname="cn.jbit.houserent.bean.District"table="district"><idname="id"type="java.lang.Integer"><columnname="id"/><generatorclass="native"/></id><propertyname="name"type="java.lang.String"><columnname="district_name"length="50"not-null="true"/></property><!---->

<setname="streets"table="street"cascade="all"inverse="true"lazy="true"><key><columnname="district_id"not-null="true"/></key><one-to-manyclass="cn.jbit.houserent.bean.Street"/>

</set></class></hibernate-mapping>Lazy屬性的默認(rèn)值為true,故可以省略演示示例:集合延時加載延遲加載(LazyLoading)4-3實體對象的延遲加載為實體設(shè)置延時加載,即設(shè)置<class>元素的lazy屬性為true<classname="cn.jbit.houserent.bean.User"table="users"schema="jbit"lazy="true">…</class>//省略部分代碼Useruser=(User)session.load(User.class,newInteger("281"));System.out.println("獲取用戶ID為1000的用戶");user.getName();//省略部分代碼演示示例:實體對象延遲加載延遲加載(LazyLoading)4-4屬性延遲加載Hibernate3中,引入的新特性——屬性的延遲加載適用于二進(jìn)制大對象、字符串大對象以及大容量組件類型的屬性<classname="cn.jbit.houserent.bean.House"table="house"><!--省略其他配置--><propertyname="description"type="text"lazy="true"><columnname="description"/></property></class>Queryquery=session.createQuery("fromHouseashwhereh.price=2000");System.out.println("獲取價格為2000元的房屋信息");List<House>result=query.list();for(Househouse:result){System.out.println("標(biāo)題:"+house.getTitle());System.out.println("描述:"+house.getDescription());}設(shè)置屬性的延遲加載演示示例:屬性延遲加載list()方法和iterate()方法2-1使用list()方法獲取查詢結(jié)果,每次發(fā)出一條查詢語句,獲取全部數(shù)據(jù)使用iterate()方法獲取查詢結(jié)果,先發(fā)出一條SQL語句用來查詢滿足條件數(shù)據(jù)的id,然后依次按這些id查詢記錄,也就是要執(zhí)行N+1條SQL語句(N為符合條件的記錄數(shù))sessionFactory=newConfiguration().configure().buildSessionFactory();session=sessionFactory.openSession();Queryquery=session.createQuery("fromHouseash");System.out.println("使用iterate()方法查詢數(shù)據(jù)");Iterator<House>it=query.iterate();while(it.hasNext()){ Househouse=it.next(); System.out.println("標(biāo)題:"+house.getTitle());}System.out.println("-------------------"); System.out.println("使用list()方法查詢數(shù)據(jù)"); List<House>result=query.list();for(Househouse:result){ System.out.println("標(biāo)題:"+house.getTitle());}list()方法和iterate()方法2-2list()方法將不會在緩存中讀取數(shù)據(jù),它總是一次性的從數(shù)據(jù)庫中直接查詢所有符合條件的數(shù)據(jù),同時將獲取的數(shù)據(jù)寫入緩存

iterate()方法則是獲取了符合條件的數(shù)據(jù)的id后,首先根據(jù)id在緩存中尋找符合條件的數(shù)據(jù),若緩存中無符合條件的數(shù)據(jù),再到數(shù)據(jù)庫中查詢sessionFactory=newConfiguration().configure().buildSessionFactory();session=sessionFactory.openSession();Queryquery=session.createQuery("fromHouseash");System.out.println("使用list()方法查詢數(shù)據(jù)"); List<House>result=query.list();for(Househouse:result){ System.out.println("標(biāo)題:"+house.getTitle());} System.out.println("-------------------"); System.out.println("使用iterate()方法查詢數(shù)據(jù)");Iterator<House>it=query.iterate();while(it.hasNext()){ Househouse=it.next(); System.out.println("標(biāo)題:"+house.getTitle());}sessionFactory=newConfiguration().configure().buildSessionFactory();session=sessionFactory.openSession();Queryquery=session.createQuery("fromHouseash");System.out.println("使用list()方法查詢數(shù)據(jù)");Listresult1=query.list();for(inti=0;i<result1.size();i++){Househouse=(House)result1.get(i);System.out.println("標(biāo)題:"+house.getTitle());}System.out.println("----------------------");System.out.println("再一次執(zhí)行l(wèi)ist()方法");Listresult2=query.list();for(inti=0;i<result2.size();i++){Househouse=(House)result2.get(i);System.out.println("標(biāo)題:"+house.getTitle());}sessionFactory=newConfiguration().configure().buildSessionFactory();session=sessionFactory.openSession();Queryquery=session.createQuery("fromHouseash");System.out.println("使用iterate()方法查詢數(shù)據(jù)");Iteratorit1=query.iterate();while(it1.hasNext()){Househouse=(House)it1.next();System.out.println("標(biāo)題:"+house.getTitle());}System.out.println("----------------------");System.out.println("再一次執(zhí)行iterate()方法");Iteratorit2=query.iterate();while(it2.hasNext()){Househouse=(House)it2.next();System.out.println("標(biāo)題:"+house.getTitle());}演示示例:即時加載list()方法和iterate()方法指導(dǎo)——實現(xiàn)租房信息查詢的優(yōu)化訓(xùn)練要點:復(fù)雜查詢HQL語句的優(yōu)化使用延時加載需求說明:對租房信息的查詢進(jìn)行優(yōu)化實現(xiàn)思路:分析HQL語句,并對其優(yōu)化使用延時加載

完成時間:20分鐘共性問題集中講解常見調(diào)試問題及解決辦法代碼規(guī)范問題共性問題集中講解HQL聯(lián)接查詢2-1內(nèi)聯(lián)接:innerjoin最典型、最常用的聯(lián)接查詢兩個表存在主外鍵關(guān)系時通常會使用內(nèi)聯(lián)接查詢外聯(lián)接左外聯(lián)接:leftjoin或leftouterjoin右外聯(lián)接:rightjoin或rightouterjoin完整外聯(lián)接:fulljoin或fullouterjoinHQL聯(lián)接查詢2-2HQL支持的聯(lián)接類型聯(lián)接類型HQL語法適用范圍內(nèi)聯(lián)接

innerjoin或join適用于有關(guān)聯(lián)關(guān)系的持久化類,并且在映射文件中對這種關(guān)聯(lián)關(guān)系中作了映射迫切內(nèi)聯(lián)接innerjoinfetch或joinfetch左外聯(lián)接leftouterjoin或leftjoin迫切左外聯(lián)接leftouterjoinfetch或leftjoinfetch右外聯(lián)接rightouterjoin或rightjoinHibernate:selectdistrict0_.idasid1_0_,streets1_.idasid2_1_,district0_.district_nameasdistrict2_1_0_,streets1_.street_nameasstreet2_2_1_,streets1_.district_idasdistrict3_2_1_,streets1_.district_idasdistrict3_0__,streets1_.idasid0__fromdistrictdistrict0_innerjoinstreetstreets1_ondistrict0_.id=streets1_.district_id內(nèi)聯(lián)接Hibernate的內(nèi)聯(lián)接語法如下fromEntityinnerjoin[fetch]EpertysessionFactory=newConfiguration().configure().buildSessionFactory();session=sessionFactory.openSession();Queryquery=session.createQuery("fromDistrictdinnerjoinfetchd.streetss");Listresult=query.list();忽略fetch關(guān)鍵字,我們得到的結(jié)果集中,每行數(shù)據(jù)都是一個Object數(shù)組sessionFactory=newConfiguration().configure().buildSessionFactory();session=sessionFactory.openSession();Queryquery=session.createQuery("fromDistrictdinnerjoind.streetss");Listresult=query.list();Iteratorit=result.iterator();while(it.hasNext()){Object[]results=(Object[])it.next();System.out.println("數(shù)據(jù)的類型:");for(inti=0;i<results.length;i++){System.out.println(results[i]);}}演示示例:內(nèi)聯(lián)接左外聯(lián)接Hibernate的左外聯(lián)接語法如下fromEntityleftjoin[fetch]EpertysessionFactory=newConfiguration().configure().buildSessionFactory();session=sessionFactory.openSession();Queryquery=session.createQuery("fromDistrictdleftjoinfetchd.streetss");Listresult=query.list();Hibernate:selectdistrict0_.idasid1_0_,streets1_.idasid2_1_,district0_.district_nameasdistrict2_1_0_,streets1_.street_nameasstreet2_2_1_,streets1_.district_idasdistrict3_2_1_,treets1_.district_idasdistrict3_0__,streets1_.idasid0__fromdistrictdistrict0_leftouterjoinstreetstreets1_ondistrict0_.id=streets1_.district_id右外聯(lián)接Hibernate的右外聯(lián)接語法如下fromEntityrightjoin[fetch]

EpertysessionFactory=newConfiguration().configure().buildSessionFactory();session=sessionFactory.openSession();Queryquery=session.createQuery("fromDistrictdrightjoinfetchd.streetss");Listresult=query.list();Hibernate:selectdistrict0_.idasid1_0_,streets1_.idasid2_1_,district0_.district_nameasdistrict2_1_0_,streets1_.street_nameasstreet2_2_1_,streets1_.district_idasdistrict3_2_1_,treets1_.district_idasdistrict3_0__,streets1_.idasid0__fromdistrictdistrict0_rightouterjoinstreetstreets1_ondistrict0_.id=streets1_.district_id演示示例:右聯(lián)接練習(xí)——聯(lián)接查詢的使用需求說明:innerjoinfetch的使用查詢發(fā)布租房信息的用戶以及房屋信息完成時間:15分鐘共性問題集中講解常見調(diào)試問題及解決辦法代碼規(guī)范問題共性問題集中講解小結(jié)HQL優(yōu)化從哪幾個方面考慮?Hibernate數(shù)據(jù)加載方式有哪些?有什么區(qū)別?HQL聯(lián)接查詢有幾種方式?命名查詢<query>元素用于定義一個HQL查詢語句,它和<class>元素并列以<![CDATA[

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論