数据封装之BeanUtils的介绍与使用

作者:叁念

项目代码下载:链接:https://pan.baidu.com/s/1QqWTxxeEcBFpH7S9u_25vg 密码:8gqp


一、使用场景描述

  • 在获取表单数据时有多个参数,你想将之快速封装成JavaBean模式
  • 在读取配置文件时读取多个数据,你想将之快速封装成JavaBean模式

有人会这样提问,为什么要用这个工具,既然已经获取到数据,我直接获取数据调用JavaBean属性的set方法不就可以了吗?
答:请考虑我列举的以下两种情况:

  • 如果你获取的数据是一个map集合类型的数据封装体,你是否要一个一个取出数据并一个一个的调用JavaBean的set方法进行赋值?
  • 你从表单或配置文件中获取的数据通常情况下都是String类型,但是你要封装的JavaBean对应的属性却不一定都是String类型的数据,可能是其他数据类型(比如int、double、char、float等),你是否需要一个一个的进行数据类型转换?

本篇文章目的就是使用BeanUtils工具来解决以上问题,当然本工具包括但不限于以上两个使用场景

二、BeanUtils的好处

  • BeanUtils设置属性值的时候,如果属性是基本数据类型,那么BeanUtils会自动帮我们进行数据类型的转换
  • 如果设置的属性值是其他的引用数据类型,此时必须要注册一个类型转换器才能实现自动的转换

注意: BeanUtils是依赖于底层的get和set方法,所以JavaBean必须要有get、set方法

三、使用方法

2.1 下载相关工具包

commons-beanutils-1.9.3.jar 下载地址

commons-logging-1.1.1.jar 下载地址

2.2 常用API使用介绍
  • BeanUtils.copyProperties(Object new, Object old) :对象复制,将old对象拷贝到new对象中
  • BeanUtils.copyProperty(Object bean, String name, Object value):其中bean指将要设置的对象,name指将要设置的属性属性名,value将要设置的属性值
  • BeanUtils.populate(Object bean, Map properties):其中bean指将设置的对象,Map指封装参数的集合,将Map中的数据封装到bean中,另外注意Map中的key必须与将设置对象中的属性名相同,否则不能实现拷贝。
  • 注意:BeanUtils支持以下类型的自动转换,特别注意的如Date类型,在书写Bean时如果使用import java.util.Date;这个包将会报错Exception in thread “main” org.apache.commons.beanutils.ConversionException: DateConverter does not support default String to ‘Date’ conversion.解决办法就是将之改为java.sql.Date(当然还有其他方法,这里暂且不提)
java.lang.BigDecimal  
java.lang.BigInteger  
boolean and java.lang.Boolean  
byte and java.lang.Byte  
char and java.lang.Character  
java.lang.Class  
double and java.lang.Double  
float and java.lang.Float  
int and java.lang.Integer  
long and java.lang.Long  
short and java.lang.Short  
java.lang.String  
java.sql.Date  
java.sql.Time  
java.sql.Timestamp  
2.3 举例
23.1 例子一

首先创建一个普通的JavaBean:
Bean内容如下:

/**注意哦!这里是错误的*/
//import java.util.Date;
/**使用如下Date类型*/
import java.sql.Date;

public class Bean {
    private int id;
    private String des;
    private double sums;
    private Date date;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDes() {
        return des;
    }

    public void setDes(String des) {
        this.des = des;
    }

    public double getSums() {
        return sums;
    }

    public void setSums(double sums) {
        this.sums = sums;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "Bean [id=" + id + ", des=" + des + ", sums=" + sums + ", date=" + date + "]";
    }

}

书写测试类Test如下:


import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import org.apache.commons.beanutils.BeanUtils;

public class Test {
    public static void main(String[] args) throws IllegalAccessException, InvocationTargetException {
        // 创建一个JavaBean用于数据封装
        Bean bean = new Bean();
        // 模拟获取到的属性
        String id = "15200001212";
        String des = "叁念";
        String sums = "666666";
        String date = "2018-06-08"; // 注意,这里需要符合相关格式规范,如:2018年06月08号就无法解析

        /**
         * 1.BeanUtils.copyProperties(Object new, Object old) 的使用
         */
        bean.setDes(des);
        Bean newBean = new Bean();
        BeanUtils.copyProperties(newBean, bean);
        System.out.println(newBean);// 执行结果如下 Bean [id=0, des=叁念, sums=0.0, date=null]

        /**
         * 2.BeanUtils.copyProperty(Object bean, String name, Object value) 的使用
         */
        BeanUtils.copyProperty(newBean, "des", "new 叁念");
        System.out.println(newBean);// 执行结果如下 Bean [id=0, des=new 叁念, sums=0.0, date=null]

        /**
         * 3.BeanUtils.populate(Object bean, Map properties): 的使用
         */
        // 模拟封装Map 如:HttpServletRequest request这个对象中有这个方法 request.getParameterMap(),可以去除所有表单中的数据封装成Map
        HashMap<String, String> requestMap = new HashMap<>();
        requestMap.put("id", id);
        requestMap.put("des", des);
        requestMap.put("sums", sums);
        requestMap.put("date", date);
        System.out.println(requestMap);//requestMap值如下:{des=2018-06-08, id=15200001212, sums=666666}
        BeanUtils.populate(newBean, requestMap);
        System.out.println(newBean);//打印如下Bean [id=0, des=叁念, sums=666666.0, date=2018-06-08]
    }
}
23.1 例子二

通过上面的例子我们已经了解了BeanUtils的基本使用,当然有朋友还会问:Data类型我就是要用java.util.Date;并且我获取到的日期格式就是2018年06月08号这类格式的,怎么办?请看下面这个例子

同样书写Bean,这里只要导包将import java.sql.Date;这个包修改为之前报错的包import java.util.Date;就可以,这里就不贴代码:

书写测试类Test2如下:


import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.HashMap;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;

public class Test {
    public static void main(String[] args) throws IllegalAccessException, InvocationTargetException {
        // 创建一个JavaBean用于数据封装
        Bean bean = new Bean();
        // 模拟获取到的属性
        String id = "15200001212";
        String des = "叁念";
        String sums = "666666";
        String date = "2018-06-08"; // 注意,这里需要符合相关格式规范,如:2018年06月08号就无法解析
        // 模拟封装Map 如:HttpServletRequest request这个对象中有这个方法 request.getParameterMap(),可以去除所有表单中的数据封装成Map
        HashMap<String, String> requestMap = new HashMap<>();
        requestMap.put("id", id);
        requestMap.put("des", des);
        requestMap.put("sums", sums);
        requestMap.put("date", date);
        System.out.println(requestMap);//requestMap值如下:{des=2018-06-08, id=15200001212, sums=666666}
        /**
         * 因为BeanUtils本身不支持java.util.Date;这种类型
         * 这个时候就需要给类型注册转换器。
         * 如:意思是所以需要转成Date类型的数据都要通过DateLocaleConverter这个转换器的处理。
         */
        ConvertUtils.register(new DateLocaleConverter(), Date.class);
        BeanUtils.populate(bean, requestMap);
        System.out.println(bean);//打印结果如下:Bean [id=0, des=叁念, sums=666666.0, date=Fri Jun 08 00:00:00 CST 2018]
    }
}

以上使用DateLocaleConverter这个转换器不灵活,自己实现最好,如String date = “2018年06月08日”这种类型


import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;

public class Test {
    public static void main(String[] args) throws IllegalAccessException, InvocationTargetException {

        ConvertUtils.register(new Converter() {
            @Override
            public <T> T convert(Class<T> type, Object value) {// type:需要转换的数据类型 value:参数的值
                if (type != Date.class)
                    return null;

                if (value == null || "".equals(value.toString().trim())) {
                    return null;
                }
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
                Date date = null;
                try {
                    // 格式转换
                    date = dateFormat.parse((String) value);
                } catch (ParseException e) {
                    throw new RuntimeException(e);
                }
                return (T) date;
            }
        }, Date.class);

        Bean bean = new Bean();
        String des = "叁念";
        String date = "2018年06月08日";
        HashMap<String, String> requestMap = new HashMap<>();
        requestMap.put("des", des);
        requestMap.put("date", date);
        System.out.println(requestMap);// requestMap值如下:{date=2018年06月08日, des=叁念}
        BeanUtils.populate(bean, requestMap);
        System.out.println(bean);// 打印结果如下:Bean [id=0, des=叁念, sums=0.0, date=Fri Jun 08 00:00:00 CST 2018]
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36868342/article/details/80619365
今日推荐