import com.sinolife.mssp.reward.task.domain.TaskInfoExt;
import java.lang.reflect.Field;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DaoTest {
public static void main(String[] args) {
System.out.println(getResultMap(TaskInfoExt.class));
System.out.println("----------------------------------------------------------------");
System.out.println(getUpdateSelective(TaskInfoExt.class));
System.out.println("----------------------------------------------------------------");
System.out.println(getInsert(TaskInfoExt.class));
System.out.println("----------------------------------------------------------------");
System.out.println(getColumns(TaskInfoExt.class));
}
private static Pattern humpPattern = Pattern.compile("[A-Z]");
public static String getUpdateSelective(Class<?> clazz) {
Object obj = null;
try {
obj = clazz.newInstance();
} catch (Exception e) {
return "#Exception.反射生成实体异常#";
}
String clazzName = clazz.getSimpleName();
String resultMapId = Character.toLowerCase(clazzName.charAt(0)) + clazzName.substring(1) + "Map";
String pkgName = clazz.getName();
StringBuilder resultMap = new StringBuilder();
resultMap.append("<update id=\"updateSelective\" parameterType=\"");
resultMap.append(pkgName);
resultMap.append("\">\n");
resultMap.append("UPDATE X_TABLE");
resultMap.append("\n<set>\n");
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
String property = f.getName();
String javaType = f.getType().getName();
if ("serialVersionUID".equals(property)) {
continue;
}
resultMap.append(" <if test=\"");
resultMap.append(property + "!=null\">\n");
resultMap.append(property2Column(property).toUpperCase());
resultMap.append("=#{" + property + ", jdbcType=" + javaType2jdbcType(javaType.toLowerCase()) + "},\n</if>\n");
}
resultMap.append("</set>\n");
resultMap.append("where id = #{id,jdbcType=VARCHAR}\n");
resultMap.append("</update>");
return resultMap.toString();
}
public static String getInsert(Class<?> clazz) {
StringBuffer sb = new StringBuffer();
String text = getUpdateSelective(clazz);
Pattern p = Pattern.compile("#\\{[^}]+}");
Matcher m = p.matcher(text);
while (m.find()) {
sb.append(m.group()).append(",\n");
}
return sb.toString();
}
public static String getColumns(Class<?> clazz) {
StringBuffer sb = new StringBuffer();
String text = getResultMap(clazz);
Pattern p = Pattern.compile("column=[\"\\w\"]+");
Matcher m = p.matcher(text);
while (m.find()) {
Pattern p1 = Pattern.compile("[\"\\w\"]+$");
Matcher m1 = p1.matcher(m.group());
while (m1.find()) {
Pattern p2 = Pattern.compile("[\\w]+");
Matcher m2 = p2.matcher(m1.group());
while (m2.find()) {
sb.append(m2.group().toUpperCase()).append(",");
}
}
}
return sb.toString();
}
public static String getResultMap(Class<?> clazz) {
Object obj = null;
try {
obj = clazz.newInstance();
} catch (Exception e) {
return "#Exception.反射生成实体异常#";
}
String clazzName = clazz.getSimpleName();
String resultMapId = Character.toLowerCase(clazzName.charAt(0)) + clazzName.substring(1) + "Map";
String pkgName = clazz.getName();
StringBuilder resultMap = new StringBuilder();
resultMap.append("<resultMap id=\"");
resultMap.append(resultMapId);
resultMap.append("\" type=\"");
resultMap.append(pkgName);
resultMap.append("\">\n");
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
String property = f.getName();
String javaType = f.getType().getName();
if ("serialVersionUID".equals(property)) {
continue;
}
resultMap.append(" <result column=\"");
resultMap.append(property2Column(property).toUpperCase());
resultMap.append("\" property=\"");
resultMap.append(property);
resultMap.append("\" jdbcType=\"");
resultMap.append(javaType2jdbcType(javaType.toLowerCase()));
resultMap.append("\" />\n");
}
resultMap.append("</resultMap>");
return resultMap.toString();
}
private static String property2Column(String property) {
Matcher matcher = humpPattern.matcher(property);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
}
matcher.appendTail(sb);
return sb.toString();
}
private static String javaType2jdbcType(String javaType) {
if (javaType.contains("string")) {
return "VARCHAR";
} else if (javaType.contains("boolean")) {
return "BIT";
} else if (javaType.contains("byte")) {
return "TINYINT";
} else if (javaType.contains("short")) {
return "SMALLINT";
} else if (javaType.contains("int")) {
return "INTEGER";
} else if (javaType.contains("long")) {
return "BIGINT";
} else if (javaType.contains("double")) {
return "DOUBLE";
} else if (javaType.contains("float")) {
return "REAL";
} else if (javaType.contains("date")) {
return "TIMESTAMP";
} else if (javaType.contains("timestamp")) {
return "TIMESTAMP";
} else if (javaType.contains("time")) {
return "TIME";
} else if (javaType.contains("bigdecimal")) {
return "DECIMAL";
} else {
return "未知类型";
}
}
}