Skip to content

Commit cf3e40a

Browse files
author
wugh
committed
[bug修复] 修复generateDefaultInstanceMethod参数,生成的实体类的defaultInstance静态方式. 1.存在默认值为''::character varying问题 2.支持基本类型
1 parent b4acbf4 commit cf3e40a

File tree

1 file changed

+29
-5
lines changed

1 file changed

+29
-5
lines changed

generator/src/main/java/tk/mybatis/mapper/generator/MapperPlugin.java

+29-5
Original file line numberDiff line numberDiff line change
@@ -223,20 +223,32 @@ private void processEntityClass(TopLevelClass topLevelClass, IntrospectedTable i
223223
}
224224
}
225225
if (generateDefaultInstanceMethod) {
226+
//注意基本类型和包装的index要一致,方便后面使用
227+
List<String> baseClassName = Arrays.asList("byte", "short", "char", "int", "long", "float", "double", "boolean");
228+
List<String> wrapperClassName = Arrays.asList("Byte", "Short", "Character", "Integer", "Long", "Float", "Double", "Boolean");
229+
List<String> otherClassName = Arrays.asList("String", "BigDecimal", "BigInteger");
226230
Method defaultMethod = new Method();
231+
//增加方法注释
232+
defaultMethod.addJavaDocLine("/**");
233+
defaultMethod.addJavaDocLine(" * 带默认值的实例");
234+
defaultMethod.addJavaDocLine("*/");
227235
defaultMethod.setStatic(true);
228236
defaultMethod.setName("defaultInstance");
229237
defaultMethod.setVisibility(JavaVisibility.PUBLIC);
230238
defaultMethod.setReturnType(topLevelClass.getType());
231239
defaultMethod.addBodyLine(String.format("%s instance = new %s();", topLevelClass.getType().getShortName(), topLevelClass.getType().getShortName()));
232240
for (IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) {
233241
String shortName = introspectedColumn.getFullyQualifiedJavaType().getShortName();
234-
List<String> supportType = Arrays.asList("Byte", "Short", "Character", "Integer", "Long", "Float", "Double", "String", "BigDecimal", "BigInteger");
235-
if (!supportType.contains(shortName)) {
242+
if (!baseClassName.contains(shortName) && !wrapperClassName.contains(shortName) && !otherClassName.contains(shortName)) {
236243
continue;
237244
}
238245
if (introspectedColumn.getDefaultValue() != null) {
239246
String defaultValue = introspectedColumn.getDefaultValue();
247+
//处理备注中带有类型描述情况,如 postgresql中存在 ''::character varying
248+
if (defaultValue.matches("'\\.*'::\\w+(\\s\\w+)?")) {
249+
//
250+
defaultValue = defaultValue.substring(0, defaultValue.lastIndexOf("::"));
251+
}
240252
//去除前后'',如 '123456' -> 123456
241253
if (defaultValue.startsWith("'") && defaultValue.endsWith("'")) {
242254
if (defaultValue.length() == 2) {
@@ -246,15 +258,27 @@ private void processEntityClass(TopLevelClass topLevelClass, IntrospectedTable i
246258
}
247259
}
248260
//暂不支持时间类型默认值识别,不同数据库表达式不同
249-
if ("Boolean".equals(shortName)) {
261+
if ("Boolean".equals(shortName) || "boolean".equals(shortName)) {
250262
if ("0".equals(defaultValue)) {
251263
defaultValue = "false";
252264
} else if ("1".equals(defaultValue)) {
253265
defaultValue = "true";
254266
}
255267
}
256-
//通过 new 方法转换
257-
defaultMethod.addBodyLine(String.format("instance.%s = new %s(\"%s\");", introspectedColumn.getJavaProperty(), shortName, defaultValue));
268+
269+
if ("String".equals(shortName)) {
270+
//字符串,不通过new String 创建
271+
// 其实通过new String 没有任何问题,不过强迫症,idea会提示,所以改了
272+
defaultMethod.addBodyLine(String.format("instance.%s = \"%s\";", introspectedColumn.getJavaProperty(), defaultValue));
273+
} else {
274+
String javaProperty = introspectedColumn.getJavaProperty();
275+
if (baseClassName.contains(shortName)) {
276+
//基本类型,转成包装类的new 创建
277+
javaProperty = wrapperClassName.get(baseClassName.indexOf(shortName));
278+
}
279+
//通过 new 方法转换
280+
defaultMethod.addBodyLine(String.format("instance.%s = new %s(\"%s\");", javaProperty, shortName, defaultValue));
281+
}
258282
}
259283

260284
}

0 commit comments

Comments
 (0)