package com.demo.beanutils;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import org.junit.Test;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* BeanUtils 组件:
* 程序中对 Javabean 的操作很频繁,所以 apache 提供了一套开源的 api,
* 方便对 Javabean 的操作,即 BeanUtils 组件。
* BeanUtils 组件的作用是:简化 javabean 的操作;
*
* 使用 BeanUtils 组件导入的 jar 包:
* commons-beanutils-1.8.3.jar:BeanUtils 的核心包
* commons-logging-1.1.1.jar:BeanUtils 依赖包(必须有)
*
* BeanUtils 基本 API:
* 1、设置 JavaBean 对象的属性:下面两个方法作用一样
* BeanUtils.copyProperty(object, name, value);
* BeanUtils.setProperty(object, name, value);
* 2、对象的拷贝
* BeanUtils.copyProperties(newObject, object);
* 3、将 map 对象拷贝到 Javabean 对象中:map 中的 key 要与 Javabean 中的属性名一致
* BeanUtils.populate(object, map);
*/
public class Demo1 {
/**
* 使用 BeanUtils 组件对 Javabean 的基本操作
*/
@Test
public void test1() throws Exception{
/*
* 1、BeanUtils 实现对 Javabean 对象属性的设置
* 对于基本数据类型,BeanUtils 会自动进行数据转换
*/
Admin admin1 = new Admin();
BeanUtils.copyProperty(admin1, "name", "张三");
BeanUtils.copyProperty(admin1, "age", 18);
System.out.println(admin1);
Admin admin2 = new Admin();
BeanUtils.setProperty(admin2, "name", "李四");
BeanUtils.setProperty(admin2, "age", 22);
System.out.println(admin2);
System.out.println("---------------------------");
/*
* 2、对象的拷贝
*/
Admin newAdmin = new Admin();
BeanUtils.copyProperties(newAdmin, admin1);
System.out.println(newAdmin);
System.out.println("---------------------------");
/*
* 3、将 map 集合数据拷贝到 JavaBean 对象中
*/
Admin adminMap = new Admin();
Map<String, Object> map = new HashMap<>();
map.put("name", "王五"); // 注意:map 中的 key 要与 javabean 中的属性名一致
map.put("age", 33);
BeanUtils.populate(adminMap, map);
System.out.println(adminMap);
}
/**
* BeanUtils 对 Javabean 中日期类型(Date)属性的设置
* 方法一:自定义日期类型转换器
*/
@Test
public void test2() throws Exception{
// 模拟表单提交的数据,表单提交的都是 字符串类型
String name = "rose";
String birth = "2019-01-01"; // 将此 字符串数据 转换成 Date 数据
// String birth = null; // 如果 字符串值为 null,或 空字符串,则不需要转换
// String birth = "";
// 创建对象
Admin2 admin = new Admin2();
// 注册日期类型转换器:重写 convert 方法
ConvertUtils.register(new Converter() {
// 转换的内部实现方法,重写
// type:表示 javabean 中 birth 属性的数据类型(Date类型);
// value:表示需要转换为 Date 类型的 字符串数据;
@Override
public Object convert(Class type, Object value) {
// 如果 javabean 中 birth 的数据类型不是 Date,则不需要转换
if (type != Date.class){
return null;
}
// 如果传入的 字符串值为 null,或者为 空字符串,也不需要转换
if (value == null || "".equals(value.toString().trim())){
return null;
}
try {
// 字符串转换成日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(value.toString());
}catch (Exception e){
throw new RuntimeException(e);
}
}
}, Date.class);
// 把表单提交的数据,封装到 javabean 对象中
BeanUtils.setProperty(admin, "name", name);
BeanUtils.setProperty(admin, "birth", birth);
System.out.println(admin);
}
/**
* BeanUtils 对 Javabean 中日期类型(Date)属性的设置
* 方法二:使用 BeanUtils 提供的日期类型转换器工具类
*/
@Test
public void test3() throws Exception{
// 模拟表单提交的数据,表单提交的都是 字符串类型
String name = "lucy";
String birth = "2000-11-11";
// String birth = null; // 不进行转换,也不会报错
// String birth = ""; // 会报异常
// 创建对象
Admin2 admin = new Admin2();
// 注册日期类型转换器:使用组件提供的转换器工具类
// 注意:DateLocaleConverter 工具类只判断了 null,没有判断 空字符串;
// 也就是说如果 String birth = null; 不会进行转换,也不会报异常;但是如果 String birth = ""; 就会报异常;
ConvertUtils.register(new DateLocaleConverter(), Date.class);
// 把表单提交的数据,封装到 javabean 对象中
BeanUtils.setProperty(admin, "name", name);
BeanUtils.setProperty(admin, "birth", birth);
System.out.println(admin);
}
}
其中 Admin.java:
package com.demo.beanutils;
public class Admin {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Admin{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
其中 Admin2.java:
package com.demo.beanutils;
import java.util.Date;
public class Admin2 {
private String name;
private Date birth;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
@Override
public String toString() {
return "Admin2{" +
"name='" + name + '\'' +
", birth=" + birth +
'}';
}
}