在使用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>