JavaBean 工具:updar

jopen 11年前

  • upDar,javaBean工具
  • 为更简洁的操作javaBean,对javaBean进行简单设置即可达到目的,减少对javaBean操作冗余代码.
  • 当然要慢慢来.

  • 依赖的jar包
  • 1. json-lib-2.4-jdk15.jar
  • 2. commons-beanutils-1.8.3.jar
  • 3. commons-collections-3.1.jar
  • 4. commons-lang-2.4.jar
  • 5. commons-logging-1.1.1.jar
  • 6. ezmorph-1.0.6.jar


  • 为什么要做这个东西
  • 在以往开发中,我使用的是ssh框架,有个问题一直让我很疑惑,到底该怎么实现.

  • 当我们update操作的时候,有时并不需要把一个model的所有属性都去更新,例如状态等信息是不能被update的.

  • 但是,用ssh在前台传入参数保存到action中后,model中的属性是不可预估的,有可能存在不能更新的属性,但是当使用hibernate的update方法时,那么整个对象的全部属性都被update.会出现很多问题.

  • 起初我的解决方法是,在数据库中查出需要修改的model对象,把需要更改的属性一个个set进去.结果大量冗余代码出现.于是放弃这种写法.

  • 使用org.springframework.beans.BeanUtils.copyProperties(Object source, Object target, String[] ignoreProperties)方法,这个方法的作用是,ignoreProperties中存放了不可被修改的属性名,source是需要被修改的 model,target是提供修改数据的model.

  • 起初很好用,可后来发现一个问题,有一个用户对象,我们已经对他写好了update方法,并用copyProperties方法对 model进行了更新,可随着项目的扩大,用户中需要增加一个属性,但是之前的update方法不可修改这个属性,显然,我们已经记不得再哪使用了 copyProperties方法了,我们不能逐个去修改ignoreProperties参数.

  • 于是我觉得应该需要一种更好的方式去解决updateModel的问题了.

  • 这样我就写出了一些代码,用来分享给大家.

  • 思路

  • 对model的属性进行分组,这样当更新model的时候,只需要传入需要修改的model 和提供数据的model 和需要更新属性的分组名称即可.

  • 设置分组方式:通过注解方式,在model属性的set方法上添加注解,以标注该属性所属分组名称.这样当update方法写好后,若出现任何model属性变化,属性名变化都只需要更改model的 注解配置即可,无需修改update方法.

  • 以这种思路去解决updateModel的问题,我觉得是再好不过,而本工具则实现了这一解决方案.

  • 许可证


  • 例子:

  • 问题

  • 假设有个Cat类,内有以下4个属性,切get、set方法都存在

private String name; //名字    private String colors; //毛色    private Integer age; //年龄    private Double height; //身长

  • 这时,通过http请求,在action中接受到一个Cat对象,现在需要对该对象进行保存。
  • 但,用户只能修改Cat的名字和毛色。我们应该怎样操作


  • 示例

  • 1.分组: 我们把确定能够更改的Cat类属性进行分组,例如,name和colors可以进行修改那么我们把他们分为一组,假设组名叫“def”。


*通过注解方式对Cat类的属性进行分组,方法如下:

 @PropertyConfig(groupNames = {"def"})   public void setColors(String colors) {    this.colors = colors;   }     @PropertyConfig(groupNames = {"def"})   public void setName(String name) {    this.name = name;   }

  • 2.调用方法:BeanTools.updateModel(Object srcModel, Object dataModel,String groupName)
  • srcModel -需要更新的model
    • dataModel -提供数据的model
    • groupName -需要更新的属性组名
    </li> </ul>

    例如:

     Cat catA = new Cat();   Cat catB = new Cat();        catA.setName("喵了");   catA.setColors("red");   catA.setAge(5);   catA.setHeight(50D);       catB.setName("个咪");   catB.setColors("blue");   catB.setAge(2);   catB.setHeight(20D);            System.out.println("调用前catA&catB");          System.out.println("catA:"+catA.toString());   System.out.println("catB:"+catB.toString());     BeanTools.updateModel(catA, catB, "def");  //调用方法     System.out.println("调用后catA&catB");          System.out.println("catA:"+catA.toString());   System.out.println("catB:"+catB.toString());

    • 输出结果(我已经为Cat对象重写了toString()方法了)
      调用前catA&catB  调用前catA&catB  catA:{   age:5,   colors:red,   height:50,   name:喵了  }  catB:{   age:2,   colors:blue,   height:20,   name:个咪  }  调用后catA&catB  catA:{   age:5,   colors:blue,   height:50,   name:个咪  }  catB:{   age:2,   colors:blue,   height:20,   name:个咪  }

    整理下catA的属性变化

    属性名 catA前 catA后 catB属性 所属组
    age 5 5 2
    colors red blue blue def
    height 50 50 20
    name 喵了 个咪 个咪 def

    • 由此可看出,只有def组的Cat类属性进行了update,而不属于该组的则没有被修改。
    • 因此,解决了本教程之前的问题。

    可参考:com.wuliaosile.updar.test.example.update.Example1 类里的main方法

    Example1.java


    http://code.taobao.org/p/updar/src/