常规使用:

BeanUtils不是java中的原生jar,是由第三方提供的插件。
作用:封装数据 - 主要用于封装javaBean。它可以将javaBean封装成一个字符串数据,也可以将一个表单提交的所有数据封装到javaBean中。

常用方法:**

  • setProperty(Object obj,String name,Object value) - 设置属性值,如果指定属性不存在,不抛出异常(null)。
  • getProperty(Object obj,String name) - 获得属性值,如果指定属性不存在,抛找不到异常。

**

  1. package day1.demo.ba1;
  2. import org.apache.commons.beanutils.BeanUtils;
  3. import org.junit.Test;
  4. import java.lang.reflect.InvocationTargetException;
  5. public class BeanUtilsDemo {
  6. //常规的-向User对象中封装数据
  7. @Test
  8. public void test1(){
  9. User user = new User();
  10. user.setUid("u001");
  11. user.setUserName("张三");
  12. System.out.println(user);
  13. }
  14. //使用beanUtils工具进行封装
  15. @Test
  16. public void test2() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
  17. //通过工具类的使用
  18. User user = new User();
  19. //封装配置文件
  20. BeanUtils.setProperty(user,"uid","u002");
  21. BeanUtils.setProperty(user,"userName","张三丰");
  22. BeanUtils.setProperty(user,"password","123456");
  23. System.out.println(user);
  24. //获取值
  25. String userName = BeanUtils.getProperty(user, "userName");
  26. System.out.println(userName);
  27. }
  28. }

**

populate方法的使用

BeanUtils下的方法讲解:

  • populate方法作用:将map数据封装到指定的javabean中,一般用于将表单中的所有数据封装到javaBean
  • populate(Object obj, Map)


javaBean其实就是一个实体类(对象)**

package day1.demo.ba2;

import org.apache.commons.beanutils.BeanUtils;
import org.junit.Test;

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


public class BeanUtilsDemo {
    @Test
    public void test1() throws InvocationTargetException, IllegalAccessException {
        //1.模拟数据,创建map,填充所需要的数据
        Map<String,String[]> map = new HashMap<>();
        map.put("uid",new String[]{"u007"});
        map.put("userName",new String[]{"王语嫣"});
        map.put("password",new String[]{"123"});
        //2.使用populate方法进行填充
        User user = new User();
        BeanUtils.populate(user,map);
        System.out.println(user);
    }

    /*
    使用populate方法进行填充数据2
     */
    @Test
    public void test2() throws InvocationTargetException, IllegalAccessException {
        //1.模拟数据,创建map,填充所需要的数据
        Map<String,String[]> map = new HashMap<>();
        map.put("uid",new String[]{"u008"});
        //底层:就是调用了setUserName
        map.put("userName",new String[]{"郭靖","黄蓉"});
        map.put("password",new String[]{"321"});
        map.put("hobbies",new String[]{"降龙十八掌","碧海潮生曲","打狗棒法"});
        map.put("age",new String[]{"45"});
        //2.使用populate方法进行填充
        /*
        可以指定属性,统一进行填充,需要的类型是[]
        如果属性不是数组,将使用map.value表示数组中的第一个数据 - 黄蓉不是第一个数据所以不见了
        BeanUtils支持的类型:基本类型和基本类型对应的包装类,自动将字符串转换为基本类型 - 自己做的
         */
        User user = new User();
        BeanUtils.populate(user,map);
        System.out.println(user);
    }
}

自定义一个BeanUtils工具类:

1.定义一个静态的工具类,定义的方法为populate,参数为
Object和Map,返回值为void

package day1.demo.ba3;

import org.apache.commons.beanutils.BeanUtils;

import java.util.Map;

public class MyBeanUtils {
    //自动填充
    public static void populate(Object bean,Map<String,String[]> properties){
        try{
            BeanUtils.populate(bean, properties);
        } catch (Exception e){
            throw new RuntimeException(e);
        }
    }

    //自动填充的方法,并且返回bean对象
    public static Object populate(Class beanClass, Map<String, String[]> properties){
        //使用java的反射机制实例化
        try{
            Object bean = beanClass.newInstance();
            //填充数据
            BeanUtils.populate(bean,properties);
            return bean;
        } catch (Exception e){
            //将编译时异常,转换成运行时异常,方法调用者处理
            throw new RuntimeException(e);
        }
    }
}
package day1.demo.ba3;

import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

public class MyBeanUtilsTest {
    @Test
    public void test1(){
        //1.模拟数据,创建map,填充所需要的数据
        Map<String, String[]> map = new HashMap<>();
        map.put("uid",new String[]{"u007"});
        //2.使用populate
        User user = new User();
        MyBeanUtils.populate(user,map);
        System.out.println(user);
    }
}

泛型使用

package day1.demo.ba4;

import org.apache.commons.beanutils.BeanUtils;

import java.util.Map;

/**
 * 自定义BeanUtils工具类
 *
 * 该类定义的工具类,用于展示泛型的使用
 */
public class MyBeanUtils {
    /*
    Class<T>此时这个T就是一个变量,在运行的时候,接收具体的类型。例如:User
    变量必须先定义再使用
    泛型变量的定义方式,修饰符<变量名>返回值
     */
   public static <T> T populate(Class<T> beanClass, Map<String,String[]> properties){
       try{
           //1.使用反射机制实例化
           T bean = beanClass.newInstance();
           //2.填充数据
           BeanUtils.populate(bean,properties);
           return bean;
       }catch (Exception e){
           throw new RuntimeException(e);
       }
   }
}
package day1.demo.ba4;

import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * 测试自定义泛型的BeanUtils
 */
public class MyBeanUtilsTest {
    @Test
    public void test1(){
        //1.模拟数据,创建map,填充所需要的数据
        Map<String,String[]> map = new HashMap<>();
        map.put("uid",new String[]{"u005"});
        map.put("userName",new String[]{"jack","rose"});
        map.put("password",new String[]{"666"});

        //2.进行填充 - 使用泛型规则,所以不需要进行强制转换
        User user = MyBeanUtils.populate(User.class,map);
        System.out.println(user);//User{uid='u005', userName='jack', password='666', hobbies=null, age=0}
    }
}