MySQL to Java type conversion
This commit is contained in:
jadelike 2022-09-28 18:40:59 +08:00
parent 781a7ff4ca
commit 37e83ef76c
2 changed files with 69 additions and 69 deletions

View File

@ -1,6 +1,6 @@
package com.softdev.system.generator.util;
import com.softdev.system.generator.util.mysqlJavaTypeUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@ -196,84 +196,25 @@ public class TableParseUtil {
fieldName = columnName;
}
columnLine = columnLine.substring(columnLine.indexOf("`") + 1).trim();
String mysqlType = columnLine.split("\\s+")[1];
if(mysqlType.contains("(")){
mysqlType = mysqlType.substring(0, mysqlType.indexOf("("));
}
//swagger class
String swaggerClass = "string" ;
if (columnLine.contains(" tinyint")) {
swaggerClass = "integer";
} else if (columnLine.contains(" int") || columnLine.contains(" smallint")) {
swaggerClass = "integer";
} else if (columnLine.contains(" bigint")) {
swaggerClass = "integer";
} else if (columnLine.contains(" float")) {
swaggerClass = "number";
} else if (columnLine.contains(" double")) {
swaggerClass = "number";
} else if (columnLine.contains(" boolean")) {
swaggerClass = "boolean";
if(mysqlJavaTypeUtil.getMysqlSwaggerTypeMap().containsKey(mysqlType)){
swaggerClass = mysqlJavaTypeUtil.getMysqlSwaggerTypeMap().get(mysqlType);
}
// field class
// int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
String fieldClass = Object.class.getSimpleName();
String fieldClass = "String";
//2018-9-16 zhengk 补充char/clob/blob/json等类型如果类型未知默认为String
//2018-11-22 lshz0088 处理字段类型的时候不严谨columnLine.contains(" int") 类似这种的可在前后适当加一些空格之类的加以区分否则当我的字段包含这些字符的时候产生类型判断问题
//2020-05-03 MOSHOW.K.ZHENG 优化对所有类型的处理
//2020-10-20 zhengkai 新增包装类型的转换选择
if (columnLine.contains(" tinyint")) {
//20191115 MOSHOW.K.ZHENG 支持对tinyint的特殊处理
fieldClass = MapUtil.getString(paramInfo.getOptions(),"tinyintTransType");;
} else if (columnLine.contains(" int") || columnLine.contains(" smallint")) {
fieldClass = (isPackageType)?Integer.class.getSimpleName():"int";
} else if (columnLine.contains(" bigint")) {
fieldClass = (isPackageType)?Long.class.getSimpleName():"long";
} else if (columnLine.contains(" float")) {
fieldClass = (isPackageType)?Float.class.getSimpleName():"float";
} else if (columnLine.contains(" double")) {
fieldClass = (isPackageType)?Double.class.getSimpleName():"double";
} else if (columnLine.contains(" time") || columnLine.contains(" date") || columnLine.contains(" datetime") || columnLine.contains(" timestamp")) {
fieldClass = MapUtil.getString(paramInfo.getOptions(),"timeTransType");
} else if (columnLine.contains(" varchar") || columnLine.contains(" text") || columnLine.contains(" char")
|| columnLine.contains(" clob") || columnLine.contains(" blob") || columnLine.contains(" json")) {
fieldClass = String.class.getSimpleName();
} else if (columnLine.contains(" decimal") || columnLine.contains(" number")) {
//2018-11-22 lshz0088 建议对number类型增加intlongBigDecimal的区分判断
//如果startKh大于等于0则表示有设置取值范围
int startKh = columnLine.indexOf("(");
if (startKh >= 0) {
int endKh = columnLine.indexOf(")", startKh);
String[] fanwei = columnLine.substring(startKh + 1, endKh).split("");
//2019-1-5 zhengk 修复@arthaschan反馈的超出范围错误
//System.out.println("fanwei"+ JSON.toJSONString(fanwei));
// //number(20,6) fanwei["20","6"]
// //number(0,6) fanwei["0","6"]
// //number(20,0) fanwei["20","0"]
// //number(20) fanwei["20"]
//如果括号里是1位或者2位且第二位为0则进行特殊处理只有有小数位都设置为BigDecimal
if ((fanwei.length > 1 && "0".equals(fanwei[1])) || fanwei.length == 1) {
int length = Integer.parseInt(fanwei[0]);
if (fanwei.length > 1) {
length = Integer.valueOf(fanwei[1]);
}
//数字范围9位及一下用Integer大的用Long
if (length <= 9) {
fieldClass = (isPackageType)?Integer.class.getSimpleName():"int";
} else {
fieldClass = (isPackageType)?Long.class.getSimpleName():"long";
}
} else {
//有小数位数一律使用BigDecimal
fieldClass = BigDecimal.class.getSimpleName();
}
} else {
fieldClass = BigDecimal.class.getSimpleName();
}
} else if (columnLine.contains(" boolean")) {
//20190910 MOSHOW.K.ZHENG 新增对boolean的处理感谢@violinxsc的反馈以及修复tinyint类型字段无法生成boolean类型问题感谢@hahaYhui的反馈
fieldClass = (isPackageType)?Boolean.class.getSimpleName():"boolean";
} else {
fieldClass = String.class.getSimpleName();
if(mysqlJavaTypeUtil.getMysqlJavaTypeMap().containsKey(mysqlType)){
fieldClass = mysqlJavaTypeUtil.getMysqlJavaTypeMap().get(mysqlType);
}
// field commentMySQL的一般位于field行而pgsql和oralce多位于后面
String fieldComment = null;
if (tableSql.contains("comment on column") && (tableSql.contains("." + columnName + " is ") || tableSql.contains(".`" + columnName + "` is"))) {

View File

@ -0,0 +1,59 @@
package com.softdev.system.generator.util;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* @author lvyanpu
*/
public final class mysqlJavaTypeUtil {
public static final HashMap<String, String> mysqlJavaTypeMap = new HashMap<String, String>();
public static final HashMap<String, String> mysqlSwaggerTypeMap =new HashMap<String, String>();
static{
mysqlJavaTypeMap.put("bigint","Long");
mysqlJavaTypeMap.put("int","Integer");
mysqlJavaTypeMap.put("tinyint","Integer");
mysqlJavaTypeMap.put("smallint","Integer");
mysqlJavaTypeMap.put("mediumint","Integer");
mysqlJavaTypeMap.put("integer","Integer");
//小数
mysqlJavaTypeMap.put("float","Float");
mysqlJavaTypeMap.put("double","Double");
mysqlJavaTypeMap.put("decimal","Double");
//bool
mysqlJavaTypeMap.put("bit","Boolean");
//字符串
mysqlJavaTypeMap.put("char","String");
mysqlJavaTypeMap.put("varchar","String");
mysqlJavaTypeMap.put("tinytext","String");
mysqlJavaTypeMap.put("text","String");
mysqlJavaTypeMap.put("mediumtext","String");
mysqlJavaTypeMap.put("longtext","String");
//日期
mysqlJavaTypeMap.put("date","Date");
mysqlJavaTypeMap.put("datetime","Date");
mysqlJavaTypeMap.put("timestamp","Date");
mysqlSwaggerTypeMap.put("bigint","integer");
mysqlSwaggerTypeMap.put("int","integer");
mysqlSwaggerTypeMap.put("tinyint","integer");
mysqlSwaggerTypeMap.put("smallint","integer");
mysqlSwaggerTypeMap.put("mediumint","integer");
mysqlSwaggerTypeMap.put("integer","integer");
mysqlSwaggerTypeMap.put("boolean","boolean");
mysqlSwaggerTypeMap.put("float","number");
mysqlSwaggerTypeMap.put("double","number");
mysqlSwaggerTypeMap.put("decimal","Double");
}
public static HashMap<String, String> getMysqlJavaTypeMap() {
return mysqlJavaTypeMap;
}
public static HashMap<String, String> getMysqlSwaggerTypeMap() {
return mysqlSwaggerTypeMap;
}
}