天天看點

mybatis-generator源碼修改—修改實體類型

在使用mybatis-generator生成的代碼中,對于數值類型的字段,一般會根據字段的大小生成Short和Long,但是在實際使用中,我習慣将整數定義為整型,另外發現Float類型會生成Double的實體,是以一直希望把這一點改一下。

我們先找到生成實體的地方,在org.mybatis.generator.codegen.mybatis3.model.BaseRecordGenerator,我們找到生成實體成員的地方,在方法getCompilationUnits()裡面找到這句代碼:

Field field = getJavaBeansField(introspectedColumn, context, introspectedTable);      

通過getJavaBeansField這個方法可以找到,擷取實體成員類型的關鍵代碼為:

FullyQualifiedJavaType fqjt = introspectedColumn.getFullyQualifiedJavaType();      

我們通過setFullyQualifiedJavaType這個方法,可以找到生成這個類的地方:

org.mybatis.generator.internal.db.DatabaseIntrospector的calculateExtraColumnInformation()這個方法。      

我們找到

FullyQualifiedJavaType fullyQualifiedJavaType = javaTypeResolver.calculateJavaType(introspectedColumn);      

這句代碼,進到calculateJavaType()這個方法裡面,發現了關鍵的代碼:

JdbcTypeInformation jdbcTypeInformation = typeMap.get(introspectedColumn.getJdbcType());      

這個typeMap裡面存放了jdbc類型對應的java類型,修改float類型為:

mybatis-generator源碼修改—修改實體類型

 我們繼續看calculateJavaType()這個方法,

answer = overrideDefaultType(introspectedColumn, answer);      

進入到overrideDefaultType這個方法裡面,修改number類型,指定為整型

mybatis-generator源碼修改—修改實體類型

進入calculateBigDecimalReplacement這個方法,修改如下:

protected FullyQualifiedJavaType calculateBigDecimalReplacement(IntrospectedColumn column, FullyQualifiedJavaType defaultType) {
        FullyQualifiedJavaType answer;

        if(isAllNumberToInteger){
            //所有的數字都轉換成整型, add by chenyk on 20220417
            answer = new FullyQualifiedJavaType(Integer.class.getName());
        }
        else {
            if (column.getScale() > 0 || column.getLength() > 18 || forceBigDecimals) {
                answer = defaultType;
            } else if (column.getLength() > 9) {
                answer = new FullyQualifiedJavaType(Long.class.getName());
            } else if (column.getLength() > 4) {
                answer = new FullyQualifiedJavaType(Integer.class.getName());
            } else {
                answer = new FullyQualifiedJavaType(Short.class.getName());
            }
        }

        return answer;
    }
           

 我在generatorConfig.xml加了isAllNumberToInteger這個配置:

<javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
            <property name="isAllNumberToInteger" value="true"></property>
        </javaTypeResolver>