这是一个将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;
}