生成ResultMap
自己写个工具类,懒得写resultmap了
- 只适用于规范命名并且类中属性和库中名一样的,
- 需要自己配置一下id
import com..MallOrderListV2Info;
import org.junit.Test;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @Description:
* @Param:
* @return:
* @Author: guojx_a
* @Date: 2021/8/10
*/
public class FastResultMap {
@Test
public void class2ResultMap() throws ClassNotFoundException {
String resultMap = FastResultMap.generate(MallOrderListV2Info.class);
System.out.println(resultMap);
}
private static Pattern humpPattern = Pattern.compile("[A-Z]");//匹配大写字母的正则
private static final Map<String, String> TYPE_MAP = new HashMap<>();//java类型和jdbc类型的对应关系
static {
//以下对应规则可根据自己的实际情况做修改
TYPE_MAP.put("string", "VARCHAR");
TYPE_MAP.put("boolean", "BIT");
TYPE_MAP.put("byte", "TINYINT");
TYPE_MAP.put("short", "SMALLINT");
TYPE_MAP.put("integer", "INTEGER");
TYPE_MAP.put("long", "BIGINT");
TYPE_MAP.put("float", "REAL");
TYPE_MAP.put("double", "DOUBLE");
TYPE_MAP.put("date", "DATE");//TIMESTAMP,DATETIME
TYPE_MAP.put("timestamp", "TIMESTAMP");
TYPE_MAP.put("time", "TIME");
TYPE_MAP.put("bigdecimal", "DECIMAL");
}
/**
* 生成ResultMap
* @param clazz 实体类的Class
* @return String
*/
public static String generate(Class<?> clazz) throws ClassNotFoundException {
String pkgName = clazz.getName();
String clazzName = clazz.getSimpleName();//获取全路径
String resultMapId = Character.toLowerCase(clazzName.charAt(0))+clazzName.substring(1)+"Map";
StringBuilder resultMap = new StringBuilder();
resultMap.append("<resultMap id=\"");
resultMap.append(resultMapId);
resultMap.append("\" type=\"");
resultMap.append(pkgName);
resultMap.append("\">\n");
resultMap.append(generateResult(clazz));
resultMap.append("</resultMap>");
return resultMap.toString();
}
/**
* @Description: 负责生成《result
* @Param: [clazz]
* @return: java.lang.String
* @Author: guojx_a
* @Date: 2021/8/10
*/
public static String generateResult(Class<?> clazz) throws ClassNotFoundException {
StringBuilder resultMap = new StringBuilder();
String pkgName = clazz.getName();
String clazzName = clazz.getSimpleName();//获取全路径
String resultMapId = Character.toLowerCase(clazzName.charAt(0))+clazzName.substring(1)+"Map";
Field[] fields = clazz.getDeclaredFields();
for(Field f : fields){
String property = f.getName();
String javaType = f.getType().getSimpleName();
if("serialVersionUID".equals(property)){
continue;//忽略掉这个属性
}
if (javaType2jdbcType(javaType.toLowerCase())!="UNKNOWN") {
resultMap.append(" <result column=\"");
// resultMap.append(property2Column(property));//小写用这个
resultMap.append(property2Column(property).toUpperCase());//大写用这个
resultMap.append("\" jdbcType=\"");
resultMap.append(javaType2jdbcType(javaType.toLowerCase()));
resultMap.append("\" property=\"");
resultMap.append(property);
resultMap.append("\" />\n");
}else if (f.getType().getSimpleName().equals("List")){
resultMap.append("\n");
resultMap.append(" <collection property=\"");
resultMap.append(property);
resultMap.append("\" javaType=\"java.util.ArrayList\" ofType=\"");
//通过反射获取泛型
ParameterizedType parameterizedType = (ParameterizedType) f.getGenericType();
Type[] actualTypes = parameterizedType.getActualTypeArguments();
for (Type type : actualTypes) {
resultMap.append(type.getTypeName());
resultMap.append("\">\n");
System.out.println(type.getTypeName()+"!!!!");
resultMap.append(generateResult(Class.forName(type.getTypeName())));
}
// resultMap.append(f.getGenericType().getTypeName());
resultMap.append(" </collection>");
resultMap.append("\n");
}else {
// System.out.println(f.getType().getSimpleName()+"!!!!!!!!");
// System.out.println(f.getType()); 获取路径
resultMap.append(" <association property=\"");
resultMap.append(property);
resultMap.append("\" javaType=\"");
resultMap.append(f.getType().toString().substring(6));
resultMap.append("\" >\n");
// System.out.println(f.getType()+"!!!!!!");
System.out.println(f.getType().toString().substring(6)+"!!");
resultMap.append(generateResult(Class.forName(f.getType().toString().substring(6))));//
resultMap.append(" </association>\n");
}
}
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();
}
//通过java类型获取jdbc类型
private static String javaType2jdbcType(String javaType){
String jdbcType = TYPE_MAP.get(javaType);
return jdbcType==null ? "UNKNOWN" : jdbcType;
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c9syua4r-1628751940058)(D:/desktop/%E6%88%91%E7%9A%84%E7%AC%94%E8%AE%B0/pichome/image-20210810165226479.png)]
请根据自己需求自行修改
记录报错
异常处理:java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.Parameterized
原因是有个类里面String 写出List 没泛型 加载不出来
异常处理
元素类型为 “association” 的内容必须匹配 “(constructor?,id*,result*,association*,collection*,discriminator?)”
元素类型为 “association” 的内容必须匹配 "或者元素类型为 “collection” 的内容必须匹配 "
请按照 ,id*,result*,association*,collection*,discriminator的顺序检查 resultmap
调整摆放顺序。