BeanUtils与PropertyUtils的copyProperties方法的差别

1. copyProperties

        org.apache.commons.beanutils包中有两个工具类,BeanUtils与PropertyUtils,这两个工具类中各自有一个copyProperties(Object  dest, Object orig)方法,这两个方法可以将两个对象当中相同的属性的值由源对象赋值至目标对象中。用到这个类的场景一般是由前台传到后台的一个包装类,将这个包装类的值copy到一个实体对象中,由这个实体对象写入数据库表,可以省去多行get与set方法。

2. BeanUtils与PropertyUtils的copyProperties方法的差别

       这两个工具类当中的copyProperties方法的方法名、参数,都一样,所使用到的场景也类似,它们之间的差别在于源对象中int、值为null的时候。以下用代码说明,有一个User类,及一个继承自该类的UserVO,这要做的事,是将User当中的属性copy到UserVO当中。

3. 测试代码

3.1 实体类

        下面有两个实体类,其中一个实体类继承自另一个实体类,测试代码要做的事情就是将父类属性的值赋到子类当中(由于篇幅原因,省去get、set与toString方法)。

import java.util.Date;

public class User {
	private Long id;
	
	private String name;
	
	private Integer sex;
	
	private Double age;
	
	private Date birthDay;
}
public class UserVO extends User{
	private String address;

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
}

3.2 测试方法

        对于非null值的属性,两个工具类中的方法得到的结果是一样的,那么直接用null值来进行测试,测试方法如下:

import java.lang.reflect.InvocationTargetException;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;

public class Test01 {
	public static void main(String[] args) {
		// 原对象
		User sourceUser = new User();
		sourceUser.setId(null);
		sourceUser.setName(null);
		sourceUser.setAge(null);
		sourceUser.setSex(null);
		sourceUser.setBirthDay(null);
		// 目标对象
		UserVO destUser = new UserVO();
		// 测试BeanUtil
		testBeanUtil(destUser, sourceUser);
		// 测试PropertyUtil
		testPropertyUtil(destUser, sourceUser);
		
	}
	
	private static void testBeanUtil(User destUser, User sourceUser) {
		try {
			BeanUtils.copyProperties(destUser, sourceUser);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		System.out.println("BeanUtils result:" + destUser);
	}
	
	private static void testPropertyUtil(User destUser, User sourceUser) {
		try {
			PropertyUtils.copyProperties(destUser, sourceUser);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		}
		System.out.println("PropertyUtils result:" + destUser);
	}
}

3.3 输出结果

BeanUtils result:User [id=0, name=null, sex=0, age=0.0, birthDay=null, address=null]
PropertyUtils result:User [id=null, name=null, sex=null, age=null, birthDay=null, address=null]

        由打印的结果可以看到,Long类型、Integer类型、Double类型的值如果为空,调用BeanUtils的copyProperties方法地到的结果会将这些类型的值赋为0或者0.0,而使用PropertyUtils的copyProperties方法源对象与目标对象的值是一样的。

4. 结论

        使用org.apache.commons.beanutils.BeanUtils的copyProperties方法得到的结果会将为null的Integer、Long、Double类型的属性赋值为0或者0.0,但对于String、Date等类则不会有这种结果(null依然为null),而使用org.apache.commons.beanutils.BeanUtils的copyProperties方法得到的结果不会给null值赋初始值(null依然为null)。所以在实际的开发中碰到类似的业务场景需要正确选用合适的工具类。

发布了48 篇原创文章 · 获赞 52 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/y506798278/article/details/99204061
今日推荐