版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
講 web項目參照MVC圖
JDBC本質(zhì),編寫sql語句,發(fā)送到數(shù)據(jù)庫中執(zhí)行(sql語句),在企業(yè)開發(fā)需要程 》ORMO:對象(面向?qū)ο? MHibernate簡介:最成功的開源的orm映射框架,底層封裝的就是完全的面向?qū)ο螅ùa很少,一般是jdbc可以兼容世界上大部分?jǐn)?shù)據(jù)庫(Dao的代碼開源兼容任意的數(shù)據(jù)庫,hibernate會自動把我們寫的hibernate代碼,轉(zhuǎn)化對應(yīng)的數(shù)據(jù)庫sql語句性能比較差,尤其是批處理方面,大數(shù)據(jù)量開發(fā)的時候,最好使用jdbc hql的功能相對薄弱(hql是hibernate中sql語句)hibernate3.2dochibernate的APIeg:hibernate的案例,開發(fā)時候可以用來參etchibernategrr:hql語libhibernate3方(3方j(luò)ar:當(dāng)前該框架所依賴的jarhibernate運(yùn)行和擴(kuò)展的jar)6)src:hibernate源代碼hibernate.jar:hibernatehibernate開發(fā)的流程(導(dǎo)入jar,添加配置文件1)導(dǎo)入jar:建議去公司實際企業(yè)開發(fā),jar和第3方j(luò)ar,最好全部導(dǎo)入項目,當(dāng)項目要上線時候,把不用的第3方j(luò)ar,全部刪除2)添加配置文件 下pertieshibernate po類(實體類編寫orm映射文件 》 orm映射文 修改配置文 :加載orm映射文件利用hibernatehibernate中常用的1)Configuration:加載hibernate配置文a)直接創(chuàng)建Configuration對象(newConfiguration()):b)newConfigurationconfigure():hibernate.cfg.xml現(xiàn)在通用的版本)2)SessionFactory:hibernate中重量級對象,(重量級對象:企業(yè)開發(fā)中,消耗資源較多,功能強(qiáng)大的對象,叫做重量級對象)提供sessionSessionFactory,管理二級緩存......3)Session:hibernate中所有的增刪查改操作都是依賴session對象實現(xiàn)其功(區(qū)別:Session:hibernate中實現(xiàn)增刪查改操作的session。HttpSession:servlet中的會話,作用域...)hibernate對表的改變,必須依賴程序員開啟事務(wù),并提交事務(wù)操作增,改,刪對比:jdbc自動提交事務(wù)參照:,簡化只創(chuàng)建一個SessionFactory(給調(diào)用者提供session關(guān)閉使用session,實現(xiàn)增刪查改增加:session.save(po對象);sessiondelete(po對象查詢:session.get(po類名.class,id);sessionload(po類名.class,id);sessionupdate(po對象);cglibsession.load(Po.class,id)返回的對象,是目標(biāo)對象的對象(暫時替代要查找的對= 就是臨時代替id為1 eg:父 子類對象名字=new子類對Listlist=new該對象是由hibernate內(nèi)部生成對(通過第3方j(luò)ar:cglib.jar),該生成對象方式叫做cglib動load并沒有立刻查詢數(shù)據(jù)庫,而且是在內(nèi)部生成一個臨時替代id=1的對只能有真正使用該對象中某些屬性,hibernate才會真實的發(fā)出sql語句,查延遲加載:要查詢對象的時候,不立刻發(fā)出sql語句查詢數(shù)據(jù),在hibernate內(nèi)才發(fā)出sql語句,查詢數(shù)據(jù)庫,叫做延遲加載load方法:就是hibernate中最典型延遲加載Configurationconfiguration=newConfiguration().configure();SchemaExportschemaExport=newSchemaExport(configuration);schemaExport.create(true,true);封裝Session對象目的:SessionFactoryprivatestaticSessionFactorysessionFactory;trysessionFactory=}catch(Exceptione)}}publicstaticSessiongetSessionInstance(){returnsessionFactory.openSession();}publicstaticvoidcloseSession(Sessionsession){if(session!=null){}}load使用load3)使用load查詢的對象的只能在session范圍內(nèi)使用(cglib動態(tài)產(chǎn)生對象的生命周期,跟session一致先查詢到要修改的對象,再調(diào)用update方法好處:穩(wěn)定,不出錯(不出現(xiàn)空直接創(chuàng)建新的對象,添加id根據(jù)對象idhibernate可以自動轉(zhuǎn)化一些基本的類型也可以由我們自己來設(shè)置類型的轉(zhuǎn)換格式:<propertytype="映射類型">type:可以指定兩種類型:java類型和hibernate2)浮點(diǎn)類型:float,doubleboolean:yes_no:可以把yes或no轉(zhuǎn)換對應(yīng)Y或N默認(rèn)是Ntrue_false:T或F 默認(rèn)是Ftimestamp:年月日,時分秒類型hibernate<propertynot_null:非空unique:唯一update:修改insert:插入一張表中,主鍵最為重要,主鍵的生成策略是指hibernateuuid:每次插入新的數(shù)據(jù)時候,hibernate32位的不重復(fù)的字符目前mysqlsequence:主鍵自增,針對oracle等需要使用序列自增的數(shù)據(jù)庫,依然依賴數(shù)據(jù)<idname="id"<generatornative:根據(jù)數(shù)據(jù)庫的不同,使用不同生成策略,如果數(shù)據(jù)庫是mysql等,生成策略identity,如果是oracle等(依賴序列),是sequence,使用非常廣泛。hibernate是一個持久層框架,對象在hibernate3只用new方式創(chuàng)建的對象,都是處于臨時態(tài)被session操作的對象,納入session特點(diǎn):持久態(tài)對象改變,直接同步到數(shù)據(jù)庫中用session態(tài)托管態(tài)/當(dāng)一個持久態(tài)的對象脫離sessionsave:臨時態(tài)/瞬時態(tài) 這樣單獨(dú)使用save方法或使用update來替代save或updatesaveOrUpdatesave還是通過“外鍵”來關(guān)聯(lián)關(guān)hibernate是面向?qū)ο?,通過對象的操作來操作表使用hibernatepo對象,在底層通過orm<classname="Emp"<id<generator<property
<!--many-to-one:關(guān)聯(lián)關(guān)系,利用創(chuàng)建外鍵deptIddept--<many-to-onename="dept"class="Dept"column="deptId"一對多關(guān)聯(lián)映射(單向在hibernate中由一的一端來關(guān)聯(lián)關(guān)系,多的不關(guān)聯(lián)關(guān)系<setname="emps"<!--一對多單向關(guān)聯(lián)映射,由一的一端來關(guān)聯(lián)關(guān)系,外鍵deptId,由一的一端來創(chuàng)建,多的一端不關(guān)聯(lián)關(guān)系--<!-- 1)該外鍵創(chuàng)建到多的一端t_emp表中<key<one-to-many多對一關(guān)聯(lián)映射(雙向)none:沒有任何的級聯(lián)操作(一般是默認(rèn)allsave-update和delete企業(yè)開發(fā)時候,如果有需要級聯(lián)操作的表,建議配置成all注在發(fā)送sql斷是否需要對級聯(lián)對象進(jìn)行相應(yīng)的操作態(tài)那他級聯(lián)對象也會被刪除但若對象是new象不會刪除而是現(xiàn)將關(guān)聯(lián)對象的外鍵設(shè)置為nulltrue:放棄關(guān)聯(lián)關(guān)延遲加載(二目的:就是提高h(yuǎn)ibernatelazy懶加載:只有當(dāng)真是使用該對象的,才發(fā)出sql<class>lazytruelazyfalselazytrue:支持延遲加載,是默認(rèn)值lazy=false:延遲加載失效lazyextra集合端最常用的設(shè)置值,發(fā)出一條比較智能的sql語句,跟true很相似單端(<many-to-one):lazy的取值 :跟turefalsemyEclipse提示,是以目前用戶使用最多的作為提示, 21)多對多關(guān)系的表,是由三張表構(gòu)成,其中一張表,專門用來關(guān)聯(lián)關(guān)hibernate當(dāng)中只有兩個類,用來關(guān)聯(lián)關(guān)系的類,創(chuàng)建第三張表,用來關(guān)<!--多對多關(guān)聯(lián)映射,由多(emp)的一端來關(guān)聯(lián)關(guān)系,創(chuàng)建t_emp_role<key>當(dāng)前t_emp<many-to-many中rid的值是t_role--
<setname="roles"<key<many-to-manyclass="Role"column="rId"></many-3多對多雙向關(guān)聯(lián)映射多對多兩端的映射文件中的表名和列名必須一致<setname="emps"<key<many-to-manyclass="Emp"column="eId"></many-4一對一主鍵關(guān)聯(lián)映射(單向<class " <idforeign:主鍵生成策略:是參照外鍵來生成自己主鍵foreign會取得關(guān)聯(lián)對象的標(biāo)--<generatorproperty:<param<property<one-to-onename="card"class="Card"5)如果是雙向關(guān)聯(lián)那么另一個表中的配置為<one-to-onename=" HQLhibernate中的sql語句sql直接操作數(shù)據(jù)庫hibernate通過對象來操作不夠準(zhǔn)確導(dǎo)致性能消耗太大,可以使用一種近似sql的語句,來操作數(shù)據(jù),這種語句就是hql1)frompoQueryhibernate中專門用來執(zhí)行hqlQueryquery=query.list():hibernate可以把hqlList<Dept>list= tor<Dept> tor= Deptdept=i }}2)1frompoas別名格式2:frompo類名別名3:select別名fromeg:selectnew構(gòu)造方法frompoStringhql="selectnewEmp(id,ename)from1)格式:select屬性名frompo類名連接查詢,建議使用別名.select別名.屬性名frompoStringhql="selectd.dnamefromDept2)select123...frompo類名返回結(jié)果:list<Object[]>Stringhql="selecte.id,e.ename,e.agefromEmpe";List<Object[]>list=session.createQuery(hql).list(); tor<Object[]>i tor=list.i select屬性名frompo類名where條件查詢age=50的所有的emp員工的id,enameStringhql="selecte.id,e.enamefromEmpewheree.age=b)格式:select屬性/frompo類名where條件+:別名查詢部門id是5的所有的員工EmpEmp中Deptdept的fromEmpewheree.dept.id=Stringhql="fromEmpewheree.dept.id=:myId";List<Emp>list=session.createQuery(hql).setParameter("myId",總結(jié):hql沒辦法直接查詢外鍵,依賴于對象之間的關(guān)聯(lián)關(guān)系,導(dǎo)向查詢,比較麻是hql的缺點(diǎn)在hibernate中可以直接使用sqlStringsql="selectid,enamefromt_empwheredeptIdbetween1and3";List<Object[]>list=session.createSQLQuery(sql).list();
Stringhql="fromEmpewheree.dept.dnamelike?2)顯示多表連接查詢(通過join進(jìn)行多表的連接a)(innersql:selecte.*,d.*fromt_empaseinnerjoint_deptasdone.deptId=d.id;hql也是利用join,可以省略連接的條件sql:fromEmpeinnerjoine.deptdStringhql="selecte.id,e.ename,d.id,d.dnamefromEmpeinnerjoine.deptd";List<Object[]>list=session.createQuery(hql).list();左外連接:(leftouterjoin)以左邊的表為主sql:selectd.*,e.*fromt_deptdleftouterjoint_empeond.id=e.deptIdhql:fromEmpeleftouterjoine.deptd(rightouterjoin)sql:selectd.*,e.*fromt_deptdrightouterjoint_empeond.id=e.deptIdhql:fromEmperightouterjoine.deptStringhql="selecte.id,e.ename,d.id,d.dname""fromEmpeleftjoine.deptd";Stringhql="selecte.id,e.ename,d.id,d.dname"+"fromEmperightjoine.dept數(shù)據(jù)庫,如果使用分頁,則優(yōu)先考慮hibernate自身List<Emp>list=session.createQuery("from使用hql插入一般都是用saveStringhql="deletefromDeptewheree.id=?";introw=session.createQuery(hql).setParameter(0,Stringhql="updateDeptssets.dname=?"+"wheres.id=?";introw=session.createQuery(hql).setParameter(0,.setParameter(1,使用 te查詢對象中的n+1問使用 te查詢對象的時候,先發(fā)出一條插敘id的sql語 根據(jù)查詢出來的id,再發(fā)出n條sqln對比list方法跟 List1條sql te:發(fā)出n+1條sql語句Stringhql="fromDept"; tor<Dept>i tor=session.createQuery("fromDept").i Stringhql="selectcount(*)fromEmp";Listlist=在hibernate中使用count(*),返回值是longlongcount=longcount=2月28 星期
1hql(重點(diǎn)2Hibernate在進(jìn)行數(shù)據(jù)時,會根據(jù)緩存管理策略,首先在緩存中查詢,如果發(fā)現(xiàn),則直接使用,避免數(shù)據(jù)庫調(diào)用的開銷,如果沒有,則發(fā)出sql,去數(shù)據(jù)庫中查詢發(fā)出sqlHibernate緩存分為兩個層次:Hibernate的緩存在兩種情況下發(fā)揮作用:根據(jù)主鍵加載實體get,load使用HQL查詢時 3一級緩存,是事務(wù)級緩存,也叫session一級緩存的數(shù)據(jù)結(jié)構(gòu)是Map,用于查詢實體。Map的key存放實體的Id,Map一級緩存的生命周期與Session有關(guān),Session產(chǎn)生一級緩存創(chuàng)建,Session關(guān)閉一級 tor).在一個session內(nèi)部,2次使用使用i te相同的對象沒有發(fā)出n+1條sql語句,只發(fā)出查詢對象id的sql語句ite1次查詢emp2次再查詢相同對象的時候,首先發(fā)出sql語句,查詢對象的id,hibernate策略,先去緩存查詢,有,直接使用。根據(jù)id找到value,所以沒有發(fā)出查詢對象的sql語句一級緩存不能禁用,但可以通過Session的clear方法和evict(較弱)方法清理一級緩存,evict:智能清理一個對象,或一類對象,一級緩存可以保存任意的對象,evict清理一flush:作用就是將session緩存中的數(shù)據(jù)跟數(shù)據(jù)庫保持同步Session的save方寫緩存,在批量插入數(shù)據(jù)時要注意對一級緩存做定時清理。Hibernate的批量處理效率不高,建議使用Session.connection()或得Jdbc連接后使用Jdbc的相關(guān)API做批處理操作1二級緩存也稱進(jìn)程級的緩存或SessionFactory級的緩存,二級緩存可以被所有二級緩存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二Hibernate默認(rèn)情況下是打開的,提供一個Hashtable二級緩存,但只適用于研發(fā),4)a)配置二級緩存的提供商c)添加緩存的配置文件encache.xml(src)d)設(shè)置緩存對象(一級緩存保存跟session有關(guān)所有的對象,二級緩存保存的 (laod):在兩個session中,分別調(diào)用loadsession關(guān)閉該session發(fā)現(xiàn)第二次查詢的是后仍然沒有發(fā)出任何的sql1方法查詢的時候查詢回來Dept對象,保存到一級緩存和二級緩存中,當(dāng),一級緩存銷毀,二級緩存的生命周期跟session無關(guān),依然保存Dept2再次使用load方法查詢同一個Dept對象的時候,hibernate的Dept對象,所以沒有數(shù)據(jù)庫,未發(fā)sql語 tor):在兩個session中,使用 只發(fā)出查詢id的sql語句,第1次查詢使用
,當(dāng)?shù)?次再一個新的session中查詢的時候,使用i te先發(fā)出查詢id的語句,根據(jù)查詢出來的id,去二級緩存中查詢對應(yīng)的對象也可以通過SessionFacotry的evict方法清理evict可以清除二級緩存中某一個對象或管理二級緩存,主要依賴SessionFactory中SessionFactoryfactory//從二級緩存中刪除id1的deptfactory.evict(Dept.class,//2)去掉一類對象從二級緩存中刪除所有的dept21)id在hibernate.cfg.xml<property (具體使用方法1).在兩個session中,使用list方法,查詢dname//第一個ses
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 社會保險管理與法律規(guī)制
- 節(jié)能減排部管理之道
- 地下電纜溝挖機(jī)租賃合同協(xié)議書
- 2025公路陸運(yùn)貨物運(yùn)輸合同模板
- 教育機(jī)構(gòu)行政人員聘用協(xié)議
- 川省水利事業(yè)單位聘用合同條款
- 收款銷售操作規(guī)程
- 道路改造工程監(jiān)督意見書
- 企業(yè)銷售合同管理準(zhǔn)則
- 建筑工程公司員工招聘合同樣本
- 自然資源學(xué)原理(緒論)蔡運(yùn)龍
- 大學(xué)英語(一)智慧樹知到期末考試答案2024年
- 高空作業(yè)安全免責(zé)聲明
- 2024年河南省水務(wù)規(guī)劃設(shè)計研究有限公司人才招聘筆試參考題庫附帶答案詳解
- 工程制圖知識要點(diǎn)
- 2024山東能源集團(tuán)中級人才庫選拔高頻考題難、易錯點(diǎn)模擬試題(共500題)附帶答案詳解
- 視頻后期剪輯述職報告
- 2021年安徽省公務(wù)員錄用考試《行測》真題及答案
- 個人就業(yè)能力展示
- 銀行對公業(yè)務(wù)課件
- 冰箱側(cè)板制造工藝
評論
0/150
提交評論