JavaBean 工具:updar
jopen
10年前
- 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
- 项目成熟度状态
- 目前版本为upDar0.0.0-beta , 测试版
- 为什么要做这个东西
- 在以往开发中,我使用的是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的问题,我觉得是再好不过,而本工具则实现了这一解决方案.
- 许可证
- Copyright [2014] [upDar] Apache License, Version 2.0
- 例子:
- 问题
- 假设有个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 -需要更新的属性组名
例如:
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方法
http://code.taobao.org/p/updar/src/