posts - 3, comments - 13, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          在暑假里看了“Refactoring to Patterns”這本書(shū),覺(jué)得很不錯(cuò)。里邊講到了很多在優(yōu)化編碼時(shí)可以用到的設(shè)計(jì)模式以及它們的用法。
              我在編程時(shí),一般都是用Spring作為中間層管理資源,而用Hibernate作為ORM。用過(guò)Spring的人都知道Spring對(duì)Hibernate的支持方法較多,我常用的是直接繼承HibernateDaoSupport類(lèi)。我們先來(lái)看一個(gè)類(lèi)圖:
          Dao Class Diagram
          在是我在應(yīng)用中常用到的類(lèi)結(jié)構(gòu)。因?yàn)閷?duì)于一個(gè)域模型來(lái)說(shuō),最基本的就是CRUD操作,所以將其放在Dao接口中,但是對(duì)于每個(gè)不同的域模型又有其特有的方法,則將其放在域模型對(duì)應(yīng)的接口(SomeSpecificDao)中。
              這樣,對(duì)于最基本的CRUD操作就可以只需在BaseHibernateDao中實(shí)現(xiàn),這一點(diǎn)利用了Template Method設(shè)計(jì)模式。對(duì)于create(), delete()和modify()三個(gè)方法都可以簡(jiǎn)單實(shí)現(xiàn),即調(diào)用HibernateTemplate中相應(yīng)的方法。對(duì)于findAll和findById,則可以借住Java的反射來(lái)實(shí)現(xiàn)。這里如果要利用反射且達(dá)到通用的目的,就需要將所有的域模型放在一個(gè)包中,并且有相同的命名規(guī)則,比如說(shuō)如果域模型叫做User,那么相應(yīng)的Dao應(yīng)該以User開(kāi)頭,不過(guò)這也是常用的方法。下面給出一小段代碼
          /**
               * 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的實(shí)現(xiàn),findById也是一樣。這樣一來(lái),就無(wú)需再在子類(lèi)中重復(fù)編寫(xiě)CRUD算法的實(shí)現(xiàn)了。
               再有就是在編寫(xiě)子類(lèi)Dao中特有的find方法,因?yàn)槔肏ibernateTemplate中的execute方法來(lái)實(shí)現(xiàn),所以可以在BaseHibernateDao這個(gè)父類(lèi)中編寫(xiě)一個(gè)protected的方法,以便子類(lèi)Dao調(diào)用,這個(gè)方法中包含了調(diào)用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;
              }
               這樣在子類(lèi)Dao中就可以直接調(diào)用該find方法來(lái)實(shí)現(xiàn),而不必每次都編寫(xiě)繁瑣的execute方法。
               以上的方法我都做過(guò)測(cè)試,在實(shí)現(xiàn)和應(yīng)用中沒(méi)有問(wèn)題。在效率上可能會(huì)比在子類(lèi)中實(shí)現(xiàn)要差一點(diǎn),因?yàn)閒ind*方法中用到了Java的反射,對(duì)效率會(huì)一定的影響,這是缺點(diǎn)之一。如果有哪位有更好的辦法,請(qǐng)?jiān)谠u(píng)論中寫(xiě)出,歡迎大家進(jìn)行評(píng)判,謝謝……

          評(píng)論

          # re: 關(guān)于Spring中利用Hibernate作為DAO的簡(jiǎn)化  回復(fù)  更多評(píng)論   

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

          # re: 關(guān)于Spring中利用Hibernate作為DAO的簡(jiǎn)化  回復(fù)  更多評(píng)論   

          2008-01-11 09:18 by yf
          MSN:yellow.flying@hotmail.com有時(shí)間請(qǐng)教一下

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 荣昌县| 彭阳县| 芒康县| 盐池县| 建始县| 澎湖县| 南江县| 响水县| 永川市| 阳春市| 沾益县| 剑河县| 横山县| 临洮县| 江阴市| 嫩江县| 五台县| 聂荣县| 中卫市| 资中县| 长汀县| 历史| 隆子县| 福安市| 时尚| 上栗县| 阿克陶县| 彰化县| 洪江市| 元江| 米脂县| 长宁区| 保靖县| 深水埗区| 阳春市| 康定县| 黔江区| 盐源县| 重庆市| 陕西省| 岚皋县|