!871 update 优化数据库字段类型处理

* update 扩展数据库字段类型支持,增加浮点型和其他类型的规范化处理
This commit is contained in:
AprilWind
2026-07-08 06:55:18 +00:00
committed by 疯狂的狮子Li
parent c2667cfbe1
commit e8f2e68f0e
4 changed files with 62 additions and 16 deletions
@@ -108,26 +108,29 @@ public interface GenConstants {
/** /**
* 数据库字符串类型 * 数据库字符串类型
*/ */
String[] COLUMNTYPE_STR = {"char", "varchar", "enum", "set", "nchar", "nvarchar", "varchar2", "nvarchar2"}; String[] COLUMNTYPE_STR = {"char", "varchar", "enum", "set", "nchar", "nvarchar", "varchar2", "nvarchar2",
"long varchar", "long nvarchar", "uniqueidentifier", "uuid", "json", "jsonb", "xml"};
/** /**
* 数据库文本类型 * 数据库文本类型
*/ */
String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext", "binary", "varbinary", "blob", String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext", "binary", "varbinary", "blob",
"ntext", "image", "bytea"}; "ntext", "image", "bytea", "clob", "nclob", "long", "long raw", "raw"};
/** /**
* 数据库时间类型 * 数据库时间类型
*/ */
String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp", "year", "interval", String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp", "year", "interval",
"smalldatetime", "datetime2", "datetimeoffset", "timestamptz"}; "smalldatetime", "datetime2", "datetimeoffset", "timestamptz", "timestamp with time zone",
"timestamp without time zone", "time with time zone", "time without time zone"};
/** /**
* 数据库数字类型 * 数据库数字类型
*/ */
String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "int2", "int4", "int8", "number", "integer", String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "int2", "int4", "int8", "number", "integer",
"bit", "bigint", "float", "float4", "float8", "double", "decimal", "numeric", "real", "double precision", "bit", "boolean", "bool", "bigint", "float", "float4", "float8", "double", "decimal", "dec", "fixed",
"smallserial", "serial", "bigserial", "money", "smallmoney"}; "numeric", "real", "double precision", "binary_float", "binary_double", "smallserial", "serial",
"serial2", "serial4", "serial8", "bigserial", "money", "smallmoney"};
/** /**
* BO对象 不需要添加字段 * BO对象 不需要添加字段
@@ -233,6 +236,11 @@ public interface GenConstants {
*/ */
String TYPE_DOUBLE = "Double"; String TYPE_DOUBLE = "Double";
/**
* 单精度浮点型
*/
String TYPE_FLOAT = "Float";
/** /**
* 高精度计算类型 * 高精度计算类型
*/ */
@@ -156,7 +156,7 @@ public class GenTableColumn extends BaseEntity {
} }
if (StringUtils.equalsAny(this.javaType, if (StringUtils.equalsAny(this.javaType,
GenConstants.TYPE_LONG, GenConstants.TYPE_INTEGER, GenConstants.TYPE_DOUBLE, GenConstants.TYPE_LONG, GenConstants.TYPE_INTEGER, GenConstants.TYPE_DOUBLE,
"Float", GenConstants.TYPE_BIGDECIMAL)) { GenConstants.TYPE_FLOAT, GenConstants.TYPE_BIGDECIMAL)) {
return "number"; return "number";
} }
if (StringUtils.equals(this.javaType, GenConstants.TYPE_BOOLEAN)) { if (StringUtils.equals(this.javaType, GenConstants.TYPE_BOOLEAN)) {
@@ -174,7 +174,7 @@ public class GenTableColumn extends BaseEntity {
if (StringUtils.equals(this.javaType, GenConstants.TYPE_BOOLEAN)) { if (StringUtils.equals(this.javaType, GenConstants.TYPE_BOOLEAN)) {
return "true"; return "true";
} }
if (StringUtils.equalsAny(this.javaType, GenConstants.TYPE_INTEGER, GenConstants.TYPE_LONG)) { if (isNumberType()) {
return "0"; return "0";
} }
return "'0'"; return "'0'";
@@ -189,12 +189,23 @@ public class GenTableColumn extends BaseEntity {
if (StringUtils.equals(this.javaType, GenConstants.TYPE_BOOLEAN)) { if (StringUtils.equals(this.javaType, GenConstants.TYPE_BOOLEAN)) {
return "false"; return "false";
} }
if (StringUtils.equalsAny(this.javaType, GenConstants.TYPE_INTEGER, GenConstants.TYPE_LONG)) { if (isNumberType()) {
return "1"; return "1";
} }
return "'1'"; return "'1'";
} }
/**
* 判断当前字段是否为数值类型。
*
* @return 数值类型返回 {@code true}
*/
public boolean isNumberType() {
return StringUtils.equalsAny(this.javaType,
GenConstants.TYPE_INTEGER, GenConstants.TYPE_LONG, GenConstants.TYPE_DOUBLE,
GenConstants.TYPE_FLOAT, GenConstants.TYPE_BIGDECIMAL);
}
/** /**
* 是否为日期范围查询字段。 * 是否为日期范围查询字段。
* *
@@ -46,7 +46,7 @@ public class GenUtils {
* @param table 所属业务表对象 * @param table 所属业务表对象
*/ */
public static void initColumnField(GenTableColumn column, GenTable table) { public static void initColumnField(GenTableColumn column, GenTable table) {
String dataType = getDbType(column.getColumnType()).toLowerCase(); String dataType = normalizeDbType(getDbType(column.getColumnType()));
// 统一转小写 避免有些数据库默认大写问题 如果需要特别书写方式 请在实体类增加注解标注别名 // 统一转小写 避免有些数据库默认大写问题 如果需要特别书写方式 请在实体类增加注解标注别名
String columnName = column.getColumnName().toLowerCase(); String columnName = column.getColumnName().toLowerCase();
Integer columnLength = getColumnLength(column.getColumnType()); Integer columnLength = getColumnLength(column.getColumnType());
@@ -150,16 +150,20 @@ public class GenUtils {
if (isBooleanColumn(dataType, columnLength, columnScale, columnName)) { if (isBooleanColumn(dataType, columnLength, columnScale, columnName)) {
return GenConstants.TYPE_BOOLEAN; return GenConstants.TYPE_BOOLEAN;
} }
if (arraysContains(new String[]{"decimal", "numeric", "money", "smallmoney"}, dataType)) { if (arraysContains(new String[]{"decimal", "dec", "fixed", "numeric", "money", "smallmoney"}, dataType)) {
return columnScale > 0 ? GenConstants.TYPE_BIGDECIMAL : resolveIntegerJavaType(columnLength); return GenConstants.TYPE_BIGDECIMAL;
} }
if (arraysContains(new String[]{"float", "float4", "float8", "double", "real", "double precision"}, dataType)) { if (arraysContains(new String[]{"float4", "real", "binary_float"}, dataType)) {
return GenConstants.TYPE_FLOAT;
}
if (arraysContains(new String[]{"float", "float8", "double", "double precision", "binary_double"}, dataType)) {
return GenConstants.TYPE_DOUBLE; return GenConstants.TYPE_DOUBLE;
} }
if (arraysContains(new String[]{"bigint", "int8", "bigserial"}, dataType)) { if (arraysContains(new String[]{"bigint", "int8", "bigserial", "serial8"}, dataType)) {
return GenConstants.TYPE_LONG; return GenConstants.TYPE_LONG;
} }
if (arraysContains(new String[]{"smallint", "mediumint", "int", "int2", "int4", "integer", "smallserial", "serial"}, dataType)) { if (arraysContains(new String[]{"tinyint", "smallint", "mediumint", "int", "int2", "int4", "integer",
"smallserial", "serial", "serial2", "serial4"}, dataType)) {
return GenConstants.TYPE_INTEGER; return GenConstants.TYPE_INTEGER;
} }
if (StringUtils.equals(dataType, "number")) { if (StringUtils.equals(dataType, "number")) {
@@ -171,6 +175,19 @@ public class GenUtils {
return GenConstants.TYPE_LONG; return GenConstants.TYPE_LONG;
} }
/**
* 规范化数据库字段类型,去除 MySQL 等数据库的类型修饰。
*
* @param dataType 数据库字段类型
* @return 规范化后的数据库字段类型
*/
private static String normalizeDbType(String dataType) {
return StringUtils.trim(dataType)
.toLowerCase()
.replace(" unsigned", "")
.replace(" zerofill", "");
}
/** /**
* 根据整数字段长度解析 Java 类型。 * 根据整数字段长度解析 Java 类型。
* *
@@ -718,7 +718,16 @@ public class TemplateEngineUtils {
if (StringUtils.equals(column.getJavaType(), GenConstants.TYPE_LONG)) { if (StringUtils.equals(column.getJavaType(), GenConstants.TYPE_LONG)) {
return value + "L"; return value + "L";
} }
if (StringUtils.equalsAny(column.getJavaType(), GenConstants.TYPE_INTEGER, GenConstants.TYPE_DOUBLE, GenConstants.TYPE_BIGDECIMAL)) { if (StringUtils.equals(column.getJavaType(), GenConstants.TYPE_FLOAT)) {
return value + "F";
}
if (StringUtils.equals(column.getJavaType(), GenConstants.TYPE_DOUBLE)) {
return value + "D";
}
if (StringUtils.equals(column.getJavaType(), GenConstants.TYPE_BIGDECIMAL)) {
return "new java.math.BigDecimal(\"" + value + "\")";
}
if (StringUtils.equals(column.getJavaType(), GenConstants.TYPE_INTEGER)) {
return value; return value;
} }
return "\"" + value + "\""; return "\"" + value + "\"";
@@ -735,7 +744,8 @@ public class TemplateEngineUtils {
if (ObjectUtil.isNull(column) || StringUtils.isBlank(value)) { if (ObjectUtil.isNull(column) || StringUtils.isBlank(value)) {
return "undefined"; return "undefined";
} }
if (StringUtils.equalsAny(column.getJavaType(), GenConstants.TYPE_LONG, GenConstants.TYPE_INTEGER, GenConstants.TYPE_DOUBLE, GenConstants.TYPE_BIGDECIMAL)) { if (StringUtils.equalsAny(column.getJavaType(), GenConstants.TYPE_LONG, GenConstants.TYPE_INTEGER,
GenConstants.TYPE_DOUBLE, GenConstants.TYPE_FLOAT, GenConstants.TYPE_BIGDECIMAL)) {
return value; return value;
} }
return "'" + value + "'"; return "'" + value + "'";