diff --git a/core/scripts/install.sh b/core/scripts/install.sh new file mode 100644 index 0000000000000000000000000000000000000000..5cfbb74dade9d889d6b5072e6aac0215ca50bb4c --- /dev/null +++ b/core/scripts/install.sh @@ -0,0 +1 @@ +mvn clean install -Dmaven.test.skip=true -e -U \ No newline at end of file diff --git a/core/src/main/java/com/github/drinkjava2/jdialects/DDLFeatures.java b/core/src/main/java/com/github/drinkjava2/jdialects/DDLFeatures.java index c4e11b9546908dc06136b21f81f9f7701545ad0f..857c12c56b4ffda991be7d6ce1f2ac04f0aa273a 100644 --- a/core/src/main/java/com/github/drinkjava2/jdialects/DDLFeatures.java +++ b/core/src/main/java/com/github/drinkjava2/jdialects/DDLFeatures.java @@ -22,6 +22,8 @@ public class DDLFeatures { public static final String NOT_SUPPORT = "NOT_SUPPORT"; protected String addColumnString; protected String addColumnSuffixString; + protected String columnSuffixString; + protected String modifyColumnString; protected String addForeignKeyConstraintString; protected String addFKeyRefPkeyString;// If ref pkey, can ignore ref columns protected String addPrimaryKeyConstraintString; @@ -88,6 +90,9 @@ public class DDLFeatures { DDLFeatures ddl = new DDLFeatures(); ddl.addColumnString = "add"; ddl.addColumnSuffixString = ""; + ddl.dropColumnString = NOT_SUPPORT; + ddl.columnSuffixString = NOT_SUPPORT; + ddl.modifyColumnString = NOT_SUPPORT; ddl.addFKeyRefPkeyString = " add constraint _FKEYNAME foreign key (_FK1, _FK2) references _REFTABLE"; ddl.addForeignKeyConstraintString = " add constraint _FKEYNAME foreign key (_FK1, _FK2) references _REFTABLE (_REF1, _REF2)"; ddl.addPrimaryKeyConstraintString = " add constraint _PKEYNAME primary key "; @@ -844,10 +849,15 @@ public class DDLFeatures { } break; case MySQLDialect: { - ddl.addColumnString = "add column"; + ddl.addColumnString = "add"; + ddl.addColumnSuffixString = ""; + ddl.dropColumnString = NOT_SUPPORT; + ddl.columnSuffixString = NOT_SUPPORT; + ddl.modifyColumnString = NOT_SUPPORT; ddl.addFKeyRefPkeyString = " add constraint _FKEYNAME foreign key (_FK1, _FK2) references _REFTABLE (_REF1, _REF2)"; ddl.closeQuote = "`"; ddl.columnComment = " comment '_COMMENT'"; + ddl.createTableString = "create table if not exists"; ddl.createCatalogCommand = "create database _CATALOGNAME"; ddl.createPooledSequenceStrings = NOT_SUPPORT; ddl.createSchemaCommand = NOT_SUPPORT; @@ -876,6 +886,7 @@ public class DDLFeatures { ddl.addFKeyRefPkeyString = " add constraint _FKEYNAME foreign key (_FK1, _FK2) references _REFTABLE (_REF1, _REF2)"; ddl.closeQuote = "`"; ddl.columnComment = " comment '_COMMENT'"; + ddl.createTableString = "create table if not exists"; ddl.createCatalogCommand = "create database _CATALOGNAME"; ddl.createPooledSequenceStrings = NOT_SUPPORT; ddl.createSchemaCommand = NOT_SUPPORT; @@ -902,9 +913,14 @@ public class DDLFeatures { break; case MySQL55Dialect: { ddl.addColumnString = "add column"; + ddl.addColumnSuffixString = ""; + ddl.dropColumnString = "alter table"; + ddl.columnSuffixString = NOT_SUPPORT; + ddl.modifyColumnString = NOT_SUPPORT; ddl.addFKeyRefPkeyString = " add constraint _FKEYNAME foreign key (_FK1, _FK2) references _REFTABLE (_REF1, _REF2)"; ddl.closeQuote = "`"; ddl.columnComment = " comment '_COMMENT'"; + ddl.createTableString = "create table if not exists"; ddl.createCatalogCommand = "create database _CATALOGNAME"; ddl.createPooledSequenceStrings = NOT_SUPPORT; ddl.createSchemaCommand = NOT_SUPPORT; @@ -935,6 +951,7 @@ public class DDLFeatures { ddl.addFKeyRefPkeyString = " add constraint _FKEYNAME foreign key (_FK1, _FK2) references _REFTABLE (_REF1, _REF2)"; ddl.closeQuote = "`"; ddl.columnComment = " comment '_COMMENT'"; + ddl.createTableString = "create table if not exists"; ddl.createCatalogCommand = "create database _CATALOGNAME"; ddl.createPooledSequenceStrings = NOT_SUPPORT; ddl.createSchemaCommand = NOT_SUPPORT; @@ -965,6 +982,7 @@ public class DDLFeatures { ddl.addFKeyRefPkeyString = " add constraint _FKEYNAME foreign key (_FK1, _FK2) references _REFTABLE (_REF1, _REF2)"; ddl.closeQuote = "`"; ddl.columnComment = " comment '_COMMENT'"; + ddl.createTableString = "create table if not exists"; ddl.createCatalogCommand = "create database _CATALOGNAME"; ddl.createPooledSequenceStrings = NOT_SUPPORT; ddl.createSchemaCommand = NOT_SUPPORT; @@ -995,6 +1013,7 @@ public class DDLFeatures { ddl.addFKeyRefPkeyString = " add constraint _FKEYNAME foreign key (_FK1, _FK2) references _REFTABLE (_REF1, _REF2)"; ddl.closeQuote = "`"; ddl.columnComment = " comment '_COMMENT'"; + ddl.createTableString = "create table if not exists"; ddl.createCatalogCommand = "create database _CATALOGNAME"; ddl.createPooledSequenceStrings = NOT_SUPPORT; ddl.createSchemaCommand = NOT_SUPPORT; @@ -1025,6 +1044,7 @@ public class DDLFeatures { ddl.addFKeyRefPkeyString = " add constraint _FKEYNAME foreign key (_FK1, _FK2) references _REFTABLE (_REF1, _REF2)"; ddl.closeQuote = "`"; ddl.columnComment = " comment '_COMMENT'"; + ddl.createTableString = "create table if not exists"; ddl.createCatalogCommand = "create database _CATALOGNAME"; ddl.createPooledSequenceStrings = NOT_SUPPORT; ddl.createSchemaCommand = NOT_SUPPORT; @@ -1054,6 +1074,7 @@ public class DDLFeatures { ddl.addFKeyRefPkeyString = " add constraint _FKEYNAME foreign key (_FK1, _FK2) references _REFTABLE (_REF1, _REF2)"; ddl.closeQuote = "`"; ddl.columnComment = " comment '_COMMENT'"; + ddl.createTableString = "create table if not exists"; ddl.createCatalogCommand = "create database _CATALOGNAME"; ddl.createPooledSequenceStrings = NOT_SUPPORT; ddl.createSchemaCommand = NOT_SUPPORT; @@ -1082,6 +1103,7 @@ public class DDLFeatures { ddl.addFKeyRefPkeyString = " add constraint _FKEYNAME foreign key (_FK1, _FK2) references _REFTABLE (_REF1, _REF2)"; ddl.closeQuote = "`"; ddl.columnComment = " comment '_COMMENT'"; + ddl.createTableString = "create table if not exists"; ddl.createCatalogCommand = "create database _CATALOGNAME"; ddl.createPooledSequenceStrings = NOT_SUPPORT; ddl.createSchemaCommand = NOT_SUPPORT; diff --git a/core/src/main/java/com/github/drinkjava2/jdialects/Dialect.java b/core/src/main/java/com/github/drinkjava2/jdialects/Dialect.java index 37a8d318bf25a88e022808dd99041540cb6eec04..a7a296a7473fe8d6c7e1f87c640263e03b3d0bf0 100644 --- a/core/src/main/java/com/github/drinkjava2/jdialects/Dialect.java +++ b/core/src/main/java/com/github/drinkjava2/jdialects/Dialect.java @@ -300,7 +300,7 @@ public class Dialect { for (String templ : typeTempls) { if (templ.contains("<")) {// varchar($l)<255 String[] limitType = StrUtils.split("<", templ); - if (col.getLength() > 0 && col.getLength() < Integer.parseInt(limitType[1]))// NOSONAR + if (col.getLength() > 0 && col.getLength() <= Integer.parseInt(limitType[1]))// NOSONAR return replacePlaceHolders(type, limitType[0], col); } else {// varchar($l) return replacePlaceHolders(type, templ, col); diff --git a/core/src/main/java/com/github/drinkjava2/jdialects/DialectTypeMappingTemplate.java b/core/src/main/java/com/github/drinkjava2/jdialects/DialectTypeMappingTemplate.java index 4795149e0c707eaa6f08722cc5574a09661ca39e..8c3da587984de647cd55209177c353e4a62a2927 100644 --- a/core/src/main/java/com/github/drinkjava2/jdialects/DialectTypeMappingTemplate.java +++ b/core/src/main/java/com/github/drinkjava2/jdialects/DialectTypeMappingTemplate.java @@ -51,7 +51,7 @@ import java.util.Map; public class DialectTypeMappingTemplate { protected static void initTypeMappingTemplates() { - + //================SQLiteDialect family=============== Map m = Dialect.SQLiteDialect.typeMappings; m.put(BIGINT, "bigint"); @@ -921,33 +921,31 @@ public class DialectTypeMappingTemplate { //================MySQLDialect family=============== m = Dialect.MySQLDialect.typeMappings; - m.put(BIGINT, "bigint"); - m.put(BINARY, "binary($l)"); - m.put(BIT, "bit"); - m.put(BLOB, "longblob"); - m.put(BOOLEAN, "bit"); - m.put(CHAR, "char(1)"); - m.put(CLOB, "longtext"); - m.put(DATE, "date"); - m.put(DECIMAL, "decimal($p,$s)"); - m.put(DOUBLE, "double precision"); - m.put(FLOAT, "float"); - m.put(INTEGER, "integer"); - m.put(JAVA_OBJECT, "N/A"); - m.put(LONGNVARCHAR, "nvarchar($l)"); - m.put(LONGVARBINARY, "mediumblob<16777215|longblob"); - m.put(LONGVARCHAR, "longtext"); - m.put(NCHAR, "nchar($l)"); - m.put(NCLOB, "longtext"); - m.put(NUMERIC, "decimal($p,$s)"); - m.put(NVARCHAR, "nvarchar($l)"); - m.put(REAL, "real"); - m.put(SMALLINT, "smallint"); - m.put(TIME, "time"); - m.put(TIMESTAMP, "datetime"); - m.put(TINYINT, "tinyint"); - m.put(VARBINARY, "tinyblob<255|blob<65535|mediumblob<16777215|longblob"); - m.put(VARCHAR, "varchar($l)<255|longtext"); + m.put(Type.BINARY, "binary($l)"); + m.put(Type.BIT, "bit"); + m.put(Type.BLOB, "longblob"); + m.put(Type.BOOLEAN, "bit"); + m.put(Type.CHAR, "char($l)"); + m.put(Type.CLOB, "longtext"); + m.put(Type.DATE, "date"); + m.put(Type.DOUBLE, "double precision"); + m.put(Type.FLOAT, "float"); + m.put(Type.INTEGER, "integer"); + m.put(Type.LONGVARBINARY, "mediumblob<16777215|longblob"); + m.put(Type.LONGVARCHAR, "longtext"); + m.put(Type.NCLOB, "longtext"); + m.put(Type.NUMERIC, "decimal($p,$s)"); + m.put(Type.TIME, "time"); + m.put(Type.DATETIME, "datetime"); + m.put(Type.VARBINARY, "tinyblob<255|blob<65535|mediumblob<16777215|longblob"); + + m.put(Type.SMALLINT, "smallint($l)"); + m.put(Type.MEDIUMINT, "MEDIUMINT($l)"); + m.put(Type.TINYINT, "tinyint($l)"); + m.put(Type.BIGINT, "bigint($l)"); + m.put(Type.YEAR, "year($l)"); + m.put(Type.VARCHAR, "varchar($l)<65535|longtext"); + m.put(Type.TIMESTAMP, "timestamp"); m = Dialect.MySQL5Dialect.typeMappings; m.putAll(Dialect.MySQLDialect.typeMappings);//extends from MySQLDialect @@ -992,7 +990,7 @@ public class DialectTypeMappingTemplate { m.put(BIT, "number(1,0)"); m.put(BLOB, "blob"); m.put(BOOLEAN, "boolean"); - m.put(CHAR, "char(1)"); + m.put(CHAR, "char($l)"); m.put(CLOB, "clob"); m.put(DATE, "date"); m.put(DECIMAL, "number($p,$s)"); @@ -1014,12 +1012,20 @@ public class DialectTypeMappingTemplate { m.put(TINYINT, "number(3,0)"); m.put(VARBINARY, "raw($l)<2000|long raw"); m.put(VARCHAR, "varchar2($l)<4000|long"); + //add new + m.put(Type.BINARY_FLOAT, "BINARY_FLOAT"); + m.put(Type.BINARY_DOUBLE, "BINARY_DOUBLE"); + m.put(Type.DOUBLE_PRECISION, "DOUBLE PRECISION"); + m.put(Type.TIMESTAMP_WITH_TIME_ZONE, "TIMESTAMP WITH TIME ZONE"); + m.put(Type.TIMESTAMP_WITH_LOCAL_TIME_ZONE, "TIMESTAMP WITH LOCAL TIME ZONE"); + m.put(Type.INTERVAL_YEAR_TO_MONTH, "INTERVAL YEAR($l) TO MONTH"); + m.put(Type.INTERVAL_DAY_TO_SECOND, "INTERVAL DAY($p) TO SECOND($s)"); m = Dialect.Oracle10gDialect.typeMappings; m.putAll(Dialect.OracleDialect.typeMappings);//extends from OracleDialect m.put(BINARY, "raw($l)<2000|long raw"); m.put(BOOLEAN, "number(1,0)"); - m.put(CHAR, "char(1 char)"); + m.put(CHAR, "char($l char)"); m.put(LONGNVARCHAR, "nvarchar2($l)"); m.put(LONGVARBINARY, "long raw"); m.put(LONGVARCHAR, "long"); @@ -1031,7 +1037,7 @@ public class DialectTypeMappingTemplate { m.putAll(Dialect.OracleDialect.typeMappings);//extends from OracleDialect m.put(BINARY, "raw($l)<2000|long raw"); m.put(BOOLEAN, "number(1,0)"); - m.put(CHAR, "char(1 char)"); + m.put(CHAR, "char($l char)"); m.put(LONGNVARCHAR, "nvarchar2($l)"); m.put(LONGVARBINARY, "long raw"); m.put(LONGVARCHAR, "long"); @@ -1048,7 +1054,7 @@ public class DialectTypeMappingTemplate { m = Dialect.Oracle9Dialect.typeMappings; m.putAll(Dialect.OracleDialect.typeMappings);//extends from OracleDialect - m.put(CHAR, "char(1 char)"); + m.put(CHAR, "char($l char)"); m.put(TIMESTAMP, "timestamp"); m.put(VARCHAR, "varchar2($l char)<4000|long"); @@ -1056,7 +1062,7 @@ public class DialectTypeMappingTemplate { m.putAll(Dialect.OracleDialect.typeMappings);//extends from OracleDialect m.put(BINARY, "raw($l)<2000|long raw"); m.put(BOOLEAN, "number(1,0)"); - m.put(CHAR, "char(1 char)"); + m.put(CHAR, "char($l char)"); m.put(LONGNVARCHAR, "nvarchar2($l)"); m.put(LONGVARBINARY, "long raw"); m.put(LONGVARCHAR, "long"); diff --git a/core/src/main/java/com/github/drinkjava2/jdialects/Type.java b/core/src/main/java/com/github/drinkjava2/jdialects/Type.java index 0672faea788e69cd482e54cbc42ed27155234695..e81e26ae5b7a1cdfb8d00193195db3cf15e68a2d 100644 --- a/core/src/main/java/com/github/drinkjava2/jdialects/Type.java +++ b/core/src/main/java/com/github/drinkjava2/jdialects/Type.java @@ -11,6 +11,7 @@ */ package com.github.drinkjava2.jdialects; + /** * Virtual SQL Type definitions * @@ -45,6 +46,39 @@ public enum Type { , TIMESTAMP// , TINYINT// , VARBINARY// - , VARCHAR; + , VARCHAR + //mysql + , DATETIME + , MEDIUMINT + , INT + , TINYBLOB + , TINYTEXT + , TEXT + , MEDIUMBLOB + , MEDIUMTEXT + , LONGBLOB + , LONGTEXT + , YEAR + , JSON + //oracle + , BINARY_FLOAT + , DOUBLE_PRECISION + , BINARY_DOUBLE + , TIMESTAMP_WITH_TIME_ZONE + , TIMESTAMP_WITH_LOCAL_TIME_ZONE + , VARCHAR2 + ,INTERVAL_YEAR_TO_MONTH + ,INTERVAL_DAY_TO_SECOND + ; + + //TODO 此处需要考虑数据类型多对一的情况 + public static Type getByTypeName(String typeName) { + for (Type val : Type.values()) { + if (val.name().equalsIgnoreCase(typeName)) { + return val; + } + } + throw new DialectException("'" + typeName + "' can not be map to a dialect type"); + } } diff --git a/core/src/main/java/com/github/drinkjava2/jdialects/TypeUtils.java b/core/src/main/java/com/github/drinkjava2/jdialects/TypeUtils.java index ab4bffaf89dc1d7b9b4788c01b0d65de5f5c9150..a33395addf15600ece8877daa10c90c0b69020a5 100644 --- a/core/src/main/java/com/github/drinkjava2/jdialects/TypeUtils.java +++ b/core/src/main/java/com/github/drinkjava2/jdialects/TypeUtils.java @@ -24,37 +24,6 @@ import java.util.Map; */ public abstract class TypeUtils {// NOSONAR - public static final String BIGINT = "BIGINT"; - public static final String BINARY = "BINARY"; - public static final String BIT = "BIT"; - public static final String BLOB = "BLOB"; - public static final String BOOLEAN = "BOOLEAN"; - public static final String CHAR = "CHAR"; - public static final String CLOB = "CLOB"; - public static final String DATE = "DATE"; - public static final String DECIMAL = "DECIMAL"; - public static final String DOUBLE = "DOUBLE"; - public static final String FLOAT = "FLOAT"; - public static final String INTEGER = "INTEGER"; - public static final String INT = "INT"; - public static final String JAVA_OBJECT = "JAVA_OBJECT"; - public static final String LONGNVARCHAR = "LONGNVARCHAR"; - public static final String LONGVARBINARY = "LONGVARBINARY"; - public static final String LONGVARCHAR = "LONGVARCHAR"; - public static final String NCHAR = "NCHAR"; - public static final String NCLOB = "NCLOB"; - public static final String NUMERIC = "NUMERIC"; - public static final String NVARCHAR = "NVARCHAR"; - public static final String UNKNOW = "UNKNOW"; - public static final String REAL = "REAL"; - public static final String SMALLINT = "SMALLINT"; - public static final String TIME = "TIME"; - public static final String TIMESTAMP = "TIMESTAMP"; - public static final String DATETIME = "DATETIME"; //DATETIME is only DB column type - public static final String TINYINT = "TINYINT"; - public static final String VARBINARY = "VARBINARY"; - public static final String VARCHAR = "VARCHAR"; - private static final Map, Type> JAVA_TO_TYPE_MAP = new HashMap, Type>(); private static final Map> TYPE_TO_JAVA_MAP = new HashMap>(); static { @@ -148,69 +117,13 @@ public abstract class TypeUtils {// NOSONAR */ public static Type colDef2DialectType(String columnDefination) { String columnDef = StrUtils.substringBefore(columnDefination, "("); - if (BIGINT.equalsIgnoreCase(columnDef)) - return Type.BIGINT; - if (BINARY.equalsIgnoreCase(columnDef)) - return Type.BINARY; - if (BIT.equalsIgnoreCase(columnDef)) - return Type.BIT; - if (BLOB.equalsIgnoreCase(columnDef)) - return Type.BLOB; - if (BOOLEAN.equalsIgnoreCase(columnDef)) - return Type.BOOLEAN; - if (CHAR.equalsIgnoreCase(columnDef)) - return Type.CHAR; - if (CLOB.equalsIgnoreCase(columnDef)) - return Type.CLOB; - if (DATE.equalsIgnoreCase(columnDef)) - return Type.DATE; - if (DECIMAL.equalsIgnoreCase(columnDef)) - return Type.DECIMAL; - if (DOUBLE.equalsIgnoreCase(columnDef)) - return Type.DOUBLE; - if (FLOAT.equalsIgnoreCase(columnDef)) - return Type.FLOAT; - if (INTEGER.equalsIgnoreCase(columnDef)) - return Type.INTEGER; - if (INT.equalsIgnoreCase(columnDef)) - return Type.INTEGER; - if (JAVA_OBJECT.equalsIgnoreCase(columnDef)) - return Type.JAVA_OBJECT; - if (LONGNVARCHAR.equalsIgnoreCase(columnDef)) - return Type.LONGNVARCHAR; - if (LONGVARBINARY.equalsIgnoreCase(columnDef)) - return Type.LONGVARBINARY; - if (LONGVARCHAR.equalsIgnoreCase(columnDef)) - return Type.LONGVARCHAR; - if (NCHAR.equalsIgnoreCase(columnDef)) - return Type.NCHAR; - if (NCLOB.equalsIgnoreCase(columnDef)) - return Type.NCLOB; - if (NUMERIC.equalsIgnoreCase(columnDef)) - return Type.NUMERIC; - if (NVARCHAR.equalsIgnoreCase(columnDef)) - return Type.NVARCHAR; - if (UNKNOW.equalsIgnoreCase(columnDef)) - return Type.UNKNOW; - if (REAL.equalsIgnoreCase(columnDef)) - return Type.REAL; - if (SMALLINT.equalsIgnoreCase(columnDef)) - return Type.SMALLINT; - if (TIME.equalsIgnoreCase(columnDef)) - return Type.TIME; - if (TIMESTAMP.equalsIgnoreCase(columnDef)) - return Type.TIMESTAMP; - if (DATETIME.equalsIgnoreCase(columnDef)) //DATETIME is only DB column type, no Java type - return Type.TIMESTAMP; - if (TINYINT.equalsIgnoreCase(columnDef)) - return Type.TINYINT; - if (VARBINARY.equalsIgnoreCase(columnDef)) - return Type.VARBINARY; - if (VARCHAR.equalsIgnoreCase(columnDef)) - return Type.VARCHAR; - if ("TEXT".equalsIgnoreCase(columnDef)) - return Type.VARCHAR; - throw new DialectException("'" + columnDef + "' can not be map to a dialect type"); + if ("TEXT".equalsIgnoreCase(columnDef)) + return Type.VARCHAR; + if ("DATETIME".equalsIgnoreCase(columnDef)) //DATETIME is only DB column type, no Java type + return Type.TIMESTAMP; + return Type.getByTypeName(columnDef); + // @formatter:on +// throw new DialectException("'" + columnDef + "' can not be map to a dialect type"); } /** Convert java.sql.Types.xxx type to Dialect's Type */