<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;屬性也就沒用了,不知道為什么加上,有其它目的?  回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 国内精品乱码卡1卡2卡3免费| 日韩电影免费在线观看| 亚洲人成网站18禁止| 亚洲熟妇无码八V在线播放| 一区二区三区免费在线观看| 日韩电影免费在线观看网站| 57pao国产成视频免费播放 | 精品日韩亚洲AV无码| 亚洲噜噜噜噜噜影院在线播放| 久久久久久亚洲Av无码精品专口| 亚洲国产成人AV网站| 亚洲av无码无线在线观看| 97在线免费视频| 午夜男人一级毛片免费| 国产亚洲一区区二区在线| 亚洲ⅴ国产v天堂a无码二区| 中日韩亚洲人成无码网站| 免费无码一区二区三区蜜桃| 亚洲精品成人片在线观看精品字幕| 亚洲AV无码国产精品色| 久久久久久AV无码免费网站| 免费在线观看的黄色网址| 亚洲日本久久一区二区va| 韩国免费A级毛片久久| 黄页网站在线看免费| 亚洲欧洲无卡二区视頻| 一级毛片直播亚洲| 国产亚洲玖玖玖在线观看| 免费人妻无码不卡中文字幕18禁| 免费精品国自产拍在线播放| 中文字幕无码播放免费| 亚洲午夜久久久久久久久久| 美女露100%胸无遮挡免费观看| 免费无码A片一区二三区| 91亚洲va在线天线va天堂va国产 | 99亚偷拍自图区亚洲| 免费人成视频在线观看视频| 13小箩利洗澡无码视频网站免费| 亚洲一级视频在线观看| 亚洲人成色77777在线观看大| 亚洲午夜精品在线|