commons-beanutils包的使用

PropertyUtil: 使用 Java 反射 API 编写的工具类,用于方便的进行 get set

本工具类的所有实现都是对PropertyUtilsBean的封装和代理。

MethodUtils:封装以放射方式请求方法的工具方法

ConstructorUtils:使用反射方法请求构造函数创建新实例的工具类,可以简化程序中使用反射方式创建对象的代码。

BeanUtils:提供对标准JavaBean和动态bean的操作。主要功能是复制bean中的内容,拷贝bean,为bean中的内容赋值和读取bean中内容。

LocaleBeanUtils:BeanUtils作用类似,但在执行相应方法时可以进行地区敏感数据的转换。


//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());


//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);




而使用BeanUtils后,代码就大大改观了,如下所示:
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
BeanUtils.copyProperties(teacher,teacherForm);
//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);

如果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。例如 Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的 copyProperties()后还要加上一句:


teacher.setModifyDate(new Date());

除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与 BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而前者不支持这个功能,但是速度会更快一些。

BeanUtils.copyProperties 与 PropertyUtils.copyProperties 都是拷贝对象属性的方法,BeanUtils 支持类型转换,而 PropertyUtils 不支持。但是 BeanUtils 不允许对象的属性值为 null,PropertyUtils 可以拷贝属性值 null 的对象。 
如果对象属性值为 null,BeanUtils.copyProperties 方法会报 commons.beanutils.ConversionException: No value specified 错误。 


package rong.propertyUtils;


import java.util.Map;
import org.apache.commons.beanutils.MethodUtils;
import org.apache.commons.beanutils.PropertyUtils;


public class TestPropertyUtils {
    
    public static void main(String[] args) throws Exception{
        
        Entity entity = new Entity();
        
        //通过PropertyUtils的getProperty方法获取指定属性的值
        Integer id = (Integer)PropertyUtils.getProperty(entity, "id");
        String name = (String)PropertyUtils.getProperty(entity, "name");
        System.out.println("id = " + id + "  name = " + name);
        
        //调用PropertyUtils的setProperty方法设置entity的指定属性
        PropertyUtils.setProperty(entity, "name", "心梦帆影");
        System.out.println("name = " + entity.getName());
        
        //通过PropertyUtils的describe方法把entity的所有属性与属性值封装进Map中
        Map map = PropertyUtils.describe(entity);
        System.out.println("id = " + map.get("id") + "  name = " + map.get("name"));
        
        //通过MethodUtils的invokeMethod方法,执行指定的entity中的方法(无参的情况)
        System.out.println( MethodUtils.invokeMethod(entity, "haha", null) );
        
        //通过MethodUtils的invokeMethod方法,执行指定的entity中的方法(1参的情况)
        MethodUtils.invokeMethod(entity, "sayHelle", "心梦帆影");
        
        //通过MethodUtils的invokeMethod方法,执行指定的entity中的方法(多参的情况)
        Object[] params = new Object[]{new Integer(10),new Integer(12)};
        String msg = (String)MethodUtils.invokeMethod(entity, "countAges", params);
        System.out.println(msg);
        
    }


}


BasicDynaBean and BasicDynaClass - 基本的 Dynamic 类型
  基本的API:
  BasicDynaClass(java.lang.String name, java.lang.Class dynaBeanClass, DynaProperty[] properties) 
  BasicDynaBean(DynaClass dynaClass) 
  我们定义一下基本的代码:
  //定义动态属性集
  DynaProperty[] props = new DynaProperty[]{
   new DynaProperty("address", java.util.Map.class),
   new DynaProperty("subordinate", mypackage.Employee[].class),
   new DynaProperty("firstName", String.class),
   new DynaProperty("lastName", String.class)
   };
  //创建动态类来设定动态属性值
   BasicDynaClass dynaClass = new BasicDynaClass("employee", null, props);
  DynaBean employee = dynaClass.newInstance();
   employee.set("address", new HashMap());
   employee.set("subordinate", new mypackage.Employee[0]);
   employee.set("firstName", "Fred");
   employee.set("lastName", "Flintstone");


  ResultSetDynaClass (Wraps ResultSet in DynaBeans) - 使用 ResultSet 的
  Dynamic JavaBean
  API:
  ResultSetDynaClass(java.sql.ResultSet resultSet)
  ResultSetDynaClass(java.sql.ResultSet resultSet, boolean lowerCase) 
  Connection conn = ...;
   Statement stmt = conn.createStatement();
   ResultSet rs = stmt.executeQuery
   ("select account_id, name from customers");
   Iterator rows = (new ResultSetDynaClass(rs)).iterator();
   while (rows.hasNext()) {
  //利用动态bean进行输出
   DynaBean row = (DynaBean) rows.next();
   System.out.println("Account number is " +
   row.get("account_id") +
   " and name is " + row.get("name"));
   }
   rs.close();
   stmt.close();


  RowSetDynaClass (Disconnected ResultSet as DynaBeans) - 使用 RowSet 的 Dynamic 
  JavaBean
  API:
  RowSetDynaClass(java.sql.ResultSet resultSet)
  RowSetDynaClass(java.sql.ResultSet resultSet, boolean lowerCase) 
   Connection conn = ...; // 从缓冲池取得连接
   Statement stmt = conn.createStatement();
   ResultSet rs = stmt.executeQuery("SELECT ...");
   RowSetDynaClass rsdc = new RowSetDynaClass(rs);
   rs.close();
   stmt.close();
   ...; //关闭连接返回缓冲池
   List rows = rsdc.getRows();
   ...; // 处理得到的行




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值