JavaBean 工具:updar

分享到:
  • 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 -需要更新的属性组名

例如:

	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/
昵    称:
验证码:

相关文档: