躺在沙灘上的小豬

          快樂的每一天

          代碼重構

          不能回家,感覺無聊透頂,亂寫點東西,打發時間

          今天無意中在springframework中見到這個函數

          this.getHibernateTemplate().findByExampl(Object obj)

          以前沒注意到,看了一下源碼,原來就是Criteria中的Example.

          以前代碼如下

          package martin.xpost.model;

          import martin.xpost.hibernate.UserDAO;
          import martin.xpost.util.ListUtil;

          import java.util.ArrayList;
          import java.util.List;

          /**
           * 
          @author martin
           
          */

          public class User {
              
          private String id;
              
          private String userName;
              
          private String password;
              
          private String realName;
              
          private String email;
              
          private List blogEntities = new ArrayList();
              
          private List rolls = new ArrayList();
              
              
          private UserDAO service;
              
              
          //getter and setter
              public void save() {
                  
          this.service.save(this);
              }


              
          public void remove() {
                  
          this.service.remove(this);
              }


              
          public boolean valid() {
                  
          return ListUtil.isNotEmpty(this.service.valid(this));
              }

          }

          DAO代碼如下
          package martin.xpost.hibernate.impl;

          import martin.xpost.hibernate.UserDAO;
          import martin.xpost.model.User;
          import martin.xpost.util.ListUtil;
          import org.hibernate.Query;
          import org.hibernate.Session;
          import org.springframework.orm.hibernate3.HibernateCallback;
          import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

          import java.util.List;

          /**
           * 
          @author martin
           
          */

          public class HibernateUserDAO extends HibernateDaoSupport implements UserDAO {
              
          public void save(User user) {
                  
          this.getHibernateTemplate().merge(user);
              }


              
          public void remove(User user) {
                  
          this.getHibernateTemplate().delete(user);
              }


              
          public boolean valid(final User user) {
                  List list 
          = (List) this.getHibernateTemplate().execute(new HibernateCallback() {
                      
          public Object doInHibernate(Session session) throws org.hibernate.HibernateException {
                          Query query 
          = session.createQuery("from User user where user.userName=:userName and user.password=:password");
                          query.setString(
          "userName", user.getUserName());
                          query.setString(
          "password", user.getPassword());
                          
          return query.list();
                      }

                  }
          );
                  
          return ListUtil.isEmpty(list);
              }

          }

          重構
          一:修改User的valid函數
              public boolean valid() {
                  
          return ListUtil.isNotEmpty(this.service.find(this));
              }

          DAO中只負責和數據源打交道,我們將邏輯全部轉到model里面(就是邏輯太簡單了o_o)。

          二:修改DAO代碼
          package martin.xpost.hibernate.impl;

          import martin.xpost.hibernate.UserDAO;
          import martin.xpost.model.User;
          import martin.xpost.util.ListUtil;
          import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

          import java.util.List;

          /**
           * 
          @author martin
           
          */

          public class HibernateUserDAO extends HibernateDaoSupport implements UserDAO {
              
          public void save(User user) {
                  
          this.getHibernateTemplate().merge(user);
              }


              public void remove(User user) {
                  
          this.getHibernateTemplate().delete(user);
              }


              
          public List find(User user) {
                  
          return this.getHibernateTemplate().findByExample(user);
              }

          }

          這樣就簡單多了:)
          Test 一下:
          package martin.xpost;

          import martin.xpost.model.User;

          /**
           * 
          @author martin
           
          */

          public class UserTest extends TestBase {


              
          public void testAdd() {
                  User user 
          = (User) this.getBean("user");
                  user.setUserName(
          "martin");
                  user.setPassword(
          "1234");
                  user.setRealName(
          "martin xus");
                  user.setEmail(
          "martin.xus@gmail.com");
                  user.save();
                  assertNotNull(user.getId());
              }


              
          public void testValid() {
                  User user 
          = (User) this.getBean("user");
                  user.setUserName(
          "martin");
                  user.setPassword(
          "1234");
                  assertTrue(user.valid());
              }


              
          public void testRemove() {
                  User user 
          = (User) this.getBean("user");
                  user.setUserName(
          "martin");
                  user.setPassword(
          "1234");
                  user.remove();
                  assertNull(user.getId());
              }

          }

          第三個沒有通過:(看了一下log,原來this.getHibernateTemplate().delete(user)中user必須是持久層對象,也就是說user的id不能為空。

          再修改:首先判斷user.getId()是否為空,如果不為空,直接remvoe,否則,先find然后在remove.
              public void remove(User user) {
                  
          if (null != user.getId() && !"".equals(user.getId().trim())) {
                      
          this.getHibernateTemplate().delete(user);
                  }
           else {
                      List list 
          = find(user);
                      
          if (ListUtil.isNotEmpty(list))
                          
          for (Object o : list) {
                              
          this.getHibernateTemplate().delete(o);
                          }

                  }

              }

          OK,測試通過!

          posted on 2006-01-24 19:07 martin xus 閱讀(1216) 評論(0)  編輯  收藏 所屬分類: javahibernate 、spring

          主站蜘蛛池模板: 繁峙县| 扎鲁特旗| 县级市| 巩义市| 繁峙县| 津南区| 龙州县| 尚义县| 桃园县| 临颍县| 化州市| 康保县| 探索| 嘉善县| 金川县| 惠水县| 留坝县| 永顺县| 江北区| 许昌市| 铁力市| 扎兰屯市| 四平市| 商南县| 安义县| 吴忠市| 湖南省| 沿河| 衡阳县| 丹凤县| 将乐县| 青铜峡市| 德格县| 伊宁市| 河北区| 大连市| 桂阳县| 阳江市| 藁城市| 阿瓦提县| 榆树市|