<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    szhswl
    宋針還的個人空間
    相信使用過Spring + Hibernate開發過的人,在寫DAO的時候都使用過Spring的HibernateDaoSupport類,然后在實現的時候就可以很輕松的使用getHibernateTemplate()方法之后就可以調用save()、delete()、update()等Hibernate的Session的操作,很簡單。比如:
      
      getHibernateTemplate().save(user);
      
      這樣一句話在我們沒有Spring的時候就必須使用如下的代碼才能完成:
      
      Session session = HibernateUtil.getSession();
      Transaction tx = session.beginTransaction();
      session.save(user);
      tx.commit();
      HibernateUtil.colseSession();
      這里還省去了異常處理,同時使用了HibernateUtil類來簡化從SessionFactory獲取Session,以及關閉Session等處理。
      
      但是我們在使用Hibernate的時候不一定會使用Spring,所以我們可以模仿Spring的處理方式,做一個Hibernate的模板,使用模板模式來簡化我們的開發,其主要的目的就是為了簡化開發,使代碼達到最大話的重用。
      
      1.我們現來實現一個Hibernate模板:
      
     1  package kick.hibernate;
     2  
     3  import net.sf.hibernate.HibernateException;
     4  import net.sf.hibernate.Session;
     5  import net.sf.hibernate.Transaction;
     6  
     7  public class HibernateTemplate{
     8  public static Object run(HibernateCallback callback) throws HibernateException{
     9  Session session = null;
    10  Transaction tx = null;
    11  try {
    12  session = HibernateSessionutil.currentSession();
    13  tx = session.beginTransaction();
    14  Object result = callback.execute(session);
    15  tx.commit();
    16  session.flush();
    17  return result;
    18  }
     catch (HibernateException e) {
    19  tx.rollback();
    20  return null;
    21  }
     finally {
    22  HibernateSessionutil.closeSession();
    23  }

    24  }

    25
      這里類很簡單,就是使用一個實現HibernateCallBack接口的一個回掉類,在調用的時候根據具體的需求實現HibernateCallBack類。
      
      2.回掉接口HibernateCallBack:
    1  package kick.hibernate;
    2  
    3  import net.sf.hibernate.HibernateException;
    4  import net.sf.hibernate.Session;
    5  
    6  public interface HibernateCallBack {
    7  Object execute(Session session)throws HibernateException;
    8  }

      
      好了,到此為止我們就可以使用這個模板了,可以用如下的方式使用:
      HibernateTemplate.run(new HibernateCallback() {
      public Object execute(Session session) throws HibernateException {
      session.save(user);
      return null;
      }
      });
      
      看看,是不是省去了很多代碼?^_^
      
      不過這還沒有達到想Spring里面那樣簡單,不要著急,“面包會有的”呵呵,我們會達到的。
      
      3.實現我們自己的HibernateSupport類:
      
      從上面的代碼可以看出,我們要自己實現HibernateCallback接口,而每次我們實現的時候又重復代碼了。因此我們再抽象,講這些實現放到我們的HibernateSupport類里面去。看看我們上面的代碼就知道我們實現HibernateCallback接口的目的就是為了調用session.save()方法,即session的方法。代碼如下:
      
     1  package kick.hibernate;
     2  
     3  import java.io.Serializable;
     4  
     5  import net.sf.hibernate.HibernateException;
     6  import net.sf.hibernate.Session;
     7  
     8  public class HibernateSupport{
     9  
    10  public Object save(final Object object) throws HibernateException{
    11  return HibernateTemplate.run(new HibernateCallBack(){
    12  
    13  public Object execute(Session session) throws HibernateException {
    14  session.save(object);
    15  return null;
    16  }

    17  
    18  }
    );
    19  }

    20  public Object save(final Object object,final Serializable id) throws HibernateException{
    21  return HibernateTemplate.run(new HibernateCallBack(){
    22  
    23  public Object execute() throws HibernateException {
    24  session.save(object,id);
    25  return null;
    26  }

    27  
    28  }
    );
    29  }

    30  
    31  public Object saveOrUpdate(final Object object) throws HibernateException{
    32  return HibernateTemplate.run(new HibernateCallBack(){
    33  
    34  public Object execute(Session session) throws HibernateException {
    35  session.saveOrUpdate(object);
    36  return null;
    37  }

    38  
    39  }
    );
    40  }

    41  ……………………………………………………………………………………
    42  ……………………………………………………………………………………
    43  ……………………………………………………………………………………
    44  

      調用一些其他的session的方法。
      
      }
      
      4.抽象RootDao:
      
      該類為抽象類,在實現自己的DAO類的時候繼承該類。該類的有一個HibernateSupport的對象,在子類中使用getHibernateTemplate()方法就可以得到該對象,然后調用它對應的方法。實現代碼如下:
      
     1  package kick.hibernate.dao;
     2  
     3  import net.sf.hibernate.Session;
     4  import kick.hibernate.HibernateTemplateImpl;
     5  
     6  public abstract class RootDao {
     7  private HibernateSupport temp = null;
     8  
     9  /**
    10  * @return Returns the temp.
    11  */

    12  public HibernateTemplateImpl getHibernateTemplate(Session session) {
    13  return new HibernateSupport();
    14  }

    15  }

      
      5.使用例子:
      
      定義一個自己的DAO類,實現代碼如下:
      
      public class UserDaoImpl extends RootDao implements UserDaoInterface{
      public void saveUser(User user) throws KickException {
      getHibernateTemplate().saveOrUpdate(user);
      }
      ……………………………………………………………………………………
      實現其他的方法
      ……………………………………………………………………………………
      }

    ---------------------------------------------------------------------------------------------------------------------------------
    說人之短,乃護己之短。夸己之長,乃忌人之長。皆由存心不厚,識量太狹耳。能去此弊,可以進德,可以遠怨。
    http://m.tkk7.com/szhswl
    ------------------------------------------------------------------------------------------------------ ----------------- ---------
    posted on 2007-12-05 18:49 宋針還 閱讀(395) 評論(2)  編輯  收藏 所屬分類: HIBERNATE

    FeedBack:
    # re: 使用模板模式簡化DAO操作Hibernate
    2008-12-25 11:26 | yangtao
    寫的很不錯 我轉載在我的blog上了 想來你會同意的吧  回復  更多評論
      
    # re: 使用模板模式簡化DAO操作Hibernate
    2011-06-24 11:10 | hoohoney
    總結的太好了,不過RootDao作為主要作用是為了可以直接來調用HibernateSupport對象,那么
    getHibernateTemplate(Session session) 方法就沒必要加參數,
    些類中的HibernateSupport temp = null;屬性也就沒用了,不知道為什么加上,有其它目的?  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 日韩高清免费观看| 免费国产一级特黄久久| 亚洲AV男人的天堂在线观看| 韩国欧洲一级毛片免费| GOGOGO免费观看国语| 亚洲综合无码一区二区三区| 岛国片在线免费观看| 最近中文字幕免费大全| 亚洲18在线天美| 国产AV无码专区亚洲AV漫画| 3344永久在线观看视频免费首页| 亚洲高清国产拍精品熟女| 日韩亚洲欧洲在线com91tv| 毛片免费全部播放一级| 两个人看的www高清免费观看| 国产成人精品日本亚洲直接| 亚洲国产日韩在线观频| 美女视频黄的全免费视频| 九九全国免费视频| 国产精品亚洲片在线va| 亚洲va中文字幕无码久久不卡| 成人免费视频软件网站| 一区二区三区福利视频免费观看| 亚洲JLZZJLZZ少妇| 亚洲成av人片不卡无码| 久久久久久久亚洲精品| 四虎影院免费在线播放| 69影院毛片免费观看视频在线| 国产精品一区二区三区免费 | 亚洲色偷偷av男人的天堂| 免费中文字幕在线观看| 免费AA片少妇人AA片直播| 久久精品私人影院免费看| 日韩精品免费一线在线观看 | 特级精品毛片免费观看| 一本一道dvd在线观看免费视频 | 日韩精品无码免费一区二区三区| 国产亚洲漂亮白嫩美女在线| 中文字幕在线观看亚洲视频| 婷婷精品国产亚洲AV麻豆不片 | 欧洲人成在线免费|