对持久层PO对象的操作维护问题

 
首先,请允许我,先简单地把自己在项目中遇到的问题简要的描述一下。
 
比如,有个班级页面更新页面,允许在页面中添加学生信息(暂且不考虑实际业务)。问题产生了。 有如下问题:
1.在更新页面,应该初始化已经保存的学生列表信息(PO)已持久化到数据库中
2.可以对已保存的操作进行删除、修改操作(PO)
3.可以添加新的学生信息(VO),没有保存到数据库中。
 
当然,可以使用标示位 进行标记。在后台根据表示为进行不同操作,这是个不错的方案。但是我现在要说的事另外一个解决方案。这个方案,有个小问题存在,就是对于误删的学生信息,不能重新回退,客户体验不好。这是业务上的一个问题,暂且忽略吧,重点从技术的角度说一说。理解难免出现幼稚情况,希望高手批评指正。
 
下面,我用java 程序简单的模拟了一下这个情景。
 
第一步建立bean. 这时候要重写equals 和hashcode 方法。 最好也重写一下toString() 方法。
还要有id 字段,对应数据库中的主键。
package com.randy.list;

public class User {

   private int id;
   private String username;
   private String password;

   public int getId() {
     return id;
  }

   public void setId( int id) {
     this.id = id;
  }

   public String getUsername() {
     return username;
  }

   public void setUsername(String username) {
     this.username = username;
  }

   public String getPassword() {
     return password;
  }

   public void setPassword(String password) {
     this.password = password;
  }

  @Override
   public int hashCode() {
     final int prime = 31;
     int result = 1;
    result = prime * result
        + ((password == null) ? 0 : password.hashCode());
    result = prime * result
        + ((username == null) ? 0 : username.hashCode());
     return result;
  }

  @Override
   public boolean equals(Object obj) {
     if ( this == obj)
       return true;
     if (obj == null)
       return false;
     if (getClass() != obj.getClass())
       return false;
    User other = (User) obj;
     if (password == null) {
       if (other.password != null)
         return false;
    } else if (!password.equals(other.password))
       return false;
     if (username == null) {
       if (other.username != null)
         return false;
    } else if (!username.equals(other.username))
       return false;
     return true;
  }

  @Override
   public String toString() {
    StringBuffer sb = new StringBuffer();
    sb.append( "[")
    .append( "id=").append( this.id).append( ",")
    .append( "username=").append( this.username).append( ",")
    .append( "password=").append( this.password).append( "]");
     return sb.toString();
  }

}
 
下面是测试业务代码
package com.randy.list;

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

public class CompareList {

public static List<User> initlistPO(){
    
    
  List<User> polist = new ArrayList<User>();
  User user1 = new User();
  user1.setUsername( "杨过");
  user1.setPassword( "yangguo");
  user1.setId(100); //模拟从持久层存在的数据,所以存在ID
  polist.add(user1);
    
    
  User user2 = new User();
  user2.setUsername( "小龙女");
  user2.setPassword( "longnv");
  user2.setId(120); //模拟从持久层存在的数据,所以存在ID
  polist.add(user2);

  User user3 = new User();
  user3.setUsername( "李莫愁");
  user3.setPassword( "mochou");
  user3.setId(110); //模拟从持久层存在的数据,所以存在ID
  polist.add(user3);

  User user4 = new User();
  user4.setUsername( "���o忌");
  user4.setPassword( "wuji");
  user4.setId(129); //模拟从持久层存在的数据,所以存在ID
  polist.add(user4);    
   return polist;
}
    
public static List<User> initlistVO(){
    
// add    
  List<User> volist = new ArrayList<User>();
  User user1 = new User();
  user1.setUsername( "黄蓉");
  user1.setPassword( "huangrong");
  user1.setId(0); //    
  volist.add(user1);
    
// update
  User user2 = new User();
  user2.setUsername( "龙女");
  user2.setPassword( "longnv");
  user2.setId(120); //更新字段
  volist.add(user2);

   //no operation
  User user3 = new User();
  user3.setUsername( "李莫愁");
  user3.setPassword( "mochou");
  user3.setId(110); //模拟从持久层存在的数据,所以存在ID
  volist.add(user3);


/*    [至若]这样的对象应该不会存在的
      User user4 = new User();
  user4.setUsername("周芷若");
  user4.setPassword("zhiruo");
  user4.setId(112);//    
  volist.add(user4);*/
// delete    yangguo
   return volist;
}    
   public static void updateOrsave(){
    
    List<User> polist = initlistPO();
    
    List<User> volist = initlistVO();
    
    List<User> pobacklist = new ArrayList<User>();
    pobacklist.addAll(polist);
    
    polist.removeAll(volist); // update    and delete
    
    volist.removeAll(pobacklist);
    
     for(User out :volist){
       if(out.getId()==0){
        System.out.println( "insert"+out);
      } else{
         for(User inner:polist){
           if(out.getId() == inner.getId()){
            System.out.println( "update"+out);
          } else{
            System.out.println( "delete"+inner);
          }
        }        
      }
    }
  }
    
   public static void printList(List<User> list){
     for(User user:list){
      System.out.println(user);
    }
  }
    
   public static void main(String args[]){
    updateOrsave();
  }
}
 
有4个方法:
initlistPO() 方法是初始化 持久层对象列表。在实际业务中相当于从数据库读取的记录,在WEB页面上,表示为初始化的“学生”列表信息。
inintlistVO() 方法 初始化VO对象列表,在实际业务中相当于,提交的记录。有的记录在数据库中存在(在VO列表中有对应的记录),有的记录不存在(id=0)。只有这两种状态的记录。删除的记录,不进行提交。
另外是一个主要方法 saveOrupdate() 方法,主要作用,根据比对两个列表的内容,绝对对象的增删改操作。
请看具体代码:
 
package com.randy.list;

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

public class CompareList {

public static List<User> initlistPO(){
    
    
  List<User> polist = new ArrayList<User>();
  User user1 = new User();
  user1.setUsername( "杨过");
  user1.setPassword( "yangguo");
  user1.setId(100); //模拟从持久层存在的数据,所以存在ID
  polist.add(user1);
    
    
  User user2 = new User();
  user2.setUsername( "小龙女");
  user2.setPassword( "longnv");
  user2.setId(120); //模拟从持久层存在的数据,所以存在ID
  polist.add(user2);

  User user3 = new User();
  user3.setUsername( "李莫愁");
  user3.setPassword( "mochou");
  user3.setId(110); //模拟从持久层存在的数据,所以存在ID
  polist.add(user3);

  User user4 = new User();
  user4.setUsername( "���o忌");
  user4.setPassword( "wuji");
  user4.setId(129); //模拟从持久层存在的数据,所以存在ID
  polist.add(user4);    
   return polist;
}
    
public static List<User> initlistVO(){
    
// add    
  List<User> volist = new ArrayList<User>();
  User user1 = new User();
  user1.setUsername( "黄蓉");
  user1.setPassword( "huangrong");
  user1.setId(0); //    
  volist.add(user1);
    
// update
  User user2 = new User();
  user2.setUsername( "龙女");
  user2.setPassword( "longnv");
  user2.setId(120); //更新字段
  volist.add(user2);

   //no operation
  User user3 = new User();
  user3.setUsername( "李莫愁");
  user3.setPassword( "mochou");
  user3.setId(110); //模拟从持久层存在的数据,所以存在ID
  volist.add(user3);


/*    [至若]这样的对象应该不会存在的
      User user4 = new User();
  user4.setUsername("周芷若");
  user4.setPassword("zhiruo");
  user4.setId(112);//    
  volist.add(user4);*/
// delete    yangguo
   return volist;
}    
   public static void updateOrsave(){
    
    List<User> polist = initlistPO();
    
    List<User> volist = initlistVO();
    
    List<User> pobacklist = new ArrayList<User>();
    pobacklist.addAll(polist);
    
    polist.removeAll(volist); // update    and delete
    
    volist.removeAll(pobacklist);
    
     for(User out :volist){
       if(out.getId()==0){
        System.out.println( "insert"+out);
      } else{
         for(User inner:polist){
           if(out.getId() == inner.getId()){
            System.out.println( "update"+out);
          } else{
            System.out.println( "delete"+inner);
          }
        }        
      }
    }
  }
    
   public static void printList(List<User> list){
     for(User user:list){
      System.out.println(user);
    }
  }
    
   public static void main(String args[]){
    updateOrsave();
  }
}
 
运行结果:
insert[id=0,username=黄蓉,password=huangrong]
delete[id=100,username=杨过,password=yangguo]
update[id=120,username=龙女,password=longnv]
delete[id=129,username=���o忌,password=wuji]
 
可能有人会问,为什么不用Set,没办法,这是我实际项目中用到的都是List
实际上业务逻辑很简单,只是既然自己花时间研究了一下,就把心得整理出来,记录下自己的心路过程。
 
 
 

你可能感兴趣的:(list,对象,职场,crud,休闲)