用反射去拼接sql
原因:公司项目使用jpa去修改数据库信息,原项目新增和修改直接调用jpq的save方法既可以,但现要求接口接收到部分实体类的参数,就只修改部分参数,故jpa的save方法达不到要求,所以要手动去组装sql,但是,实体类参数太多,判断非空太繁琐,所以想写一个方法去组装sql。
直接上代码
<T> String dtoToString(T t) {
//获得某个类的所有声明的字段,即包括public、private和proteced
Field[] declaredFields = t.getClass().getDeclaredFields();
StringBuffer stringBuffer = new StringBuffer("");
String name1 = t.getClass().getSimpleName();
System.out.println(name1);
// 遍历,拼接sql
for (Field field : declaredFields) {
String name = field.getName();
try {
// 获取值
field.setAccessible(true);
Object o = field.get(t);
// 判断值是不是存在&& o.toString().equals("0")
if (!Objects.isNull(o) && !isBaseDefaultValue(o)){
if (!stringBuffer.toString().equals("")){
stringBuffer.append(",");
}
stringBuffer.append(name).append("='").append(o).append("'");
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
System.out.println(stringBuffer.toString());
return stringBuffer.toString();
}
/**
* 判断是不是默认值
* @param object
* @return
*/
public static boolean isBaseDefaultValue(Object object) {
Class className = object.getClass();
String strClassName = "" + className;
if(className.equals(java.lang.Integer.class)) {
return (int)object == 0;
} else if(className.equals(java.lang.Byte.class)) {
return (byte)object == 0;
} else if(className.equals(java.lang.Long.class)) {
return (long)object == 0L;
} else if(className.equals(java.lang.Double.class)) {
return (double)object == 0.0d;
} else if(className.equals(java.lang.Float.class)) {
return (float)object == 0.0f;
} else if(className.equals(java.lang.Character.class)) {
return (char)object == '\u0000';
} else if(className.equals(java.lang.Short.class)) {
return (short)object == 0;
} else if(className.equals(java.lang.Boolean.class)) {
return (boolean)object == false;
}
return false;
}
但该代码依旧存在部分问题,譬如boolean类型传入的就是false呢,该方法无法去判断。慎用!!!