posts - 3, comments - 13, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          日歷

          <2006年3月>
          2627281234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          相冊

          收藏夾

          我喜歡的網站

          • Apache
          • Java開源倉庫之一,無話可說
          • Eclipse
          • Eclipse的官方網站,GEF,RCP,BIRT,TPTP,這些都無疑是很好的開源工具
          • 當然是Java官方啦
          • 無疑是Java愛好者的首選……
          • 我的大學
          • 我的母校,我真正學會Java的地方

          搜索

          •  

          積分與排名

          • 積分 - 5416
          • 排名 - 3015

          最新評論

          2006年3月9日

               摘要: 該文主要介紹了一個我和同學合作的項目,使將非結構化流程圖轉換成結構化流程圖的程序。  閱讀全文

          posted @ 2006-06-03 12:11 舉止優雅的豬 閱讀(2673) | 評論 (1)編輯 收藏

          在暑假里看了“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的反射,對效率會一定的影響,這是缺點之一。如果有哪位有更好的辦法,請在評論中寫出,歡迎大家進行評判,謝謝……

          posted @ 2006-03-09 10:36 舉止優雅的豬 閱讀(1068) | 評論 (2)編輯 收藏

          主站蜘蛛池模板: 寿光市| 洪泽县| 南部县| 襄垣县| 六盘水市| 定结县| 吉首市| 鄱阳县| 临猗县| 肃宁县| 尉氏县| 扶余县| 井研县| 德惠市| 三江| 平原县| 江孜县| 汤阴县| 鄂州市| 边坝县| 新竹县| 肃宁县| 磐石市| 中山市| 井研县| 高密市| 吴桥县| 兴仁县| 玉山县| 二连浩特市| 克山县| 女性| 吴桥县| 张家川| 全州县| 内丘县| 芦山县| 基隆市| 涡阳县| 元谋县| 塔河县|