在使用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類型為:
我們繼續看calculateJavaType()這個方法,
answer = overrideDefaultType(introspectedColumn, answer);
進入到overrideDefaultType這個方法裡面,修改number類型,指定為整型
進入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>