一、 简介

BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行简化操作处理。一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。

二、 使用BeanUtils组件

(1) 创建java项目,新建名为f.b.y.beans以及新建f.b.y.beans.test包

(2)Person.java

 package f.b.y.beans;

 public class Person {

 String name;

 String sex;

 String address;

 int age;

 public Person() {

 super();

 }

 public String getName() {

 return name;

 }

 public void setName(String name) {

 this.name = name;

 }

 public String getSex() {

 return sex;

 }

 public void setSex(String sex) {

 this.sex = sex;

 }

 public String getAddress() {

 return address;

 }

 public void setAddress(String address) {

 this.address = address;

 }

 public int getAge() {

 return age;

 }

 public void setAge(int age) {

 this.age = age;

 }

 @Override

 public String toString() {

 return "Person [name=" + name + ", sex=" + sex + ", address=" + address + ", age=" + age + "]";

 }

 }

(3)导入相关的jar包

1.引入commons-beanutils-1.8.3.jar核心包

2.引入日志支持包: commons-logging-1.1.3.jar

如果缺少日志jar文件,报错:

java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

at org.apache.commons.beanutils.ConvertUtilsBean.<init>(ConvertUtilsBean.java:157)

at org.apache.commons.beanutils.BeanUtilsBean.<init>(BeanUtilsBean.java:117)

at org.apache.commons.beanutils.BeanUtilsBean$1.initialValue(BeanUtilsBean.java:68)

at org.apache.commons.beanutils.ContextClassLoaderLocal.get(ContextClassLoaderLocal.java:153)

(4) PersonTest.java

 public class PersonTest {

 @Test

 public void test1 () throws Exception{

 //1.基本操作对bean赋值取值

 Person person = new Person();

 person.setName("Mike");

 person.setAge(22);

 System.out.println(person.getName());

 System.out.println(person.getAge());

 //如果有很多属性要赋值,一个个去赋值很麻烦

 //2.使用BeanUtils组件

 //2.1导包

 /*

 * 新建lib文件夹,导入commons-beanutils-1.8.3.jar(BeanUtils包)、

 * commons-logging-1.1.3.jar(日志包)并将添加至构建路径

 */

 //2.2对象属性拷贝

 //BeanUtils.copyProperty(bean, name, value);对象属性赋值,bean对象,属性名,属性值

 BeanUtils.copyProperty(person, "address", "HeYuan");//属性名要与bean属性名一致

 System.out.println(person.getAddress());

 //2.3对象的拷贝

 //BeanUtils.copyProperties(dest, orig);dest是目标bean对象,orig是源bean对象

 Person dest = new Person();

 BeanUtils.copyProperties(dest, person);

 System.out.println(dest.getName());

 //2.4map的数据拷贝到javabean中

 /*

 * BeanUtils.populate(bean, properties);bean是bean对象,properties是键值对

 */

 Map<String, Object> map = new HashMap<String, Object>();

 map.put("name", "joe");

 map.put("age", 23);

 Person personmap = new Person();

 BeanUtils.populate(personmap , map);

 System.out.println(personmap .getName());

 System.out.println(personmap .getAge());

 }

 }

总结:

1. 对象属性拷贝

BeanUtils.copyProperty(bean, name, value);//,bean对象,属性名,属性值。

BeanUtils.setProperty(bean, name, value);

2. BeanUtils.copyProperties(dest, orig);dest是目标bean对象,orig是源bean对象

3. map的数据拷贝到javabean中

BeanUtils.populate(bean, properties);bean是bean对象,properties是键值对

4. BeanUtils在对Bean赋值是会进行类型转化

三、 日期类型转换

BeanUtils支持的转换类型如下:

* 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

这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。

(1)Person2.java(注意java.util.Date,新增加Date birthday)

 import java.util.Date;

 public class Person2 {

 String name;

 String sex;

 String address;

 int age;

 Date birthday;

 public Date getBirthday() {

 return birthday;

 }

 public void setBirthday(Date birthday) {

 this.birthday = birthday;

 }

 public Person2() {

 super();

 }

 public String getName() {

 return name;

 }

 public void setName(String name) {

 this.name = name;

 }

 public String getSex() {

 return sex;

 }

 public void setSex(String sex) {

 this.sex = sex;

 }

 public String getAddress() {

 return address;

 }

 public void setAddress(String address) {

 this.address = address;

 }

 public int getAge() {

 return age;

 }

 public void setAge(int age) {

 this.age = age;

 }

 @Override

 public String toString() {

 return "Person2 [name=" + name + ", sex=" + sex + ", address=" + address + ", age=" + age + ", birthday="

 + birthday + "]";

 }

 }

 (2) PersonTest.java

 public class PersonTest {

 @Test

 public void test2 () throws Exception{

 //模拟表单数据

 String name = "mokey";

 String age = "22";

 String birthday ="1993-01-5";

 //对象

 Person2 person2 = new Person2();

 //把表单提交的数据,封装到对象中

 BeanUtils.copyProperty(person2, "name", name);

 BeanUtils.copyProperty(person2, "age", age);

 BeanUtils.copyProperty(person2, "birthday", birthday);

 System.out.println(person2);

 }

 }

报错:使用BeanUtils时,Date类型值为空,BeanUtils不支持Date日期转换。

org.apache.commons.beanutils.ConversionException: DateConverter does not support default String to 'Date' conversion.

3.1日期类型修改为java.sql.Date

解决方法之一: 在bean中修改日期类型改为:import java.sql.Date;

导入包即可。

(1)Person2.java

 import java.sql.Date;

 public class Person2 {

 String name;

 String sex;

 String address;

 int age;

 Date birthday;

 public Date getBirthday() {

 return birthday;

 }

 public void setBirthday(Date birthday) {

 this.birthday = birthday;

 }

 public Person2() {

 super();

 }

 public String getName() {

 return name;

 }

 public void setName(String name) {

 this.name = name;

 }

 public String getSex() {

 return sex;

 }

 public void setSex(String sex) {

 this.sex = sex;

 }

 public String getAddress() {

 return address;

 }

 public void setAddress(String address) {

 this.address = address;

 }

 public int getAge() {

 return age;

 }

 public void setAge(int age) {

 this.age = age;

 }

 @Override

 public String toString() {

 return "Person2 [name=" + name + ", sex=" + sex + ", address=" + address + ", age=" + age + ", birthday="

 + birthday + "]";

 }

 }

(2) test2

 @Test

 public void test2 () throws Exception{

 //模拟表单数据

 String name = "Hide";

 String birthday ="1993-01-5";

 //对象

 Person2 person2 = new Person2();

 //把表单提交的数据,封装到对象中

 BeanUtils.copyProperty(person2, "name", name);

 BeanUtils.copyProperty(person2, "birthday", birthday);

 System.out.println(person2.getName());

 System.out.println(person2.getBirthday());

 }

 输出结果:

 clip_image012

 3.2使用日期转换器工具类

 (1)Person3.java

 import java.util.Date;

 public class Person3 {

 String name;

 String sex;

 String address;

 int age;

 Date birthday;

 public Date getBirthday() {

 return birthday;

 }

 public void setBirthday(Date birthday) {

 this.birthday = birthday;

 }

 public Person3() {

 super();

 }

 public String getName() {

 return name;

 }

 public void setName(String name) {

 this.name = name;

 }

 public String getSex() {

 return sex;

 }

 public void setSex(String sex) {

 this.sex = sex;

 }

 public String getAddress() {

 return address;

 }

 public void setAddress(String address) {

 this.address = address;

 }

 public int getAge() {

 return age;

 }

 public void setAge(int age) {

 this.age = age;

 }

 @Override

 public String toString() {

 return "Person2 [name=" + name + ", sex=" + sex + ", address=" + address + ", age=" + age + ", birthday="

 + birthday + "]";

 }

 }

(2) test3

@Test

public void test3 () throws Exception{

//模拟表单数据

String name = "Hide";

String sex="男";

String address= "heyuan";

int age = 21;

String birthday ="1993-01-5";

//对象

Person2 person2 = new Person2();

// 注册sql.date的转换器,即允许BeanUtils.copyProperty时的源目标的sql类型的值允许为空

ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.sql.Date.class);

ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.util.Date.class);

ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlTimestampConverter(null), java.sql.Timestamp.class);

//把表单提交的数据,封装到对象中

BeanUtils.copyProperty(person2, "name", name);

BeanUtils.copyProperty(person2, "sex", sex);

BeanUtils.copyProperty(person2, "address", address);

BeanUtils.copyProperty(person2, "age", age);

BeanUtils.copyProperty(person2, "birthday", birthday);

//测试

System.out.println(person2);

//输出Person2 [name=Hide, sex=男, address=heyuan, age=21, birthday=1993-01-05]

}

小结:

1.日期类型选择java.util.Date

2.可在类中初始化日期转换器

 static{

 ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.sql.Date.class);

 ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.util.Date.class);

 ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlTimestampConverter(null), java.sql.Timestamp.class);

 }

java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和总结

http://www.iteye.com/topic/1137830

在web开发中,避免不了对日期的操作,常见的日期操作做个总结:

java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp

java.lang.Object

....|__java.util.Date

..........|__java.sql.Date/java.sql.Timestamp /java.sql.Time

....|__java.security.Timestamp

java.util.Date日期格式为:年月日时分秒

java.sql.Date日期格式为:年月日[只存储日期数据不存储时间数据]

java.sql.Time日期格式为:时分秒

java.sql.Timestamp日期格式为:年月日时分秒纳秒(毫微秒)

关系:

java.util.Date这个类是java.sql.Date, java.sql.Time, java.slq.Timestamp这三个类的父类。这三个类对java.util.Date类进行了包装。

联系:

java.sql.Date类屏蔽了java.util.Date类的时间有关的方法(形如:hh:mm:ss),因此,不可以通过这个类访问时间有关的信息,比如,如果你通过sqlDate.getHour()方法去访问小时信息,此方法会抛出一个IllegalArgumentException异常。这是因为java.sql.Date在继承java.util.Date类的时候对父类进行了重写,禁用了时间访问的方法。之所以这么处理,是为了和数据库的Date数据类型相匹配,数据库的Date数据类行只是保存日期有关的字段。

Java.sql.Time类屏蔽了java.util.Date的日期有关的字段(形如:yyyy-MM-dd),因此,不能通过这个类访问日期有关的信息,比如:如果你通过sqlTime.getYear()方法去获取年有关的信息,此方法会抛出一个IllegalArgumentException异常。这是因为java.sql.Time在继承java.util.Date类的时候对父类进行了重写,禁用了日期访问的方法。之所以这么处理,是为了和数据库的Time数据类型相匹配,数据库的Time数据类行只是保存时间有关的字段。

Java.sql.Timestamp字段则对java.util.Date这个类进行了扩充,它在java.util.Date类的基础上增加了毫秒的时间访问控制,因此,你可以通过getNanos()方法去获取时间的毫微秒数(注意此处获取的时间是以毫微秒为单位的,1秒等于十亿毫微秒),同样的,这也是为了和数据库中的Timestamp数据类型进行匹配。

理清了上述四个类的关系,那么java.util.Date和java.util.Calendar类有什么关系呢?

Java.util.Calendar类是java.util.Date类的一个更加深入,更加全面的替代。Java.util.Calendar类支持java.util.Date的所有功能,此外,Calendar还引入了多语言,多区域的特性,可以根据需要获取不同区域,不同时区的时间,Calendar还增加了比Date更加方便和快捷的许多操作,如获取一年当中的第几个星期,各个月的天数等便捷的方法。

注意:

Java.util.Calendar区别与java.util.Date的几个地方也需要注意一下:首先,Calendar增加了毫秒的时间段,通过它可以获取时间点的毫秒值,而java.util.Date只是精确到秒。其次,Calendar过去年的时候是当前年份比如:2010,而Date获取年份的时获取到的是当前年份-1900的一个值(2010-1900=110,因此,你调用getYear后过去的值就是110)。最后Calendar是一个抽象类,之所以能够实例化,是因为此处的Calendar充当了一个类似于工厂的作用,在getInstance方法中实例化了Calendar子类GregorianCalendar,并把它返回给用户使用。

针对不同的数据库选用不同的日期类型

·例如:Oracle的Date类型,只需要年月日,选择使用java.sql.Date类型

·MS Sqlserver数据库的DateTime类型,需要年月日时分秒,选择java.sql.Timestamp类型

针对不同的数据库选用不同的日期类型
·Oracle的Date类型,只需要年月日,选择使用java.sql.Date类型
·MS Sqlserver数据库的DateTime类型,需要年月日时分秒,选择java.sql.Timestamp类型

String日期格式转换成Date日期格式

 //java.util.Date时间格式的转换
     SimpleDateFormat f_utilDate=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
   String str="2011-5-31 14:40:50";
   try {
    java.util.Date utilDate=f_utilDate.parse(str);
    System.out.println(f_utilDate.format(utilDate));
   } catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }

 //java.sql.Date时间格式的转换
     SimpleDateFormat f_sqlDate=new SimpleDateFormat("yyyy-MM-dd");
     java.sql.Date sqlDate = java.sql.Date.valueOf("2010-08-20");
     System.out.println(f_sqlDate.format(sqlDate));
 //java.sql.Time sqltime时间格式的转换
     SimpleDateFormat f_sqlTime=new SimpleDateFormat("hh:mm:ss");
     java.sql.Time sqltime = java.sql.Time.valueOf("13:44:53");
     System.out.println(f_sqlTime.format(sqltime));
 //java.sql.Timestamp时间格式的转换
     SimpleDateFormat f_timestamp=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
     java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2010-08-20 14:06:27.186");
     System.out.println(f_timestamp.format(timestamp));

 //java.util.Date 转换成 java.sql.Date 格式
        try{
         SimpleDateFormat DateFormate =   new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                java.util.Date date1 = DateFormate.parse("2011-5-31 14:40:50");
                java.sql.Date sqlDate = new java.sql.Date(date1.getTime());
                System.out.println(DateFormate.format(sqlDate));
        }catch (Exception ex) {
             System.out.println(ex.getMessage());
        }

      //java.sql.Date 转换成 java.util.Date 格式
        java.sql.Date sqlDate1=java.sql.Date.valueOf("2005-12-12");
        java.util.Date utilDate1=new java.util.Date(sqlDate1.getTime());
        System.out.println("java.sql.Date 转换成 java.util.Date 格式:"+f.format(utilDate1));

 //java.util.Date转换java.sql.Timestamp
     new java.sql.Timestamp(new java.util.Date().getTime());//此处IDE报错

 //java.util.Date转换java.sql.Time
     new java.sql.Time(new java.util.Date().getTime());

     Timestamp timestamp  = new Timestamp(System.currentTimeMillis());

我们可以使用DateFormat处理字符串来定义时间日期的格式
注:String都是先转换为java.util.Date,然后再转换成所需的格式

 try{
              String dateString = "2010-08-20 12:00:00.125";
               DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss.SSS",Locale.ENGLISH);//设定格式
              dateFormat.setLenient(false);
              java.util.Date utilDate = dateFormat.parse(dateString);//util类型
              java.sql.Timestamp dateTime = new java.sql.Timestamp(utilDate.getTime());//Timestamp类型,timeDate.getTime()返回一个long型
              System.out.println(dateTime);
         }catch(Exception ex){
             ex.printStackTrace();
         }       

3.开发中建议使用这种日期转换类减少代码量

3.3自定义日期转换器

(1)内部自定义

 @Test

 public void test4() throws Exception {

 // 模拟表单数据

 String name = "jack";

 String birth ="1995-12-24";

 // 对象

 Person2 person2 = new Person2();

 // 注册日期类型转换器:1, 自定义的方式

 ConvertUtils.register(new Converter() {

 // 转换的内部实现方法,需要重写

 public Object convert(Class type, Object value) {

 // 判断

 if (type != Date.class) {

 return null;

 }

 if (value == null || "".equals(value.toString().trim())) {

 return null;

 }

 try {

 // 字符串转换为日期

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

 return sdf.parse(value.toString());

 } catch (ParseException e) {

 throw new RuntimeException(e);

 }

 }

 },java.util.Date.class);

 // 把表单提交的数据,封装到对象中

 BeanUtils.copyProperty(person2, "name", name);

 BeanUtils.copyProperty(person2, "birthday",birth);

 //------ 测试------

 System.out.println(person2.getName());

 System.out.println(person2.getBirthday());

 }

(2)设置日期格式

 @Test

 public void test5() throws Exception {

 String name = "lucy";

 String birth ="1995-11-24";

 // 对象

 Person2 person2 = new Person2();

 //处理时间格式

 DateConverter dateConverter = new DateConverter();

 //设置日期格式

 dateConverter.setPatterns(new String[]{"yyyy-MM-dd","yyyy-MM-dd HH:mm:ss"});

 //注册格式

 ConvertUtils.register(dateConverter, Date.class);

 // 把表单提交的数据,封装到对象中

 BeanUtils.copyProperty(person2, "name", name);

 BeanUtils.copyProperty(person2, "birthday",birth);

 //------ 测试------

 System.out.println(person2.getName());

 System.out.println(person2.getBirthday());

 }

3.4日期类型总结

1.工具类注册日期

 ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.sql.Date.class);

 ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.util.Date.class);

 ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlTimestampConverter(null), java.sql.Timestamp.class);

2.自定义日期转换器(内部)

3.自定义日期格式

https://blog.csdn.net/shuaicihai/article/details/54743546

四、 BeanUtils的应用

https://blog.csdn.net/megustas_jjc/article/details/53525026

BeanUtils学习笔记的更多相关文章

  1. Springboot学习笔记(六)-配置化注入

    前言 前面写过一个Springboot学习笔记(一)-线程池的简化及使用,发现有个缺陷,打个比方,我这个线程池写在一个公用服务中,各项参数都定死了,现在有两个服务要调用它,一个服务的线程数通常很多,而 ...

  2. Digester学习笔记(一)转载

    本博文系转载,作者原文已经无法找到,感谢原作者的辛苦整理 Digester学习笔记(一) 在windows下开发程序,用M$提供的接口处理.ini文件或管理注册表的键值是非常方便的.在java平台上开 ...

  3. springmvc学习笔记(10)-springmvc注解开发之商品改动功能

    springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmvc学习笔记10-springmvc注解开发之商品改动功能 需求 开发mappe ...

  4. JavaEE精英进阶课学习笔记《博学谷》

    JavaEE精英进阶课学习笔记<博学谷> 第1章 亿可控系统分析与设计 学习目标 了解物联网应用领域及发展现状 能够说出亿可控的核心功能 能够画出亿可控的系统架构图 能够完成亿可控环境的准 ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  7. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  8. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  9. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

随机推荐

  1. php 法大大对接

    通过编写扩展实现, 实现两种方式签署 1, 存证签署 存证签署流程 /** *个人 *客户在平台注册(姓名,身份证,手机号)---->三要素验证----->获取客户编号-------> ...

  2. 如何查看mac多少位的操作系统?

    1.点击工具栏左上角点击 (苹果Logo)标志,关于本机  -->  更多信息 --> 系统报告  -->(左侧栏中)软件 (有的电脑是没有的例如第一张图) 2. 输入命令 una ...

  3. 题解【UVA12097】Pie

    题目描述 输入格式 输出格式 输入输出样例 输入样例#1 3 3 3 4 3 3 1 24 5 10 5 1 4 2 3 4 5 6 5 4 2 输出样例#1 25.1327 3.1416 50.26 ...

  4. zlt项目实践

    nacos gateWay fronted oath2 codeGenerate log-app monitor-app search-app

  5. 机器学习(ML)十五之梯度下降和随机梯度下降

    梯度下降和随机梯度下降 梯度下降在深度学习中很少被直接使用,但理解梯度的意义以及沿着梯度反方向更新自变量可能降低目标函数值的原因是学习后续优化算法的基础.随后,将引出随机梯度下降(stochastic ...

  6. 专题-集合-HashMap

    集合中的HashMap几乎是面试时必问的知识点,下面就从原理上剖析以下这个集合,看完了这一块的知识点应该就没问题了. 一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供 ...

  7. 操作系统 - epoll中的ET和LT

    参考 https://www.quora.com/What-is-meant-by-edge-triggering-and-level-triggering http://man7.org/linux ...

  8. 喵星之旅-狂奔的兔子-基于docker的rabbitmq安装

    docker安装参考:喵星之旅-狂奔的兔子-docker安装和基本使用 一.查询镜像名称 由于我们要安装的是有web管理页面的,不能直接拉取,需要指定版本. 登录docker仓库查询:https:// ...

  9. the MTS failed last time时的解决办法

    关于6.6.3SP2版本提示The MTS failed last time 1.1    发生前提条件 在重启系统 shutdown -r now后,网页打不开,发现MTS服务无法启动,我自己涉及的 ...

  10. vue路由,ajax,element-ui

    复习 """ 1.vue项目环境: node => npm(cnpm) => vue/cli 2.vue项目创建: vue create 项目 在pychar ...