日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Hibernate的重要技術(shù)簡(jiǎn)介

Hibernate技術(shù)有很多值得學(xué)習(xí)的地方,這里我們主要介紹Hibernate技術(shù)的一些強(qiáng)大功能,包括Hibernate技術(shù)技術(shù)開(kāi)發(fā)流程等方面。

專業(yè)領(lǐng)域包括成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、成都商城網(wǎng)站開(kāi)發(fā)、微信營(yíng)銷、系統(tǒng)平臺(tái)開(kāi)發(fā), 與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開(kāi)發(fā)公司不同,創(chuàng)新互聯(lián)公司的整合解決方案結(jié)合了幫做網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營(yíng)銷的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。

Hibernate技術(shù)開(kāi)發(fā)流程:

1.配置文件:

@.properties格式的

@.xml格式的(常用hibernate.cfg.xml)(放在src下面或者是wen-inf\classes下面)

 
 
 
  1. SessionFactory sf=new Configuration().configure().buildSessionFactory();  
  2.  
  3.    或者SessionFactory sf=new Configuration().configure("db.cfg.xml").buildSessionFactory();   

2.編寫(xiě)映射文件:

例如:User.hbm.xml 映射文件的編寫(xiě)有很多內(nèi)容,可以采用相關(guān)的根據(jù)自動(dòng)生成映射文件,在這里就不介紹了

3.寫(xiě)持久化類:

例如:User.java

4.在編寫(xiě)DAO之前先寫(xiě)HibernateSessionFactory類

 
 
 
  1. package com.wuxiaoxiao.hibernate;  
  2. import org.hibernate.Session;  
  3. import org.hibernate.HibernateException;  
  4. import org.hibernate.cfg.Configuration;  
  5. public class HibernateSessionFactory{  
  6. private static final String CONFIG_FILE_LOCATION="/hibernate.cfg.xml";  
  7. private static final ThreadLocal threadLocal=new ThreadLocal();  
  8. private static final Configuration cfg=new Configuration();  
  9. private static org.hibernate.SessionFactory sessionFactory;  
  10. //取得session  
  11.  
  12. public static Session currentSession()throws HibernateException{  
  13. Session session=threadLocal.get();  
  14. if(session==null){  
  15.    if(sessionFactory==null){  
  16.       try{  
  17.        cfg.configuration(CONFIG_FILE_LOCATION);  
  18. sessionFactory=cfg.buildSessionFactory();  
  19.       }catch(Exception e){  
  20.         System.err.println("%%%Error Creating SessionFactory %%%%");  
  21. e.printStackTrace();  
  22.       }   
  23.    }  
  24. session=sessionFactory.openSession();  
  25. threadLocal.set(session);  
  26. }  
  27. return session;  
  28. }   
  29. //關(guān)閉session  
  30.  
  31. public static void closeSession()throws HibernateException{  
  32. Session session=(Session)threadLocal.get();  
  33. threadLocal.set(null);  
  34. if(session!=null)  
  35.   session.close();  
  36. }  
  37. }  

threadLocal是thread local variable,為每一個(gè)訪問(wèn)它的線程都提供一個(gè)變量值的副本,是每一個(gè)線程都可以獨(dú)立的改變自己的副本,而不會(huì)和其他線程的副本沖突。ThreadLocal有三個(gè)主要的方法:initValue()初始化變量值,get(),set(Object)例子:

 
 
 
  1. public class ConnectionFactory{  
  2. private fianl String URL="jdbc:mysql://localhsot/mysatabase";  
  3. private static ThreadLocal connectionHolder=new ThreadLocal(){  
  4. public COnnection initValue(){  
  5. try{  
  6. return DriverManager.getConnection(URL);}catch(Exception e){}  
  7. }  
  8. };  
  9. public Connection getConnection(){  
  10. return connectionHolder.get();  
  11. }  
  12. }  

5.編寫(xiě)DAO例如:

 
 
 
  1. public User getUser(String username)throws HibernateException{  
  2. Session session=null;  
  3. Transaction tx=null;  
  4. User user=null;  
  5. try{  
  6. session=HibernateSessionFactory.currentSession();  
  7. tx=session.beginTransaction();  
  8. Query query=session.createQuery("from User where username=?");  
  9. query.setString(0,username.trim());  
  10. user=(User)query.uniqueResult();  
  11. query=null;  
  12. tx.commit();  
  13. }catch(HibernateException e){throw e;  
  14. }finally{  
  15. if(tx!=null)  
  16.   tx.rollback();  
  17. HibernateSessionFactory.closeSession();  
  18. }  
  19. return user;  
  20. }  

6.編寫(xiě)service類

public boolean valid(String username,String password){}

下面主要介紹session操縱數(shù)據(jù)庫(kù)@對(duì)象的狀態(tài):

Hibernate定義并支持下列對(duì)象狀態(tài)(state):

瞬時(shí)(Transient) - 由new操作符創(chuàng)建,且尚未與Hibernate Session 關(guān)聯(lián)的對(duì)象被認(rèn)定為瞬時(shí)(Transient)的。瞬時(shí)(Transient)對(duì)象不會(huì)被持久化到數(shù)據(jù)庫(kù)中,也不會(huì)被賦予持久化標(biāo)識(shí)(identifier)。 如果瞬時(shí)(Transient)對(duì)象在程序中沒(méi)有被引用,它會(huì)被垃圾回收器(garbage collector)銷毀。 使用Hibernate Session可以將其變?yōu)槌志?Persistent)狀態(tài)。(Hibernate會(huì)自動(dòng)執(zhí)行必要的SQL語(yǔ)句)

持久(Persistent) - 持久(Persistent)的實(shí)例在數(shù)據(jù)庫(kù)中有對(duì)應(yīng)的記錄,并擁有一個(gè)持久化標(biāo)識(shí)(identifier)。 持久(Persistent)的實(shí)例可能是剛被保存的,或剛被加載的,無(wú)論哪一種,按定義,它存在于相關(guān)聯(lián)的Session作用范圍內(nèi)。 Hibernate會(huì)檢測(cè)到處于持久(Persistent)狀態(tài)的對(duì)象的任何改動(dòng),在當(dāng)前操作單元(unit of work)執(zhí)行完畢時(shí)將對(duì)象數(shù)據(jù)(state)與數(shù)據(jù)庫(kù)同步(synchronize)。 開(kāi)發(fā)者不需要手動(dòng)執(zhí)行UPDATE。將對(duì)象從持久(Persistent)狀態(tài)變成瞬時(shí)(Transient)狀態(tài)同樣也不需要手動(dòng)執(zhí)行DELETE語(yǔ)句。

脫管(Detached) - 在數(shù)據(jù)庫(kù)中存在記錄,但不與session關(guān)聯(lián)!與持久(Persistent)對(duì)象關(guān)聯(lián)的Session被關(guān)閉后,對(duì)象就變?yōu)槊摴?Detached)的。 對(duì)脫管(Detached)對(duì)象的引用依然有效,對(duì)象可繼續(xù)被修改。脫管(Detached)對(duì)象如果重新關(guān)聯(lián)到某個(gè)新的Session上, 會(huì)再次轉(zhuǎn)變?yōu)槌志?Persistent)的(在Detached其間的改動(dòng)將被持久化到數(shù)據(jù)庫(kù))。 這個(gè)功能使得一種編程模型,即中間會(huì)給用戶思考時(shí)間(user think-time)的長(zhǎng)時(shí)間運(yùn)行的操作單元(unit of work)的編程模型成為可能。 我們稱之為應(yīng)用程序事務(wù),即從用戶觀點(diǎn)看是一個(gè)操作單元(unit of work)

@使用sve()保存對(duì)象,使之成為持久化

 
 
 
  1. Session session=HibernateSessionFactory.currentSession();  
  2. User user=new User();  
  3. user.setName("wuxiaoxiao");  
  4. user.setPassword(123456);  
  5. session.save(user);  

@使用load()裝在對(duì)象

 
 
 
  1. User user=(User)session.load(User.class,new Integer(1));  

若對(duì)象不存在就會(huì)拋出無(wú)法修復(fù)的異常

@使用get()裝在對(duì)象

 
 
 
  1. User user=(User)session.get(User.class,new Integer(4));  

若對(duì)象不存在的話,就返回null @使用flush()強(qiáng)制提交刷新

 
 
 
  1. User user=(User)session.get(User.class,new Integer(4));  
  2. user.setUsername("ranran");  
  3. user.setPassword("123456");  
  4. session.flush();  
  5.    

對(duì)user的更新是在同一個(gè)session中,不需要用update()或者saveOrUpdate()

@使用delete()移除持久化對(duì)象

 
 
 
  1. User user=(User)session.get(User.class,new Integer(4));  
  2. session.delete(user);  
  3. session.flush();  
  4.  

@使用update()方法提交托管狀態(tài)的對(duì)象

update()用于根據(jù)給定的托管對(duì)象實(shí)例的標(biāo)示更新對(duì)應(yīng)的持久化實(shí)例!如果傳入一個(gè)持久化對(duì)象,那么update()方法就是多余的。如果傳入臨時(shí)狀態(tài)的對(duì)象就會(huì)出錯(cuò),除非認(rèn)為的給臨時(shí)地給對(duì)象指定一個(gè)id。不管傳入的是什么狀態(tài)的對(duì)象,數(shù)據(jù)庫(kù)中必須要有一條記錄與這個(gè)對(duì)象的id相對(duì)應(yīng),否則拋出異常!

@saveOrUpdate()傳遞的對(duì)象在數(shù)據(jù)庫(kù)中若存在就更新,否則就插入!他和update()主要是處理托管狀態(tài)的對(duì)象!
 
@使用refresh()強(qiáng)制裝在對(duì)象,如果數(shù)據(jù)庫(kù)中使用了觸發(fā)器來(lái)處理對(duì)象的而某些屬性,這個(gè)方法就更有用了!

 
 
 
  1. session.save(user);  
  2. session.flush();  
  3. session.refresh(user);  

使用Transaction管理事務(wù)

例子:如上面編寫(xiě)DAO的例子 使用Query進(jìn)行HQL查詢 @不帶參數(shù)的查詢

 
 
 
  1. Query query=session.createQuery("from User");  

@帶參數(shù)的查詢

 
 
 
  1. Query query=session.createQuery("from User where username=:username");  
  2. query.setString("username","wuxiaoxiao");  
  3. 或者  
  4. List names=new ArrayList();  
  5. names.add("wuxiaoxiao");  
  6. names.add("ranran");  
  7. Query query=session.createQuery("from User where username in (:namelist)");  
  8. query.setParameterList("namelist",names);  
  9. 或者  
  10. Query query=session.createQuery("from User where username=?");  
  11. query.setSrting(0,"wuxiaoxiao");  

@取得list結(jié)果集

 List list=query.list();

@取得迭代列表結(jié)果集

 
 
 
  1. Iterator iterator1=query.iterator();  
  2. 或者  
  3. Iterator iterator2=query.list().iterator();  
  4. while(iterator.hasNext())  
  5.  User user=(User)iterator2.next();  

@取得一個(gè)對(duì)象

 
 
 
  1. Query query=session.createQuery("from User where username=?");  
  2. query.setString(0,"wuxiaoxiao");  
  3. User user=(User)query.uniqueResult();  
  4.    

@標(biāo)量查詢

 
 
 
  1. Iterator results = sess.createQuery(  
  2.         "select user.name,count(user.email) from User user " +  
  3.         "group by user.name")  
  4.         .list()  
  5.         .iterator();  
  6.           
  7. while ( results.hasNext() ) {  
  8.     Object[] row = (Object[]) results.next();  
  9.     String type = (String) row[0];  
  10.     Integer count = (Integer) row[1];  
  11.     .....  

@分頁(yè)查詢

 
 
 
  1. Query q = sess.createQuery("from DomesticCat cat");  
  2. q.setFirstResult(20);  
  3. q.setMaxResults(10);  
  4. List cats = q.list(); 

@創(chuàng)建sql查詢

使用Criteria進(jìn)行條件查詢

  略.............


名稱欄目:Hibernate的重要技術(shù)簡(jiǎn)介
鏈接URL:http://m.5511xx.com/article/dpcohjg.html