躺在沙灘上的小豬

          快樂的每一天

          代碼重構

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

          今天無意中在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 閱讀(1214) 評論(0)  編輯  收藏 所屬分類: javahibernatespring

          主站蜘蛛池模板: 铜梁县| 南昌市| 富裕县| 宁蒗| 宁波市| 三门峡市| 宜州市| 皮山县| 小金县| 河东区| 观塘区| 雷山县| 德格县| 龙海市| 讷河市| 邻水| 赤峰市| 雷山县| 阿拉善右旗| 怀安县| 海南省| 丹凤县| 本溪市| 临朐县| 旺苍县| 聂拉木县| 和顺县| 林甸县| 武穴市| 长沙市| 巴楚县| 民丰县| 河曲县| 迁安市| 丰宁| 德保县| 高青县| 铁力市| 察哈| 化州市| 郯城县|