把QueryForList结果封装成javabean

1、apache.commons包大家一定都用过,提供了许多优秀的API。对于Map<String,Object>这样的数据,apache.common提供了一个beanUtils的工具类来实现javabean的封装。

实例:

        String sql1 = "SELECT * FROM app_teacher  WHERE order_num>=? AND order_num<? AND owner_school_id=?";     
        Object[] args1 = { newNum, orderNum, schoolId };
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql1, args1); 
        List<Teacher> list2=new ArrayList<>();
        Teacher teacher=null;
        for (Map<String, Object> map : list) {
         teacher=new Teacher();
            try {
                BeanUtils.populate(teacher, map);//把map映射成实体
                list2.add(teacher);//放入list中
            } catch (Exception e) {            
                e.printStackTrace();
            }            
        }

2、Java反射

一、什么是java反射

        简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,

        那么就可以通过反射机制来获得类的所有信息。 在刚刚学习jdbc时用过一行代码,Class.forName("com.mysql.jdbc.Driver.class").newInstance();这就是反射,现在很多开 框架都用到反射机制,比如hibernate、struts、springMVC都是用反射机制实现的。

二、反射的优点

         静态编译:在编译时确定类型,绑定对象,即通过。

         动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。

 三、反射的功能

    1)只要给定类的全名,即可通过反射获取类的所有信息。

    2)反射可以在程序运行时获取任意一个对象所属的类对象。

    3)在运行时可以获取到类中所有属性对象,并对其操作(包括私有属性)。

    4)在运行时可以获取到类中、父类中所有方法,并调用。

四、反射动态加载类,在运行期加载所需的类四种方式。

1.根据给定的类名来获得用于类加载

String classname = "cn.itcast.reflect.Person";// 来自配置文件

Class clazz = Class.forName(classname);// 此对象代表Person.class

2.如果拿到了对象,不知道是什么类型于获得对象的类型

Object obj = new Person();

Class clazz1 = obj.getClass();// 获得对象具体的类型

3.如果是明确地获得某个类的Class对象,主要用于传参

Class clazz2 = Person.class;

Object ob=clazz.newInstance()可以实例化一个对象

如果知道具体是什么类型,可以进行强制转换

五、Field对象概述

     (1)Java.lang.reflect.Field类,是用于表示类中、接口中属性对象的类。

     (2)可以操作类中私有,以及公有等全部属性和属性的信息。   

     (3)Field对象的常用方法介绍

     getName()获得属性名称、 getType()获得属性类型、get(Object obj)取得obj对象中这个属性的值、

    set(Object obj, Object value)向obj对象中这个属性赋值value、setAccessible(true)启用/禁用访问控制权限(对私有的属性操作,必须设置为true)

六、Method对象方法介绍

    (1)java.lang.reflect.Method类是用于表示类中、接口中方法对象的类。

    (2)可以操作类中私有,以及公有等全部方法。   

    (3)Method对象的常用方法介绍

      getName()获得方法名称、getReturnType()获得方法返回值类型、invoke(Object obj, Object... args)利用obj对象调用该方法、getParameterTypes()获得方法所有参数类型,按照顺序返回Class数组、getDeclaredAnnotations()

获取方法的全部注解、getSimpleName()获得类名

七、利用反射来封装实体

public class ToEntityUtil {
    private final static Logger LOGGER = LoggerFactory
            .getLogger(ToEntityUtil.class);
    @SuppressWarnings("unchecked")
    public static <T> List<T> toEntity(Class<T> clazz,
            List<Map<String, Object>> list) {
        List<T> l = new ArrayList<T>();
        try {
            for (Map<String, Object> map : list) {
                Object object = clazz.newInstance();
                Field[] fields = clazz.getDeclaredFields();
                for (int i = 0; i < fields.length; i++) {
                    fields[i].setAccessible(true);//一定要设置为true
                    if (fields[i].getType().toString()
                            .equals("class java.lang.String")) {
                        fields[i].set(object,
                                (String) map.get(fields[i].getName()));
                    }
                    if (fields[i].getType().toString()
                            .equals("class java.lang.Integer")) {
                        fields[i].set(object,
                                (Integer) map.get(fields[i].getName()));
                    }
                    if (fields[i].getType().toString()
                            .equals("class java.lang.Date")) {
                        fields[i].set(object,
                                (Date) map.get(fields[i].getName()));
                    }    
                    //可以自定义多中年类型进行比较            
                }

                l.add((T) object);
            }
        } catch (Exception e) {
            LOGGER.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>失败" + e);
        }
        return l;
    }
}

 




你可能感兴趣的:(把QueryForList结果封装成javabean)