Skip to content

Commit

Permalink
set GeneratedColumn's jdbcType default value to JdbcType.UNDEFINED. #2
Browse files Browse the repository at this point in the history
  • Loading branch information
ningpp committed Aug 10, 2024
1 parent 4835b9a commit a5780ab
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
/**
* jdbc type
*/
JdbcType jdbcType();
JdbcType jdbcType() default JdbcType.UNDEFINED;

/**
* type handler
Expand Down
63 changes: 53 additions & 10 deletions mmegp-mbg-ext/src/main/java/me/ningpp/mmegp/JavaParserUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ public final class JavaParserUtil {
private JavaParserUtil() {
}

private static final Map<String, JdbcType> PREDEFINED_TYPES;
private static final Map<String, JdbcType> JDBC_TYPES = new HashMap<>();
public static final String COUNT_GROUP_BY_COLUMNS_NAME = "countGroupByColumns";
public static final String AGGREGATES_NAME = "aggregates";
Expand All @@ -78,6 +79,42 @@ private JavaParserUtil() {
}
}

static {
Map<String, JdbcType> predefinedTypes = new HashMap<>();
predefinedTypes.put(boolean.class.getName(), JdbcType.BOOLEAN);
predefinedTypes.put(Boolean.class.getName(), JdbcType.BOOLEAN);
predefinedTypes.put(char.class.getName(), JdbcType.CHAR);
predefinedTypes.put(Character.class.getName(), JdbcType.CHAR);
predefinedTypes.put(byte.class.getName(), JdbcType.TINYINT);
predefinedTypes.put(Byte.class.getName(), JdbcType.TINYINT);
predefinedTypes.put(short.class.getName(), JdbcType.SMALLINT);
predefinedTypes.put(Short.class.getName(), JdbcType.SMALLINT);
predefinedTypes.put(int.class.getName(), JdbcType.INTEGER);
predefinedTypes.put(Integer.class.getName(), JdbcType.INTEGER);
predefinedTypes.put(long.class.getName(), JdbcType.BIGINT);
predefinedTypes.put(Long.class.getName(), JdbcType.BIGINT);
predefinedTypes.put(float.class.getName(), JdbcType.FLOAT);
predefinedTypes.put(Float.class.getName(), JdbcType.FLOAT);
predefinedTypes.put(double.class.getName(), JdbcType.DOUBLE);
predefinedTypes.put(Double.class.getName(), JdbcType.DOUBLE);

predefinedTypes.put(String.class.getName(), JdbcType.VARCHAR);

predefinedTypes.put(java.math.BigDecimal.class.getName(), JdbcType.DECIMAL);
predefinedTypes.put(java.math.BigInteger.class.getName(), JdbcType.BIGINT);

predefinedTypes.put(java.sql.Date.class.getName(), JdbcType.DATE);
predefinedTypes.put(java.util.Date.class.getName(), JdbcType.TIMESTAMP);
predefinedTypes.put(java.sql.Timestamp.class.getName(), JdbcType.TIMESTAMP);

predefinedTypes.put(java.time.LocalDate.class.getName(), JdbcType.DATE);
predefinedTypes.put(java.time.LocalDateTime.class.getName(), JdbcType.TIMESTAMP);
predefinedTypes.put(java.time.LocalTime.class.getName(), JdbcType.TIME);
predefinedTypes.put(java.time.Year.class.getName(), JdbcType.INTEGER);

PREDEFINED_TYPES = Map.copyOf(predefinedTypes);
}

public static JavaParser newParser() {
ParserConfiguration jpc = new ParserConfiguration();
jpc.setLanguageLevel(LanguageLevel.JAVA_17);
Expand Down Expand Up @@ -145,19 +182,19 @@ private static <N1 extends Node, N2 extends Node> Pair<IntrospectedColumn, Boole
return null;
}

String name = parseString(annotationMembers, "name", null);
JdbcType jdbcType = parseJdbcType(annotationMembers);
if (StringUtils.isEmpty(name) || jdbcType == null) {
String typeClassName = getClassByType(declarMappings, typeNode.getType());
if (StringUtils.isEmpty(typeClassName)) {
throw new GenerateMyBatisExampleException(String.format(Locale.ROOT,
"can't get column name or jdbcType, field = %s, type = %s, FullyQualifiedName = %s",
"not supported Java Type, field = %s, type = %s, FullyQualifiedName = %s",
nameNode.getNameAsString(), typeNode.getType().toString(),
modelDeclaration.getFullyQualifiedName().orElse(null)));
}

String className = getClassByType(declarMappings, typeNode.getType());
if (StringUtils.isEmpty(className)) {
String name = parseString(annotationMembers, "name", null);
JdbcType jdbcType = parseJdbcType(typeClassName, annotationMembers);
if (StringUtils.isEmpty(name) || jdbcType == null) {
throw new GenerateMyBatisExampleException(String.format(Locale.ROOT,
"not supported Java Type, field = %s, type = %s, FullyQualifiedName = %s",
"can't get column name or jdbcType, field = %s, type = %s, FullyQualifiedName = %s",
nameNode.getNameAsString(), typeNode.getType().toString(),
modelDeclaration.getFullyQualifiedName().orElse(null)));
}
Expand All @@ -176,7 +213,7 @@ private static <N1 extends Node, N2 extends Node> Pair<IntrospectedColumn, Boole

column.setJdbcType(jdbcType.TYPE_CODE);
column.setJdbcTypeName(jdbcType.name());
column.setFullyQualifiedJavaType(new FullyQualifiedJavaType(className));
column.setFullyQualifiedJavaType(new FullyQualifiedJavaType(typeClassName));
column.setTypeHandler(parseTypeHandler(annotationMembers, declarMappings));

column.getProperties().put(AGGREGATES_NAME,
Expand All @@ -195,8 +232,14 @@ private static String parseTypeHandler(Map<String, List<MemberValuePair>> annota
.orElse(null);
}

private static JdbcType parseJdbcType(Map<String, List<MemberValuePair>> annotationMembers) {
return parseEnumValue("jdbcType", JDBC_TYPES, annotationMembers, null);
private static JdbcType parseJdbcType(String typeClassName,
Map<String, List<MemberValuePair>> annotationMembers) {
var declarJdbcType = parseEnumValue("jdbcType", JDBC_TYPES, annotationMembers, JdbcType.UNDEFINED);
if (declarJdbcType == JdbcType.UNDEFINED) {
return PREDEFINED_TYPES.get(typeClassName);
} else {
return declarJdbcType;
}
}

public static <T> T parseEnumValue(String name,
Expand Down
48 changes: 24 additions & 24 deletions mmegp-mbg-ext/src/test/java/me/ningpp/mmegp/entity/BigEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,63 +35,63 @@

@Generated(table = "big_entity")
public class BigEntity {
@GeneratedColumn(name = "id", jdbcType = VARCHAR, id = true)
@GeneratedColumn(name = "id", id = true)
private String id;
@GeneratedColumn(name = "f_boolean", jdbcType = JdbcType.BOOLEAN)
@GeneratedColumn(name = "f_boolean")
private boolean fboolean;
@GeneratedColumn(name = "f_byte", jdbcType = JdbcType.TINYINT)
@GeneratedColumn(name = "f_byte")
private byte fbyte;
@GeneratedColumn(name = "f_bytes", jdbcType = JdbcType.BINARY)
private byte[] fbytes;
@GeneratedColumn(name = "field_bytes", jdbcType = JdbcType.BLOB, blob = true)
private Byte[] fieldBytes;
@GeneratedColumn(name = "f_char", jdbcType = JdbcType.CHAR)
@GeneratedColumn(name = "f_char")
private char fchar;
@GeneratedColumn(name = "f_character", jdbcType = JdbcType.CHAR)
@GeneratedColumn(name = "f_character")
private Character fcharacter;
@GeneratedColumn(name = "f_short", jdbcType = JdbcType.SMALLINT)
@GeneratedColumn(name = "f_short")
private short fshort;
@GeneratedColumn(name = "field_short", jdbcType = JdbcType.SMALLINT)
@GeneratedColumn(name = "field_short")
private Short fieldShort;
@GeneratedColumn(name = "f_int", jdbcType = JdbcType.INTEGER)
@GeneratedColumn(name = "f_int")
private int fint;
@GeneratedColumn(name = "field_integer", jdbcType = JdbcType.INTEGER)
@GeneratedColumn(name = "field_integer")
private Integer fieldInteger;
@GeneratedColumn(name = "f_int2", jdbcType = JdbcType.TINYINT)
private int fint2;
@GeneratedColumn(name = "field_integer2", jdbcType = JdbcType.TINYINT)
private Integer fieldInteger2;
@GeneratedColumn(name = "f_long", jdbcType = JdbcType.BIGINT)
@GeneratedColumn(name = "f_long")
private long flong;
@GeneratedColumn(name = "field_long", jdbcType = JdbcType.BIGINT)
@GeneratedColumn(name = "field_long")
private Long fieldLong;
@GeneratedColumn(name = "f_float", jdbcType = JdbcType.FLOAT)
@GeneratedColumn(name = "f_float")
private float ffloat;
@GeneratedColumn(name = "field_float", jdbcType = JdbcType.FLOAT)
@GeneratedColumn(name = "field_float")
private Float fieldFloat;
@GeneratedColumn(name = "f_double", jdbcType = JdbcType.DOUBLE)
@GeneratedColumn(name = "f_double")
private double fdouble;
@GeneratedColumn(name = "field_double", jdbcType = JdbcType.DOUBLE)
@GeneratedColumn(name = "field_double")
private Double fieldDouble;
@GeneratedColumn(name = "f_bigint", jdbcType = JdbcType.BIGINT)
@GeneratedColumn(name = "f_bigint")
private BigInteger fbigint;
@GeneratedColumn(name = "f_bigdecimal", jdbcType = JdbcType.DECIMAL)
@GeneratedColumn(name = "f_bigdecimal")
private BigDecimal fbigdecimal;
@GeneratedColumn(name = "f_date", jdbcType = JdbcType.TIMESTAMP)
@GeneratedColumn(name = "f_date")
private Date fdate;
@GeneratedColumn(name = "f_sqldate", jdbcType = JdbcType.DATE)
@GeneratedColumn(name = "f_sqldate")
private java.sql.Date fsqldate;
@GeneratedColumn(name = "f_timestamp", jdbcType = JdbcType.TIMESTAMP)
@GeneratedColumn(name = "f_timestamp")
private Timestamp ftimestamp;
@GeneratedColumn(name = "f_year", jdbcType = JdbcType.INTEGER)
@GeneratedColumn(name = "f_year")
private Year fyear;
@GeneratedColumn(name = "f_yearmonth", jdbcType = VARCHAR)
private YearMonth fyearmonth;
@GeneratedColumn(name = "f_localdate", jdbcType = JdbcType.DATE)
@GeneratedColumn(name = "f_localdate")
private LocalDate flocaldate;
@GeneratedColumn(name = "f_localtime", jdbcType = JdbcType.TIME)
@GeneratedColumn(name = "f_localtime")
private LocalTime flocaltime;
@GeneratedColumn(name = "f_localdatetime", jdbcType = JdbcType.TIMESTAMP)
@GeneratedColumn(name = "f_localdatetime")
private LocalDateTime flocaldatetime;
@GeneratedColumn(name = "f_uuid", jdbcType = VARCHAR, typeHandler = UUIDStringTypeHandler.class)
private UUID fuuid;
Expand Down

0 comments on commit a5780ab

Please sign in to comment.