想要将如下数据存储到实体类中,然后再存储到数据库中
for (int i = 0; i < array.length(); i++) {
JSONObject temp = array.getJSONObject(i);
String id = temp.getString("id");
String sysCode = temp.getString("sysCode");
String time = temp.getString("time");
Integer type = temp.getInt("type");
String moduleNames = temp.getString("moduleNames");
Integer score = temp.getInt("score");
String desc = temp.getString("desc");
RepositoryInfo month = new RepositoryInfo(id, sysCode, time, type, moduleNames, score, desc);
// TODO 调用保存方法
}
优雅写法
思路:
自定义一个注解(里面包含 json串中的key值 和 value值的类型)
接着实体类的setXXX方法上使用该注解
然后使用无参构造实例化对象,接着使用setXXX方法将 json串的 value值赋值到该对象中
最后调用保存方法将其保存到数据库中
1、自定义注解
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {
// 映射的字段名
String name();
}
2、实体类中添加该注解到set字段上
// 这里仅列出关键的内容,其他就是普通的实体类的属性
@Anno(name = "id")
public void setId(String id) {
this.id = id;
}
@Anno(name = "sysCode")
public void setSysCode(String sysCode) {
this.sysCode = sysCode;
}
@Anno(name = "time")
public void setTime(String time) {
this.time = time;
}
@Anno(name = "type")
public void setTypes(Integer types) {
this.types = types;
}
@Anno(name = "moduleNames")
public void setModuleName(String moduleNames) {
this.moduleNames = moduleNames;
}
@Anno(name = "score")
public void setScore(Integer score) {
this.score = score;
}
@Anno(name = "desc")
public void setDesc(String desc) {
this.desc = desc;
}
3、使用反射处理
// 类名
String className = "RepositoryInfo";
// 获取class对象
Class<?> clazz = Class.forName(className);
// 获取该对象的所有公共的方法
Method[] methods = clazz.getMethods();
for (int i = 0; i < array.length(); i++) {
JSONObject temp = array.getJSONObject(i);
// 使用无参构造实例化对象
Object instance = clazz.newInstance();
for (Method method : methods) {
// 如果该公共的方法有 Anno 这个注解
if (method.isAnnotationPresent(Anno.class)) {
// 获取到该注解
DataRankSetAnno column = method.getAnnotation(Anno.class);
// 获取该方法的参数类型
String paramType = method.getParameterTypes()[0].getName();
System.out.println(column.name() + " " + temp.get(column.name()));
// 调用有该注解的方法 setXXX(XXX)
if ("java.lang.String".equals(paramType)) {
method.invoke(instance, temp.getString(column.name()));
} else if ("java.lang.Integer".equals(paramType)) {
method.invoke(instance, temp.getInt(column.name()));
}
}
}
System.out.println(instance);
// TODO 调用保存方法
}
以上就是 将初级开发人员的代码 简单升级了一下
因为很多开源的框架基本都使用了自定义注解 + 反射的内容,有兴趣的可以学习一下
当然 若你闲麻烦,或者觉得几行代码的逻辑就能搞完的事,那我也emmmm…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)