• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 使用模板模式簡化DAO操作Hibernate

    發表于:2007-07-04來源:作者:點擊數: 標簽:
    "" 相信使用過Spring + Hibernate 開發 過的人,在寫DAO的時候都使用過Spring的HibernateDaoSupport類,然后在實現的時候就可以很輕松的使用getHibernateTemplate()方法之后就可以調用save()、delete()、update()等Hibernate的Session的操作,很簡單。比如:
    ""   相信使用過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模板:

    package kick.hibernate;

    import.net.sf.hibernate.HibernateException;
    import net.sf.hibernate.Session;
    import net.sf.hibernate.Transaction;

    public class HibernateTemplate{
    public static Object run(HibernateCallback callback) throws HibernateException{
    Session session = null;
    Transaction tx = null;
    try {
    session = HibernateSessionutil.currentSession();
    tx = session.beginTransaction();
    Object result = callback.execute(session);
    tx.commit();
    session.flush();
    return result;
    } catch (HibernateException e) {
    tx.rollback();
    return null;
    } finally {
    HibernateSessionutil.closeSession();
    }
    }


      這里類很簡單,就是使用一個實現HibernateCallBack接口的一個回掉類,在調用的時候根據具體的需求實現HibernateCallBack類。

      2. 回掉接口HibernateCallBack:

    package kick.hibernate;

    import net.sf.hibernate.HibernateException;
    import net.sf.hibernate.Session;

    public interface HibernateCallBack {
    Object execute(Session session)throws HibernateException;
    }


      好了,到此為止我們就可以使用這個模板了,可以用如下的方式使用:

    HibernateTemplate.run(new HibernateCallback() {
    public Object execute(Session session) throws HibernateException {
    session.save(user);
    return null;
    }
    });


      看看,是不是省去了很多代碼?

      不過這還沒有達到想Spring里面那樣簡單,不要著急,“面包會有的”,我們會達到的。
      3. 實現我們自己的HibernateSupport類
      從上面的代碼可以看出,我們要自己實現HibernateCallback接口,而每次我們實現的時候又重復代碼了。因此我們再抽象,講這些實現放到我們的HibernateSupport類里面去??纯次覀兩厦娴拇a就知道我們實現HibernateCallback接口的目的就是為了調用session.save()方法,即session的方法。代碼如下:(點擊查看clearcase/" target="_blank" >cc/05-09-19-java.txt">附件)

      4. 抽象RootDao:
      該類為抽象類,在實現自己的DAO類的時候繼承該類。該類的有一個HibernateSupport的對象,在子類中使用getHibernateTemplate()方法就可以得到該對象,然后調用它對應的方法。實現代碼如下:

    package kick.hibernate.dao;

    import net.sf.hibernate.Session;
    import kick.hibernate.HibernateTemplateImpl;

    public abstract class RootDao {
    private HibernateSupport temp = null;

    /**
    * @return Returns the temp.
    */
    public HibernateTemplateImpl getHibernateTemplate(Session session) {
    return new HibernateSupport();
    }
    }



      5. 使用例子:
      定義一個自己的DAO類,實現代碼如下:

    public class UserDaoImpl extends RootDao implements UserDaoInterface{
    public void saveUser(User user) throws KickException {
    getHibernateTemplate().saveOrUpdate(user);
    }
    …………………………………………
    實現其他的方法
    …………………………………………
    }


    ""

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>