mybatis 多表查询resultMap嵌套映射生成器

这是一个Java工具类,用于根据实体类自动生成对应的ResultMap,简化MyBatis的配置。它使用反射机制遍历实体类的所有字段,转换字段名并生成相应的XML映射代码。
摘要由CSDN通过智能技术生成
  1. 加入代码

将下面的代码粘贴到项目中,之后调用即可

package com.neuedu.myproject;

import java.lang.reflect.Field;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 根据实体生成对应的ResultMap
 * @author wangxh
 * @date 2017-10-12 09:44:23
 */
public class ResultMapUtil {
    private  Pattern humpPattern = Pattern.compile("[A-Z]");

    List<String> ListObject = new LinkedList<>();
    List<String> stringList = new LinkedList<>();

    List<String> Lists = new LinkedList<>();
    /**
     * 获取ResultMap
     * @param clazz 实体类的Class
     * @return String
     */
    public void getResultMap(Class<?> clazz) throws ClassNotFoundException {
        try{
            getresultMap(clazz,0);
        }catch (Exception e){
            e.printStackTrace();
            return ;
        }
    }

    private void getresultMap(Class<?> clazz, int i) throws ClassNotFoundException {
        getresultMap(clazz,0,null,"");
    }

    private void getresultMap (Class<?> clazz,int num,String strd,String fieldName) throws ClassNotFoundException {

        Field[] fields = clazz.getDeclaredFields();
        if (num == 0){
            System.out.println("<resultMap id=\""+ "set"+ clazz.getName() +"\" type=\""+ clazz.getName()+"\">");
        }else {
            for (int i = 0 ;i < num+2;i++){
                System.out.print(" ");
            }
            System.out.println("<collection property=\""+ fieldName + "\" javaType=\""+ strd +"\" ofType=\""+ clazz.getName()+"\" >");
        }
        for(Field field : fields){
            String javaType = field.getType().getName();
            if (!javaType.equals(javaType2jdbcType(javaType))){
                for (int i = 0 ;i < num+4;i++){
                    System.out.print(" ");
                }
                System.out.println("<result property=\""+field.getName()+"\" column=\""+property2Column(field.getName())+"\"></result>");
            }else {
                javaType = String.valueOf(field.getGenericType());
                Lists.add(field.getName());
                if(javaType(javaType).equals("list")){
                    javaType = javaType.substring(javaType.indexOf("<")+1,javaType.indexOf(">"));
                    if(!javaType.equals(javaType2jdbcType(javaType))) {
                        for (int i = 0 ;i < num+4;i++){
                            System.out.print(" ");
                        }
                        System.out.println("<collection property=\""+field.getType().getName()+"\" ofType=\""+javaType+"\" >");
                        for (int i = 0 ;i < num+6;i++){
                            System.out.print(" ");
                        }
                        System.out.println(" <result column=\"" +field.getName() +"\"/>");
                        for (int i = 0 ;i < num+4;i++){
                            System.out.print(" ");
                        }
                        System.out.println("</collection>");
                        continue;
                    }
                    stringList.add("list");

                }else {
                    stringList.add(javaType(javaType));
                    javaType = field.getType().getName();
                }
                ListObject.add(javaType);
            }
        }
        ResultMapUtil resultMapUtil = new ResultMapUtil();
        for (int i = 0;i <  ListObject.size();i++){
            resultMapUtil.getresultMap(Class.forName(ListObject.get(i)),num+2,stringList.get(i),Lists.get(i));
        }
        if (num == 0){
            System.out.println("</resultMap>");
        }else {
            for (int i = 0 ;i < num+2;i++){
                System.out.print(" ");
            }
            System.out.println("</collection>");
        }
    }

    private  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  String javaType2jdbcType(String Type){
        String javaType = Type.toLowerCase();
        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 "DATE";
        }else if(javaType.contains("timestamp")){
            return "TIMESTAMP";
        }else if(javaType.contains("time")){
            return "TIME";
        }else if(javaType.contains("bigdecimal")){
            return "DECIMAL";
        }else {
            return Type;
        }
    }

    private  String javaType(String Type){
        String javaType = Type.toLowerCase();
        if(javaType.contains("list")){
            return "list";
        }else {
            return "Object";
        }
    }
}
  1. 调用(还在测试中生成后请自行检查修改)

这样就可以生成对应的resultMap类映射了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值