版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
目一、Hibernate的概 Hibernate框架的作 Hibernate數(shù)據(jù)庫的優(yōu) Hibernate的設(shè)計思 二、Hibernate的基本使 Hibernate的主要結(jié) Hibernate主要的 Hibernate使用步 HQL語句(簡要介紹 三、數(shù)據(jù)映射類 type映射類型的兩種寫 四、Hibernate主鍵生成方 五、Hibernate基本特 常犯的錯 Session的get和load方法的區(qū) 六、關(guān)聯(lián)映 關(guān)聯(lián)操作(查詢joinfetch/級聯(lián) 七、Hibernate查詢方 HQL查 HQL和SQL的相同 HQL和SQL的不同 HQL典型案 Criteria查 NativeSQL原生SQL查 八、Hibernate高級特 二級緩 查詢緩 九、Hibernate鎖機 悲觀 樂觀 十、其他注意事 Hibernate中分頁查詢使用joinfatch的缺 一、Hibernate的概述Hibernate框架的作用可以使用它替代以前的JDBC數(shù)據(jù)。Hibernate數(shù)據(jù)庫的優(yōu)SQLHibernate不和數(shù)據(jù)庫關(guān)聯(lián),是一種通用的數(shù)據(jù)庫框架(30多種數(shù)據(jù)庫APIHibernateAPISQLHibernateSQL語句。JDBC數(shù)據(jù)庫的缺Hibernate的設(shè)計思想Hibernate是基于ORM(ObjectRelationMap)思想設(shè)計的,稱為對象關(guān)系映射。負(fù)Java對象和數(shù)據(jù)庫表數(shù)據(jù)之間的映射。HibernateORMORM工具,如:MyBatis(以前叫iBatisMyBatis。ORMJava(ORMJDBC二、Hibernate的基本使用Hibernate的主要結(jié)構(gòu)HibernateEntity實體類(n個,一個表一個hbm.xml映射文件(n個Hibernate主要的Configurationhibernate.cfg.xmlSessionFactory。2)SessionFactory:了hbm.xml中描述的信息,內(nèi)置了一些預(yù)編譯的SQL,可以創(chuàng)SessionSessionJava程序與數(shù)據(jù)庫的一次連接會話ConnectionJSPsession不是一回事,就是名字一樣而已Transaction:負(fù)責(zé)HibernateHibernate事務(wù)關(guān)閉了自動提交功能,需要顯式的追加事務(wù)管理(Transaction對象中的commit();提交事務(wù)!APIHibernateHibernate使用步驟<?xmlversion='1.0'encoding='UTF-<!DOCTYPEhibernate-configuration"-//Hibernate/HibernateConfigurationDTD3.0//EN"<propertyname="dialect"><!--指定方言,決定HibernateSQL--></property><!--hibernate3.jarorg.hibernate.dialect<propertyname="connection.url"><property<property<?xmlversion='1.0'encoding='UTF-<!DOCTYPEhibernate-configuration"-//Hibernate/HibernateConfigurationDTD3.0//EN"<propertyname="dialect"><!--指定方言,決定HibernateSQL--></property><!--hibernate3.jarorg.hibernate.dialect<propertyname="connection.url"><property<property<property<propertyname="connection.driver_class">hibernateSQL<propertySQL<property<!--指定映射描述文件 注意事項:應(yīng)該放在源文件的src 下,默認(rèn)為hibernate.cfg.xml。文件內(nèi)容是Hibernate工作時必須用到的基礎(chǔ)信息。privateIntegerid;privateIntegerbaseDuration;privateIntegerid;privateIntegerbaseDuration;基本時長privateFloatunitCost;//單位費用privateStringdescr;//資費信息說明privateDatestartTime;//啟用日期……getter/setterprivateStringfeeNameprivateFloatbaseCostprivateStringstatus;0:開通;1:暫停;privateDatecreateTime;//創(chuàng)建日期privateStringcostTypeObject性和對應(yīng)的getter/setter方法,而沒有任何業(yè)務(wù)邏輯方法的類。這種類最多再加入equals()、hashCode()、toString()Object的方法。不承擔(dān)任何實現(xiàn)業(yè)務(wù)邏step5hbm.xml映射(文件)POJO類和表之間的映射關(guān)系(xxxx字段,一個類對應(yīng)一個映射文件。例如:Cost.hbm.xml內(nèi)容如下:<?xmlversion="1.0"encoding="utf-<!DOCTYPEhibernate-map PUBLIC"-//Hibernate/HibernateMap DTD3.0//EN" <!--定義COST_CHANG表和Cost類型之間的映射信 ><!-- ">--><!--name:包名.類名,指定是哪個類;table:數(shù)據(jù)庫中哪個表;catalog:對Oracle而言,不寫也行(若用工具則會自動生成。例如,select*fromcost_chang則會在hibernate.cfg配置文件中定義的庫(或用戶)下去找表。若寫了則為select*fromsystem.cost_chang 報錯,主鍵映射<idname="id"<columnname="ID"/><!--或 ><!--<propertyname="nametype="java.lang.String"><!--<propertyname="baseDuration"type="java.lang.Integer"><!--<propertyname="baseCosttype="java.lang.Float"><!--<columnname="BASE_COST""<!--也可寫成<propertynametypecolumnproperty>,主鍵列同理! hbm.xml中已寫出的屬性與字段的映射要一一對應(yīng),若表中沒有某個字段,卻HibernateUtilSessionpublicclassHibernateUtilpublicclassHibernateUtilprivatestaticSessionFactoryConfigurationconf=newConfiguration();//加載主配置hibernate.cfg.xmlsf=conf.buildSessionFactory();//獲取SessionFactory publicstaticSessiongetSession(){//獲取SessionSessionsession return publicCostfindById(intpublicCostfindById(intid);publicvoiddelete(intid);publicList<Cost>publicvoidsave(Costpublicvoidupdate(CostpublicclassCostDAOImplimplementsCostDAO{privateSessionsession;publicCostDAOImplsession getfindByIdid(主鍵)條件值即可,其他條件查詢做不了*/publicCostfindById(intid)//SessionCostcost=(Cost)session.get(Cost.class,id); return insert操作。即先:selectCOST_SEQ_CHANG.nextvalfromdual;然后:insertinto……*/publicvoidsave(Costcost){//SessionTransactiontx=session.beginTransaction();//打開事務(wù) /**delete方法Hibernate以“對象”為單位進(jìn)行數(shù)據(jù)庫操作,所以這id查再刪*/publicvoiddelete(intid)//SessionTransactiontx=session.beginTransaction(); Costcost=newCost(); /**update方法publicvoidupdate(Costcost)//Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction(); /**特殊查詢,SQL語句:Stringsql="select*from";fromHibernate中特有的查詢語句,根據(jù)映射的類去查詢。*/publicpublicList<Cost>findAll()//Sessionsession=HibernateUtil.getSession();Stringhql="fromCost";//HQL語句Query return publicvoidtestFindById(){//getCostDAOcostDao=newCostDAOImpl(); Costcost=costDao.findById(1);System.out.println(cost.getBaseCost());System.out.println(cost.getUnitCost()); publicvoidtestSave(){//idHibernateCostcost=new cost.setName("2013計時cost.setUnitCost(0.8f);cost.setDescr("2013-08-09計時,0.8元/小時。"); CostDAOcostDao=newCostDAOImpl(); publicvoidtestUpdate(){//01CostDAOcostDAO=newCostDAOImpl();/**注意事項:更新部分字段,不能 沒設(shè)置的字段將被改為空!即不能:Costcost=newCost(); cost.setStartTime(newDate(System.currentTimeMillis())); Costcost=costDAO.findById(90);//只能id找到帶有所有值的對象cost.setStartTime(newDate(System.currentTimeMillis())); publicvoidCostDAOcostDAO=newCostDAOImpl(); publicvoidCostDAOcostDAO=newCostDAOImpl();List<Cost>list=costDAO.findAll();for(Cost HQL語句(簡要介紹三、數(shù)據(jù)映射類型映射類型的作用type映射類型的兩種寫法Java類型,例如:java.lang.String、java.lang.IntegerString tim(timesam(;true/falsetrue/false<-true_false->char(1)(T/Ftrue/falsetrue/false<propertyname="name"type="string"><columnname="NAME"<propertyname="name"type="string"><columnname="NAME"java.util.Datedate映射,則只把年月日存進(jìn)數(shù)據(jù)庫;java.sql.Date只有年月日。java.sql.Timestamp有年月日時分秒毫秒。若在頁面顯示按特定格式顯示則用Struts2<s:datename="屬性名format="yyyy-MM-dd四、Hibernate主鍵生成方式五種生成方式nativeHibernate會根據(jù)方言類型不同,選擇不同的主鍵生成方式。如果是insert語句插入。OracleMySQL都可用。但不適合并發(fā)量很大的情況!;hilo五、Hibernate基本特性對象持久性APIAPI處于持久狀態(tài)的對象具有的特點同步Session對象負(fù)責(zé)管理和同步。Session的一級緩存中存放(Session緩存中的對象都是持久對象態(tài),當(dāng)對象的不存在時,對象才被回收。沒被回收時,對象中的數(shù)據(jù)還在!三種狀態(tài)下的對象的轉(zhuǎn)換批量操作:注意及時清除緩存Transactiontx=session.beginTransaction();for(inti=0;i<100000;i++){ FooTransactiontx=session.beginTransaction();for(inti=0;i<100000;i++){ Foofoo=newFoo(); 案例:三種狀態(tài)下的對象使用, /**提交事務(wù),若后面不寫flushcommit,則也能執(zhí)行更新操作。因為commit在flushflush可不寫*//**觸發(fā)同步動作,同步和提交是兩回事。數(shù)據(jù)有變化才同步(更新,沒變化不會更新*/ session.close();//關(guān)閉session釋放資源 publicvoidFoofoo=newFoo(); foo.setHireDate(newDate(System.currentTimeMillis()));Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction(); publicvoidFoofoo=(Foo)session.get(Foo.class,2);//foo具有持久性 //session.flush();//數(shù)據(jù)有變化才同步update,沒變化不會update 一級緩存機制(默認(rèn)開啟Session創(chuàng)建而開辟(SessionFactory創(chuàng)建Session.close()而釋放。一級緩存的好處管理一級緩存的方法publicvoidtest1(){ Sessionsession=HibernateUtil.getSession();Foofoo1=(Foo)session.get(Foo.class,1);//第一次查詢System.out.println(foo1.getName());//SQL查詢語句Foofoo2=(Foo)session.get(Foo.class,1);//后續(xù)查詢System.out.println(foo2.getSalary());//SQL查詢語句 publicvoidtest2(){ Sessionsession=HibernateUtil.getSession();Foofoo1=(Foo)session.get(Foo.class,1);//第一次查詢System.out.println(foo1.getName());//能出現(xiàn)SQL查詢語句 //或session.clear(foo1);Foofoo2=(Foo)session.get(Foo.class,1);//后續(xù)查詢System.out.println(foo2.getSalary());//SQL查詢語句 publicvoid SessionFoofoo1=(Foo)session.get(Foo.class1);//不同的對象,所以查詢兩次Foofoo2=(Foo)session.get(Foo.class,2); publicvoid SessionFoofoo1=(Foo)session.get(Foo.class,1); Foofoo2=(Foo)session.get(Foo.class,1);//又一次查詢 延遲加載機制Hibernate在使用時,有些APIgetter方法獲取屬性值時,才去數(shù)據(jù)庫查詢加載。具有延遲加載機制的操作常犯的錯誤報錯:LazyInitializationException:couldnotinitializeproxy-noSession,原因:代碼session在加載數(shù)據(jù)前關(guān)閉了。只要看到這個類名:LazyInitializationExceptionsession過早關(guān)閉,后面的描述可能不同。報錯:NonUniqueObjectException:adifferentobjectwiththesameidentifiervaluewasalreadyassociatedwiththesessionid卻相同。例如:Sessionsession=HibernateUtil.getSession(); Accountaccount1=(Account)session.get(Account.class,1010);//將account1放入緩存Accountaccount2=newAccount(); //update操作會將accont21010對象,id1010的對象 延遲加載的原理在使用延遲加載操作后,HibernateHibernateCGLIB技術(shù)(cglib.jar)新生成的一個類型(動態(tài)的在內(nèi)存中生成getter方法重寫。新生成例如:例如:publicclassFoo$$EnhancerByCGLIB$$87e5f322extendsFoo{publicStringgetName(){ *.java*.class-->-->延遲加載:javassist.jar/cglib.jar(生成新類型)-->-->Sessiongetload方法的區(qū)別不同點:①get是立刻加載;load,③getnull;loadObjectNotFoundException延遲加載的好處 案例:測試延遲加載publicvoidSession//load是延遲加載,foo,//session.close();//放這里報錯,session關(guān)的過早couldnotinitializeproxynoSystem.out.println(foo.getName());//System.out.println(foo.getName());//第一次調(diào)用屬性的getter方法時觸發(fā)查詢 publicvoidtest2(){ Sessionsession=HibernateUtil.getSession();Foofoo=(Foo)session.load(Foo.class1);//此時還沒去數(shù)據(jù)庫查詢類,由 案例:重構(gòu)NetCTOSS資費管理模塊step2HibernateCOST_CHANGprivateIntegerid;//資費privateIntegerid;//資費ID privateStringname;//資費名稱NAMEprivateIntegerbaseDuration;//包 時長BASE_DURATIONprivateFloatbaseCost;//月固定費BASE_COSTprivateFloatunitCost;//單位費用UNIT_COSTprivateStringstatus;/01:暫停;STATUSprivateStringdescr;//資費信息說明DESCRprivateDatestartTime;//啟用日期STARTTIMEprivateDatecreaTime;//創(chuàng)建時間CREATIME <idname="id"<columnname="ID"<generator<param<propertyname="name"<columnname="NAME"<propertyname="baseCosttype="java.lang.Float"><!--<columnname="BASE_COST" junitCopyTracestep32.3step6HibernateUtilstep4CostDAODAOpublicvoiddelete(intid)throwsDAOException{Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Costcost=new publicList<Cost>findAll()throwsDAOException{Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Stringhql="from QueryListlist=query.list(); returnlist; publicList<Cost>findAll(intpage,introwsPerPage)throwsDAOException{Transactiontx=session.beginTransaction(); Stringhql="fromCost";Queryquery=session.createQuery(hql);query.setFirstResult(start);//設(shè)置抓取記錄的起點,0開始() returnlist; publicCostfindById(Integerid)throwsDAOException{Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Cost Stringname=cost.getName(); returncost; publicCostfindByName(Stringname)throwsDAOException{//select*fromCOST_CHANGwhereNAME=?Stringhql="fromCostwherename=?";Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Queryquery=session.createQuery(hql);query.setString(0,name);//注意Hibernate0 returncost; publicintgetTotalPages(introwsPerPage)throwsDAOException{//selectcount(*)fromStringhql="selectcount(*)fromCost";//類名Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Queryquery=session.createQuery(hql); Objectobj=query.uniqueResult();inttotalRows=Integer.parseInt(obj.toString()); return}else}else return }publicvoidsave(Costcost)throwsDAOException{Sessionsession=HibernateUtil.getSession();}publicvoidupdate(Costcost)throwsDAOException{SessionCostcost1=(Cost)session.get(Cost.class,cost.getId()); privatestaticprivatestaticCostDAOcostDAO=newJavaWeb程序中如何用延遲加載操作(OpenSessionInView)*.action-->Action-->DAO(延遲API)-->JSP(利用或EL獲取數(shù)據(jù),會觸發(fā)延遲加載數(shù)據(jù))-->HTML頁面給瀏覽器。DAOSessionSessionJSP(把Session的關(guān)閉延View組件運行完之后這種模式被稱為OpenSessionInView。3)OpenSessionInView和ThreadLocal:OpenSessionInViewSessionSession,SessionThreadLocal(keyMap<property<propertypublicclassHibernateUtil{privatestaticSessionFactoryprivatepublicclassHibernateUtil{privatestaticSessionFactoryprivatestaticThreadLocal<SessionsessionLocalnewThreadLocal<Session>();static{//static塊中,否則耗費資源Configurationconf=newConfiguration();conf.configure("/hibernate.cfg.xml");//加載主配置hibernate.cfg.xmlsf=conf.buildSessionFactory();//獲取SessionFactory /**sessionThreadLocalsession與當(dāng)前線程綁定*/publicstaticSessiongetSession(){ Sessionsession=sessionLocal.get();session 器}/**sessionpublicstaticvoidcloseSession(){ Sessionsession=sessionLocal.get(); session.close();//關(guān)閉session和釋放ThreadLocal空間 /**publicstaticvoidmain(String[]Sessionsession1=HibernateUtil.getSession();Sessionsession2= {//public{//publicStringintercept(ActionInvocationarg0)throwsException{Sessionsession=HibernateUtil.getSession(); try{arg0.invoke();//執(zhí)行action、result return}catch(Exceptione){ tx.rollback();//回滾事務(wù)System.out.println("回滾事務(wù)"); throwe;//受 Interceptor類影響必須拋異常}finally{HibernateUtil.closeSession();// <interceptorname="opensessioninview" <interceptorname="opensessioninview" <!--定義全 (struts-cost.xml中有效)JavaSession全部刪除。Filterpublicpublicvoid}SpringAOP六、關(guān)聯(lián)映射AccountaccountAccount)session.get(Account.classAccountaccountAccount)session.get(Account.class1);//取到用戶信息Stringhql="fromServiceswheres.accountId=1";Queryquerysession.createQuery(hql);//取到用戶對應(yīng)的服務(wù)List<Item>list=query.list();一對多關(guān)系one-to-hibernate.cfg.xmlhbm.xml映射文件。ServiceprivateServiceprivateSet<Service>services=newstep3OneAccount.hbm.xml映射文件中,加入Set節(jié)點的映射<set<setname="屬性名關(guān)聯(lián)條件,columnACCOUNT<!--指定采用一對多關(guān)系,class指定關(guān)聯(lián)的類型<one-to-manyclass="要關(guān)聯(lián)的另一方(N方<!--<!--servicesservice<!--是list集合用<list set集合用<set <set<keycolumn="ACCOUNT_ID"></keyACCOUNT_IDService<one-to-manystep45.174)step1HibernateUtilpublicvoidSessionpublicvoidSession,/**ServiceStringhql="fromServicewhereACCOUND_ID=1011";hql了*/Set<Service>services=account.getServices();//SQL查詢for(Services:services){ 多對一關(guān)系many-to-hibernate.cfg.xmlhbm.xml映射文件。step2ServiceAccountNAccountAccount注意事項:ServiceaccountIdget/set方法也刪,Service的映射文件對應(yīng)的描述也刪!否則報錯:org.hibernate.MapException:Repeatedcolumninmapforentity:org.tarena.entity.Servicecolumn:ACCOUNT_IDstep3NService.hbm.xml映射文件中描述account屬性<many-to-onename="屬性名"class="要關(guān)聯(lián)的另一方類型Account"<many-to-onename="屬性名"class="要關(guān)聯(lián)的另一方類型Account" <!--指明外鍵字段,不寫主鍵--><!--<!--描述account,采用多對一關(guān)系加載<many-to-onename="account"class="org.tarena.entity.Account" <!--指明外鍵字段,不寫主鍵-->step45.174)step1HibernateUtilpublicvoidSessionpublicvoidSessionSystem.out.println(service.getOsUsername());//SQL查詢 System.out.println(service.getAccount().getId());//第二次SQL查詢 多對多關(guān)聯(lián)映射many-to-答:Hibernate會自動的通過已經(jīng)映射的表,進(jìn)行關(guān)系表操作。6.4節(jié)。RoleprivateSet<Role>roles=newRoleprivateSet<Role>roles=newstep2Admin.hbm.xml中定義屬性的映射描述<set<setname="關(guān)聯(lián)屬性名table="中間的關(guān)系表<!--描述<!--描述rolesRole<setname="roles"<keypublicvoidtestFind(){//SessionAdminadmin=(Admin)session.get(Admin.class,1001); >for(Rolerole:roles){ System.out.println(role.getId()+""+role.getName()); Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Adminadmin=newAdmin(); admin.setName("常1"); Rolerole1=(Role)session.load(Role.class20);//ID20, publicvoidtestDelete(){ Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();, adminprivateSet<Admin>admins=new<!--admin<!--admin<setname="admins"<keycolumn="ROLE_ID"></key><!--與admin.hbm.xml 關(guān)聯(lián)操作(查詢joinfetch/級聯(lián)cascade)SQL加載關(guān)系表數(shù)據(jù)。如果需要將關(guān)聯(lián)數(shù)據(jù)與主對象一起加載(SQL查詢合成一SQL查詢,可以采用下面的方法:①在hbm.xml(下例是在Account.hbm.xml中使用lazy="false"不推薦用因為影響的映射范圍太廣,推薦使用HQL<setname="services"lazy="false"表中字段<one-to-many/**我們期望:當(dāng)執(zhí)行(Account)session.get(Account.class,1001);語句,取出Account/**我們期望:當(dāng)執(zhí)行(Account)session.get(Account.class,1001);語句,取出Account后,在屬性services已經(jīng)填充了所有的服務(wù)項service publicvoidtest1(){ Sessionsession=HibernateUtil.getSession();Accountaccount=(Account)session.get(Account.class,1011);Set<Serviceservices=account.getServices();//lazy="true"默認(rèn)值,則報錯for(Services:services){System.out.println(s.getId()+""+s.getOsUsername()+""+s.getUnixHost()); /**TestOneToManypublicpublicvoidSessionStringhql="fromAccountajoinfetcha.serviceswherea.id=?";//SQL查詢Queryquery=session.createQuery(hql);query.setInteger(0,1011); Accountaccount=(Account)query.uniqueResult();System.out.println(account.getRealName());System.out.println(account.getIdcardNo());Set<Service>services=account.getServices();for(Service /**TestManyToOne}publicvoid SessionStringhql="fromServicesjoinfetchs.accountwheres.id=?";//SQLQueryquery=session.createQuery(hql);Serviceservice=(Service)query.uniqueResult(); cascade屬加和更新④All:級聯(lián)添加、刪除、更新……等。案例:級聯(lián)增加:<setname="services"<setname="services"<key<one-to-manyAccountaccount=newAccount();//一個Account,簡單操作:只把非空列設(shè)置上 Serviceservice1=newService();//兩個Service,簡單操作:只把非空列設(shè)置上Serviceservice2=newService();//同理/**serivce1service2account.servicesservice,同時Hibernate會檢測,新增數(shù)據(jù)若是services中的原有的,則不往數(shù)據(jù)庫添加*/ Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction(); inverseIDSERVICE_CHANGACCOUNT_IDupdate語句,因為當(dāng)前添加了一個Account和兩個Service,所以O(shè)ne方要兩個Service,即兩個update語句。如果數(shù)據(jù)量很大,則要N個Service,則有N個updata語句,此時updateAccount.hbm.xml例如:<setname="servicesinverse="true例如:<setname="servicesinverse="truemany一方(One方放棄,Many方。能起到一定的優(yōu)化作用。publicvoid 完整性約束*/Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Accountaccount=(Account)session.load(Account.class,500);//應(yīng)該先查找 Hibernate級聯(lián)刪除的缺點:deleteid(主鍵)一條一條刪的,不是按關(guān)系字段Hibernate的級聯(lián)刪除,簡單方便些。deletefromAccountwhere deletedeletefromAccountwhere deletefromServicewhere級聯(lián)刪除,不寫inverse="true",且數(shù)據(jù)庫中SERVICE_CHANG表中的ACCOUNT_IDNOTNULLupdate,會設(shè)置ACCOUNT_ID=null,那么將與數(shù)據(jù)庫!報錯!所以,應(yīng)當(dāng)加上繼承關(guān)系映射"" CREATETABLEBOOK( WORD_NUMBERVARCHAR2(20),TOTAL_PAGEVARCHAR2(20) BRANDVARCHAR2(20),TYPEVARCHAR2(1),COLORVARCHAR2(50), 有ID、名字、價格、產(chǎn)品。例如:publicclassBookextendsProduct、publicclassCar例如:publicclassBookextendsProduct、publicclassCarextendsProduct{ <idname="id"type="integer"<generatorclass="sequence"><!--指定序列<param<property<propertyname="name"type="string" ><!--BookProduct<!--:繼承哪個父類。<joined-subclassname="org.tarena.entity.Book"table="BOOK"<keycolumn="ID"></key>BOOK表中哪個字段與PRODUCT<!--這里不自動增長,HibernateProduct中的主鍵值拿過來<propertyname="author"type="string" BookProduct<joined-subclassname="org.tarena.entity.Car"table="CAR"這里不自動增長,HibernateProduct中的主鍵值拿過來<propertyname="brand"type="string"publicvoidtestAddBook(){ Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction(); Bookbook=newBook();book.setName("常的書");//設(shè)置product屬性 book.setAuthor("常");//設(shè)置book屬性 publicvoid SessionBookbook=(Book)session.load(Book.class,1); publicvoidtestDeleteBook(){ Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction(); publicvoidtestAddCar(){ Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Carcar=newCar();//product信 car.setType("J");//J轎車K卡publicvoid}SessionStringhql="fromBook";//fromcar為所有汽車,fromproductQueryquery=session.createQuery(hql); List<Book>books=query.list();for(Bookbook:books){System.out.println(book.getId()+""+book.getName());} 七、Hibernate查詢方法HQL查詢HibernateQueryLanguageHQLHQL語句是面向?qū)ο蟮囊环N查詢語言。HQLHibernate映射之后的實體類型和屬性HQLSQL的相同點in、notin、between...and、isnull、isnotnull、like、or都支持分組統(tǒng)計函數(shù)count、max、min、avg、sumHQLSQL的不同點HQL區(qū)分大小寫(除了關(guān)鍵字外HQLselect*寫法。4)HQLjoin...onon子句。5)HQL不能使用數(shù)據(jù)庫端的函數(shù)。注意事項:HQLselectcount(*)HQL典型案例step1Account實體、Account.hbm.xml、hibernate.cfg.xmlstep2TestHQLHQL。查詢操作可不寫事務(wù)控制語句。 //SQL:select*from Stringhql="fromSession Queryfor(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} //SQL:select*fromACCOUNT_CHANGwhereREAL_NAMElike//andXXorStringhql="fromAccountwhererealNamelike//Stringhql="fromAccountwhererealNameliken";//Sessionsession=HibernateUtil.getSession(); Queryquery=session.createQuery(hql);query.setString(0,"zhang%");//方式一:設(shè)置查詢參數(shù),從0開始表示第一個?//zhang_表示以zhang開頭的兩個字名字for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} publicvoidtest3(){//查詢部分字段Stringhql="selectid,realName,idcardNofromSession Query屬性的個數(shù)、順序一致!注意事項:Object數(shù)組!*/List<Object[]>list=query.list();[] //SQL:selectID,REAL_NAME,IDCARD_NOfromACCOUNT_CHANGpublicvoidtest4(){//查詢部分字段方式二的使用?;蛘邔憘€新的實體類也可以。*/Session QueryList<Account>for(Accounta:list){//注意:顯示其他屬性將會是初始值System.out.println(a.getIda.getRealNamea.getIdcardNo());} publicAccount(IntegerpublicAccount(Integerid,StringrealName,String }step4Account.hbm.xml中添加HQL語句,step5<!--和class是平級的!一個 寫一個HQL語句--<queryname="findAll"><!--起個名字-publicpublicvoidtest5(){//HQLhbm.xmlSession//session.getNamedQuery()hbm.xml中找HQLQueryquery=session.getNamedQuery("findAll");for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} publicvoidtest6(){//Stringhql="fromAccount"; Sessionsession=HibernateUtil.getSession();Queryquery=session.createQuery(hql);,0List<Accountlist=query.list();//如果查詢出多條結(jié)果for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} /**SQL:selectfromSERVICE_CHANGsjoinACCOUNT_CHANGaon(a.ID=s.ACCOUNT_ID)*/publicvoidtest7(){//對象關(guān)聯(lián)查詢//hql"selects.id,s.osUsername,s.unixHost,a.realName,a.idcardNo**//hqlfromServicesjoins.accountaon//hqlfromAccountajoina.servicess有其他屬性,不能“.”出來*/hql+="selects.id,s.osUsername,s.unixHost,s.account.realName,s.account.idcardNo";hql+="fromServices";//onService中有accountSessionsession=HibernateUtil.getSession(); Queryquery=session.createQuery(hql);List<Object[]>list=query.list();for(Object[]objs:list){System.out.println(objs[0]+""+objs[1]+""+objs[2]+"+objs[3]+" (FIRST_NAMEVARCHAR2(20),LAST_NAMEVARCHAR2(20),AGENUMBER);ALTERTABLE ADDCONSTRAINT 表//privateStringfirstName; private//privateStringfirstName; privateStringlastName; Keyid;//主屬性privateInteger ……get/set/**必須實現(xiàn)Serializable否則load、getSerializablepublic Keyimplements<class<class<!--聯(lián)合主鍵"<composite-idname="id" <!--主鍵自動生成這里就不適合了,要通過程序操作<key-propertyname="firstName"type="string"<key-propertyname="lastName"type="string"<propertyname="age"type="integer"privateString privateString ……get/set方 Criteria查詢 Listpublicvoidtest1(){//沒有任何子句 Sessionsession=HibernateUtil.getSession();Criteriac=session.createCriteria(Account.class); List<Account>list=c.list();for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} publicvoidtest2(){//模糊查詢 Sessionsession=HibernateUtil.getSession();Criteriac=session.createCriteria(Account.class);c.add(Restrictions.like("realName","zhang%")); List<Account>list=c.list();for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} publicvoidtest3(){//Sessionsession=HibernateUtil.getSession();Criteriac=session.createCriteria(Account.class);//c.add(Restrictions.like("realNamezhang%")); Restrictions.eq("idcardNo"," List<Account>list=c.list();for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo()); NativeSQLSQL查詢SQLQuerySQLQuery[]>SQL。publicvoidtest1(){//Stringsql="selectpublicvoidtest1(){//Stringsql="select*fromACCOUNT_CHANG";Sessionsession=HibernateUtil.getSession();SQLQueryquery=session.createSQLQuery(sql); List<Object[]>for(Object[]objs:list){System.out.println(objs[0]+""+objs[1]+""+objs[2]);} publicvoidtest2(){//test1Stringsql="select*fromACCOUNT_CHANG";Sessionsession=HibernateUtil.getSession();SQLQueryquery=session.createSQLQuery(sql);的,部分字段不行) List<Account>list=query.list();for(Accounta:list){ System.out.println(a.getId()+""+a.getRealName()); 八、Hibernate高級特性二級緩存SessionFactorySessionFactoryFactory創(chuàng)建的Session都可以二級緩存。ehcache-1.2.3.jar。二級緩存開啟方法及測試step1ehcache-1.2.3.jarsrc下添加ehcache.xml<diskStorepath="java.io.tmpdir"/><!--<diskStorepath="java.io.tmpdir"/><!-- maxElementsInMemory="2000"<!-- <!--緩存對象的有效期,true為永久存在--> <!--空閑時間某個對象空閑超過20秒則清出二級緩存--> <!--某個對象生存了120秒,則自動清出二級緩存--> <!--<!--開啟二級緩存<propertyJDBC<propertyname="vider_class">中<!--<!--:指明用哪組參數(shù)緩存<cacheusage="read-only"<idname="id"type="integer"publicvoidtest1(){//查詢一次,一級緩存的作用Sessionsession=HibernateUtil.getSession();} test1開啟二級緩存后,只查詢一次二級緩存管理方法二級緩存的使用環(huán)境查詢緩存查詢緩存開啟方法及測試<!--<property<!--<propertystep3:創(chuàng)建TestQueryCache類,用于測試查詢緩存,并在執(zhí)行query.list()方法前,設(shè)置publicvoidtest1(){//當(dāng)傳入的參數(shù)相同時,只執(zhí)行一次查詢。不同時執(zhí)行兩次查詢show("zhang%");System.out.println(""); privatevoidshow(StringStringhql="fromAccountwhererealNamelike/**看SQL不看HQL,SQL相同則從查詢緩存中取,不一樣則數(shù)據(jù)庫查詢*/Sessionsession=HibernateUtil.getSession();Queryquery=session.createQuery(hql);query.setString(0,name);此次SQL,將結(jié)果集返回。未執(zhí)行過,去數(shù)據(jù)庫查詢,并將SQL和結(jié)果存入緩存*/ >for(Account}}查詢緩存
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版環(huán)保物流綠色包裝運輸合同規(guī)范3篇
- 二零二五版?zhèn)€人房產(chǎn)抵押貸款債權(quán)轉(zhuǎn)讓合同3篇
- 二零二五版財務(wù)會計崗位聘用合同9篇
- 二零二五版智能家居股份制合作合同范本3篇
- 二零二五年度鋼結(jié)構(gòu)工程鋼筋加工與配送合同范本3篇
- 二零二五版工業(yè)4.0工廠生產(chǎn)承包服務(wù)合同模板3篇
- 二零二五年房產(chǎn)共有權(quán)份額轉(zhuǎn)讓產(chǎn)權(quán)買賣合同范本含份額調(diào)整方案3篇
- 二零二五版?zhèn)€人承包公司物流運輸合作合同書6篇
- 二零二五版安徽省勞動合同解除爭議調(diào)解服務(wù)合同2篇
- 二零二五年度能源股權(quán)轉(zhuǎn)讓居間服務(wù)合同范本2篇
- 大型活動聯(lián)合承辦協(xié)議
- 工程項目采購與供應(yīng)鏈管理研究
- 2024年吉林高考語文試題及答案 (2) - 副本
- 拆除電纜線施工方案
- 搭竹架合同范本
- Neo4j介紹及實現(xiàn)原理
- 焊接材料-DIN-8555-標(biāo)準(zhǔn)
- 工程索賠真實案例范本
- 重癥醫(yī)學(xué)科運用PDCA循環(huán)降低ICU失禁性皮炎發(fā)生率品管圈QCC持續(xù)質(zhì)量改進(jìn)成果匯報
- 個人股權(quán)證明書
- 醫(yī)院運送工作介紹
評論
0/150
提交評論