Bootstrap

生成ResultMap

生成ResultMap

自己写个工具类,懒得写resultmap了

  1. 只适用于规范命名并且类中属性和库中名一样的,
  2. 需要自己配置一下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
调整摆放顺序。

;