🍅 Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强) 🍅 基础推荐:Java基础教程系列 🍅 实战推荐:Spring Boot基础教程 🍅 简介:Java领域优质创作者🏆、CSDN哪吒公众号作者? 、Java架构师奋斗者💪 🍅 扫描主页左侧二维码,加入群聊,一起学习、一起进步 🍅 欢迎点赞 👍 收藏 ?留言 📝
一、前情提要
1、需求
由于某种原因,您可能在项目中遇到类似的需求:
- 你需要读取一个文件,比如html、json、zip等等类型的文件;
- 需要将文件内容存到bean中;
- 将bean中内容存储到数据库中;
2、您可能遇到的问题
- html的内容字段与你存储的数据库字段,字段名无法完全对应,比如大小写问题?
- 因为是读取文件,所以不知道数据的类型,只能暂时都看做String类型,但这又与数据库
中的定义不符,所以也是需要转换的。
二、代码实例
1、文件中字段名
package com.guor.entity;
import java.util.Date;
public class UserTxt {
private String ID;
private String USERname;
private String Age;
private String Address;
private String School;
private String create_date;
private String update_date;
private String DELeted;
}
2、数据库中字段名
package com.guor.entity;
import java.util.Date;
public class User {
private Integer id;
private String username;
private Integer age;
private String address;
private String school;
private Date createDate;
private Date updateDate;
private Integer deleted;
}
3、反射工具类
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Slf4j
public class ReflectUtil {
public static <T, V> V convertByReflect(T srcObject, Class<V> targetClazz) {
V targetClass = null;
try {
Class<?> srcClazz = Class.forName(srcObject.getClass().getName());
targetClass = targetClazz.newInstance();
Field[] srcFields = srcClazz.getDeclaredFields();
Field[] targetFields = targetClazz.getDeclaredFields();
for (Field srcField : srcFields) {
Object value = invokeGetMethod(srcObject, srcField.getName());
for (Field targetField : targetFields) {
if (srcField.getName().toLowerCase().equals(targetField.getName().toLowerCase())) {
if (srcField.getType().equals(targetField.getType())) {
setFieldValue(targetField, targetClass, value);
} else {
setFieldValueByType(targetField, targetClass, value);
}
}
}
}
} catch (Exception e) {
log.error("convertByReflect Error {}", e.getMessage());
return null;
}
return targetClass;
}
public static <V, T> T mapToBean(Map<String, V> map, Class<T> targetClazz) {
T targetClass = null;
try {
targetClass = targetClazz.newInstance();
Field[] targetFields = targetClazz.getDeclaredFields();
for (Map.Entry<String, V> entry : map.entrySet()) {
for (Field targetField : targetFields) {
if (entry.getKey().toLowerCase().equals(targetField.getName().toLowerCase())) {
if (entry.getValue().getClass().getTypeName().equals(targetField.getType())) {
setFieldValue(targetField, targetClass, entry.getValue());
} else {
setFieldValueByType(targetField, targetClass, entry.getValue());
}
}
}
}
} catch (Exception e) {
log.error("mapToBean Error {}", e.getMessage());
return null;
}
return targetClass;
}
public static <T, V> List<V> convertListByReflect(List<T> srcObjectList, Class<V> targetClazz) {
List<V> retList = new ArrayList<V>();
try {
V targetClass = targetClazz.newInstance();
for (T srcObject : srcObjectList) {
targetClass = convertByReflect(srcObject, targetClazz);
if (targetClass == null) {
return new ArrayList<V>();
}
retList.add(targetClass);
}
} catch (Exception e) {
log.error("convertByReflect Error {}", e.getMessage());
return new ArrayList<V>();
}
return retList;
}
private static Object invokeGetMethod(Object clazz, String fieldName) {
String methodName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Method method = null;
try {
method = Class.forName(clazz.getClass().getName()).getDeclaredMethod("get" + methodName);
return method.invoke(clazz);
} catch (Exception e) {
return "";
}
}
private static void setFieldValue(Field field, Object obj, Object value) throws IllegalAccessException {
boolean access = field.isAccessible();
try {
field.setAccessible(true);
field.set(obj, value);
} finally {
field.setAccessible(access);
}
}
private static void setFieldValueByType(Field targetField, Object target, Object value)
throws IllegalAccessException {
Class<?> targetType = targetField.getType();
String valueStr = String.valueOf(value);
if (targetType == Integer.class) {
setFieldValue(targetField, target, Integer.valueOf(valueStr));
} else if (targetType == Double.class) {
setFieldValue(targetField, target, Double.valueOf(valueStr));
} else if (targetType == Float.class) {
setFieldValue(targetField, target, Float.valueOf(valueStr));
} else if (targetType == Boolean.class) {
setFieldValue(targetField, target, Boolean.parseBoolean(valueStr));
} else if (targetType == Long.class) {
setFieldValue(targetField, target, Long.parseLong(valueStr));
} else if (targetType == Short.class) {
setFieldValue(targetField, target, Short.parseShort(valueStr));
} else if (targetType == Date.class) {
String dateStr = StrUtil.getDigital(valueStr);
setFieldValue(targetField, target, StrUtil.stringToDate(dateStr, "yyyyMMddHHmmss"));
} else {
setFieldValue(targetField, target, valueStr);
}
}
}
更多内容详见:【Java 代码实例 2】利用Java反射实现两个具有相同属性bean赋值
三、哪吒社区
1、Vue.js 3.0从入门到实战
2、SQL从入门到精通
3、MySql数据库从入门到实战
4、Oracle数据库管理从入门到精通
【赚取积分方式】哪吒社区内发帖、点赞、评论都可赢取积分!
🍅 社区入口:【打卡贴 day31】理解ThreadLocal
上一篇:Java零基础入门 15:java异常
下一篇:Java零基础入门 17:java类加载与初始化
添加微信,备注1024,赠送Java学习路线思维导图
|