使用反射将req.getParameterMap()赋值给实体类

这是一个将Map<String, String[]> 类型的map集合赋值给一个实体类。

这个map集合是以   map={ key1 = {value1 , value2} ,key2={value1 ,value2} . . .}的形式,需要理清楚每一步遍历。

思路:1、构造实体类的无参构造,创建对象;

2、通过反射实体类中的set方法设置实体类的属性值(需要注意:1、map集合中的键值对是无序的;2、前端传过来的数据不都是实体类的属性,常常有action=value这样的键值对存在map集合中,需要将其剔除);

3、还有一个思路是反射实体类的有参构造器,同样也需要剔除无关数据,还有将键值对按照构造器顺序传进去。

注意 :1、此方法适用于数据库中字段名是name,不适用字段名是 t_name ,可在代码中使用String类中的方法进行截取

2、代码中的获得参数的数据类型为常用类型,可根据数据库中的字段类型添加代码片段

 public static <T> T parameterMapToBean(HttpServletRequest req, Class<T> clazz) {

        //获得参数的map集合
        Map<String, String[]> map = req.getParameterMap();

        //获取实体类的对象
        T bean = null;
        try {
            bean = clazz.newInstance();
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }

        //获取实体类的所有方法
        Method[] methods = clazz.getDeclaredMethods();
        //开始遍历实体类方法
        for (Method method : methods) {
            //判断方法名是否以set开头
            if (method.getName().startsWith("set")) {
                //遍历map集合中的key
                for (Map.Entry<String, String[]> entry : map.entrySet()) {
                    //判断方法名末尾是否和map的key一致,比较的时候将方法名全部转为小写
                    if (method.getName().toLowerCase().endsWith(entry.getKey())) {
                        //遍历map中的value值,因为map中是以 k1={v1,v2} ,k2={v3,v4}的形式存储数据的
                        try {
                            for (String e : entry.getValue()) {
                                //获取set方法中的参数类型
                                Class<?>[] parameterTypes = method.getParameterTypes();
                                //因为set方法的参数类型只有一个,所以取第一个
                                Class<?> parameterType = parameterTypes[0];
                                //获得参数类型的名字
                                String simpleName = parameterType.getSimpleName();
                                //比较参数类型名并将获得的String类型的数据转换为对应实体类的数据
                                if ("String".equals(simpleName)) {
                                    method.invoke(bean, e);
                                } else if ("Integer".equals((simpleName)) || "int".equals((simpleName))) {
                                    int ee = Integer.parseInt(e);
                                    method.invoke(bean, ee);
                                } else if ("Double".equals((simpleName)) || "double".equals((simpleName))) {
                                    double ee = Double.parseDouble(e);
                                    method.invoke(bean, ee);
                                }
                                //其他类型可以添加,以上举出常用的数据类型
                            }
                        } catch (IllegalAccessException e) {
                            throw new RuntimeException(e);
                        } catch (InvocationTargetException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }

            }

        }
        //返回对象
        return bean;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值