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://www.aygfsteel.com/szhswl
          ------------------------------------------------------------------------------------------------------ ----------------- ---------
          posted on 2007-12-05 18:49 宋針還 閱讀(398) 評論(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;屬性也就沒用了,不知道為什么加上,有其它目的?  回復  更多評論
            

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


          網站導航:
           
          主站蜘蛛池模板: 淮滨县| 若尔盖县| 宁陵县| 定陶县| 侯马市| 浦北县| 仪陇县| 平乐县| 开封县| 海林市| 斗六市| 鹤庆县| 商水县| 吉林省| 永胜县| 卢氏县| 浑源县| 南乐县| 宜兰市| 武陟县| 疏勒县| 汤阴县| 镇原县| 巢湖市| 思南县| 库车县| 惠安县| 吉首市| 德格县| 五峰| 喀喇沁旗| 安化县| 徐闻县| 济源市| 登封市| 伊春市| 广西| 临沧市| 红安县| 南安市| 清原|