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

This commit is contained in:
疯狂的狮子Li
2026-07-08 14:57:33 +08:00
parent 0dd96653a9
commit 9138757af9
4 changed files with 65 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 类型。
* *
@@ -172,6 +172,7 @@ public class TemplateEngineUtils {
boolean needDigit = false; boolean needDigit = false;
boolean needDateField = false; boolean needDateField = false;
boolean needSwitchField = false; boolean needSwitchField = false;
boolean needParseTime = false;
String firstTreeListField = StringUtils.EMPTY; String firstTreeListField = StringUtils.EMPTY;
for (GenTableColumn column : genTable.getColumns()) { for (GenTableColumn column : genTable.getColumns()) {
boolean writable = column.isInsert() || column.isEdit(); boolean writable = column.isInsert() || column.isEdit();
@@ -187,6 +188,7 @@ public class TemplateEngineUtils {
needDigit = needDigit || writable && StringUtils.equals(column.getHtmlType(), GenConstants.HTML_INPUT_NUMBER); needDigit = needDigit || writable && StringUtils.equals(column.getHtmlType(), GenConstants.HTML_INPUT_NUMBER);
needDateField = needDateField || writable && StringUtils.equals(column.getHtmlType(), GenConstants.HTML_DATETIME); needDateField = needDateField || writable && StringUtils.equals(column.getHtmlType(), GenConstants.HTML_DATETIME);
needSwitchField = needSwitchField || (writable || column.isList()) && StringUtils.equals(column.getHtmlType(), GenConstants.HTML_SWITCH); needSwitchField = needSwitchField || (writable || column.isList()) && StringUtils.equals(column.getHtmlType(), GenConstants.HTML_SWITCH);
needParseTime = needParseTime || column.isList() && StringUtils.equals(column.getHtmlType(), GenConstants.HTML_DATETIME);
if (StringUtils.isBlank(firstTreeListField) && column.isList()) { if (StringUtils.isBlank(firstTreeListField) && column.isList()) {
firstTreeListField = column.getJavaField(); firstTreeListField = column.getJavaField();
} }
@@ -206,6 +208,7 @@ public class TemplateEngineUtils {
context.put("needDigit", needDigit); context.put("needDigit", needDigit);
context.put("needDateField", needDateField); context.put("needDateField", needDateField);
context.put("needSwitchField", needSwitchField); context.put("needSwitchField", needSwitchField);
context.put("needParseTime", needParseTime);
context.put("firstTreeListField", firstTreeListField); context.put("firstTreeListField", firstTreeListField);
} }
@@ -715,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 + "\"";
@@ -732,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 + "'";