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

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

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

    posts - 3, comments - 13, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
    在暑假里看了“Refactoring to Patterns”這本書,覺得很不錯。里邊講到了很多在優化編碼時可以用到的設計模式以及它們的用法。
        我在編程時,一般都是用Spring作為中間層管理資源,而用Hibernate作為ORM。用過Spring的人都知道Spring對Hibernate的支持方法較多,我常用的是直接繼承HibernateDaoSupport類。我們先來看一個類圖:
    Dao Class Diagram
    在是我在應用中常用到的類結構。因為對于一個域模型來說,最基本的就是CRUD操作,所以將其放在Dao接口中,但是對于每個不同的域模型又有其特有的方法,則將其放在域模型對應的接口(SomeSpecificDao)中。
        這樣,對于最基本的CRUD操作就可以只需在BaseHibernateDao中實現,這一點利用了Template Method設計模式。對于create(), delete()和modify()三個方法都可以簡單實現,即調用HibernateTemplate中相應的方法。對于findAll和findById,則可以借住Java的反射來實現。這里如果要利用反射且達到通用的目的,就需要將所有的域模型放在一個包中,并且有相同的命名規則,比如說如果域模型叫做User,那么相應的Dao應該以User開頭,不過這也是常用的方法。下面給出一小段代碼
    /**
         * A convenience and generic method for retrieving all models from the database
             * @throws DataAccessException
         */

        
    public List findAll() throws DataAccessException {
            
    // TODO Auto-generated method stub
            List models = new ArrayList();
            
    try {
                models 
    = getHibernateTemplate().loadAll(
                        Class.forName(getClass().getName().replaceAll(
                                
    "HibernateDao""").replaceAll("dao.hibernate",
                                
    "model")));
            }
     catch (ClassNotFoundException exception) {
                
    // TODO Auto-generated catch block
                exception.printStackTrace();
            }

            
    return models;
        }
        以上給出的是findAll的實現,findById也是一樣。這樣一來,就無需再在子類中重復編寫CRUD算法的實現了。
         再有就是在編寫子類Dao中特有的find方法,因為利用HibernateTemplate中的execute方法來實現,所以可以在BaseHibernateDao這個父類中編寫一個protected的方法,以便子類Dao調用,這個方法中包含了調用HibernateTemplate中execute方法的代碼:
    /**
         * Covenience method for retrieving objects by HQL
         
    */

        
    protected Query find(final String query)
                
    throws DataAccessException {
            Query aQuery 
    = (Query) getHibernateTemplate().execute(
                    
    new HibernateCallback() {
                        
    public Object doInHibernate(Session session) {
                            
    return session.createQuery(query);
                        }

                    }
    );
            
    return aQuery;
        }
         這樣在子類Dao中就可以直接調用該find方法來實現,而不必每次都編寫繁瑣的execute方法。
         以上的方法我都做過測試,在實現和應用中沒有問題。在效率上可能會比在子類中實現要差一點,因為find*方法中用到了Java的反射,對效率會一定的影響,這是缺點之一。如果有哪位有更好的辦法,請在評論中寫出,歡迎大家進行評判,謝謝……

    評論

    # re: 關于Spring中利用Hibernate作為DAO的簡化  回復  更多評論   

    2008-01-11 09:17 by yf
    冒昧問一下,我用.hibernateSynchronizer3生成的DAO中為什么沒有findById(),findByExample()等函數,只有findAll()啊?謝謝

    # re: 關于Spring中利用Hibernate作為DAO的簡化  回復  更多評論   

    2008-01-11 09:18 by yf
    MSN:yellow.flying@hotmail.com有時間請教一下

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


    網站導航:
     
    主站蜘蛛池模板: 国产亚洲成归v人片在线观看| 性xxxxx免费视频播放| 亚洲成av人片天堂网老年人| 美女视频黄免费亚洲| 成人免费视频观看无遮挡| 亚洲第一区二区快射影院| 国产美女无遮挡免费网站| 国产亚洲美女精品久久| 亚洲国产日韩成人综合天堂| 一级毛片**免费看试看20分钟| 国产精品亚洲精品日韩已方| 中文字幕在线免费看| 亚洲AV无码一区二区三区系列| 久久成人免费大片| 亚洲综合视频在线观看| 美女视频黄的全免费视频 | 亚洲三区在线观看无套内射| caoporm碰最新免费公开视频 | 亚洲国产综合专区电影在线| 国产一级片免费看| 亚洲精品中文字幕麻豆| 成年女人免费视频播放体验区| 亚洲A∨精品一区二区三区下载| 亚洲国产午夜福利在线播放 | 三年片免费观看大全国语| 亚洲av女电影网| 无码区日韩特区永久免费系列| 亚洲乱码中文字幕在线| 久久亚洲2019中文字幕| 99re在线视频免费观看| 亚洲最大天堂无码精品区| 亚洲伦乱亚洲h视频| 67194成手机免费观看| 最新亚洲人成无码网站| 亚洲AV无码精品色午夜在线观看| 亚洲精品动漫免费二区| 一级午夜免费视频| 亚洲视频一区二区三区四区| 亚洲精品无码久久毛片| 和日本免费不卡在线v| 亚洲天堂免费在线视频|