diff --git a/pom.xml b/pom.xml index 02006cfa6bbc7b82881d68b669b4857a0d307959..40c5463001bd0a7a2dc1791afb4fa2adab35598a 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,7 @@ 1.11.3 10.2.0.4.0 7.4.1.jre8 + 0.3.2 @@ -107,6 +108,13 @@ org.postgresql postgresql + + + + ru.yandex.clickhouse + clickhouse-jdbc + ${clickhouse.version} + diff --git a/src/main/java/com/ricky/common/constant/Constants.java b/src/main/java/com/ricky/common/constant/Constants.java index 2897ca8d76249377458e8ce2451ba73454013d29..b6b6b18dde87f797080e08d31770299fce4fea0f 100644 --- a/src/main/java/com/ricky/common/constant/Constants.java +++ b/src/main/java/com/ricky/common/constant/Constants.java @@ -89,5 +89,7 @@ public class Constants /** Oracle数据库连接类型-服务名 */ public static final String ORACLE_CONN_TYPE_SERVICE_NAME = "service_name"; - + + /** 数据库类型-Clickhouse */ + public static final String DATABASE_TYPE_CLICKHOUSE = "clickhouse"; } diff --git a/src/main/java/com/ricky/common/constant/GenConstants.java b/src/main/java/com/ricky/common/constant/GenConstants.java index 8db34410f4b533b6a5da736b7be816ba83cb7ecf..3d51de22316910d66e61e7a5df19908872c4e09a 100644 --- a/src/main/java/com/ricky/common/constant/GenConstants.java +++ b/src/main/java/com/ricky/common/constant/GenConstants.java @@ -32,17 +32,32 @@ public class GenConstants public static final String PARENT_MENU_NAME = "parentMenuName"; /** 数据库字符串类型 */ - public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" }; + public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2", + // Clickhouse + "String", "FixedString", "UUID" }; /** 数据库文本类型 */ public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" }; /** 数据库时间类型 */ - public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; + public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp", + // Clickhouse + "DateTime", "DateTime64", "Date" + }; /** 数据库数字类型 */ public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "int2", - "int4", "int8", "number", "integer", "bigint", "float", "float", "double", "decimal" }; + "int4", "int8", "number", "integer", "bigint", "float", "float", "double", "decimal", + // Clickhouse + "Int8", "Int16", "Int32", "Int64", "Int128", "Int256", "Float", "Float32", "Decimal", "Decimal32", "Decimal64", "Decimal128", + "UInt8", "UInt16", "UInt32", "UInt64", "UInt128", "UInt256", + "TINYINT", "BOOL", "BOOLEAN", "INT1", "SMALLINT", "INT2", "INT", "INT4", "INTEGER", "BIGINT"}; + + /** Clickhouse 浮點數字段 */ + public static final String[] COLUMNTYPE_CLICKHOUSE_FLOAT = { "Float", "Float32" }; + + /** Clickhouse Decimal 相關字段 */ + public static final String[] COLUMNTYPE_CLICKHOUSE_DEC = { "Decimal", "Decimal32", "Decimal64", "Decimal128" }; /** 页面不需要编辑字段 */ public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; diff --git a/src/main/java/com/ricky/common/utils/DataSourceComposeUtils.java b/src/main/java/com/ricky/common/utils/DataSourceComposeUtils.java index f02df0963e9fbea479551dc374cc7403219bf7ca..21743a52ef2d683fe58cd29643e0372e7983f49a 100644 --- a/src/main/java/com/ricky/common/utils/DataSourceComposeUtils.java +++ b/src/main/java/com/ricky/common/utils/DataSourceComposeUtils.java @@ -18,6 +18,8 @@ public class DataSourceComposeUtils private static String URL_TEMPLATE_SQLSERVER = "jdbc:sqlserver://{}:{};SelectMethod=cursor;DatabaseName={}"; /** PostgreSQL连接字符串模板 */ private static String URL_TEMPLATE_POSTGRESQL = "jdbc:postgresql://{}:{}/{}?currentSchema={}&ssl=false"; + /** Clickhouse连接字符串模板 */ + private static String URL_TEMPLATE_CLICKHOUSE = "jdbc:clickhouse://{}:{}/{}"; public static DruidDataSource composeDruidDataSource(SysDataSource dataSource) throws BusinessException { @@ -58,6 +60,11 @@ public class DataSourceComposeUtils druidDataSource.setUrl(StringUtils.format(URL_TEMPLATE_POSTGRESQL, dataSource.getHost(), dataSource.getPort(), dataSource.getName(), dataSource.getSchemaName())); } + else if (StringUtils.equals(dataSource.getDbType(), Constants.DATABASE_TYPE_CLICKHOUSE)) + { + druidDataSource.setUrl(StringUtils.format(URL_TEMPLATE_CLICKHOUSE, dataSource.getHost(), + dataSource.getPort(), dataSource.getName(), dataSource.getSchemaName())); + } else { throw new BusinessException("数据库驱动类型无效"); diff --git a/src/main/java/com/ricky/project/domain/GenTable.java b/src/main/java/com/ricky/project/domain/GenTable.java index c1e4125090f2a108fed93f4928427ce18cf8a424..74476ee96b5229558050d58317ead467699d861b 100644 --- a/src/main/java/com/ricky/project/domain/GenTable.java +++ b/src/main/java/com/ricky/project/domain/GenTable.java @@ -35,7 +35,7 @@ public class GenTable extends BaseEntity /** 表描述 */ @NotBlank(message = "表描述不能为空") - private String tableComment; + private String tableComment = "默认表描述"; /** 关联父表的表名 */ private String subTableName; diff --git a/src/main/java/com/ricky/project/domain/GenTableColumn.java b/src/main/java/com/ricky/project/domain/GenTableColumn.java index 9c1adf7cbf1e6a24e455e256ae76dbb393183682..75cb2540beebf6ad8b162740da7e96ba0f5cf432 100644 --- a/src/main/java/com/ricky/project/domain/GenTableColumn.java +++ b/src/main/java/com/ricky/project/domain/GenTableColumn.java @@ -24,7 +24,7 @@ public class GenTableColumn extends BaseEntity private String columnName; /** 列描述 */ - private String columnComment; + private String columnComment = "默认列描述"; /** 列类型 */ private String columnType; diff --git a/src/main/java/com/ricky/project/service/GenTableServiceImpl.java b/src/main/java/com/ricky/project/service/GenTableServiceImpl.java index 1a5509ee5921ea59748a89e8e61d2ca058ffeb9b..258305f080a613513abbfa3b8def334c455f52c5 100644 --- a/src/main/java/com/ricky/project/service/GenTableServiceImpl.java +++ b/src/main/java/com/ricky/project/service/GenTableServiceImpl.java @@ -221,6 +221,7 @@ public class GenTableServiceImpl implements IGenTableService SysConfig config = configMapper.selectSysConfig(); String operName = "管理员"; SysDataSource dataSource = dataSourceMapper.selectSysDataSource(dataSourceId); + String dbType = dataSource.getDbType(); for (GenTable table : tableList) { try @@ -234,7 +235,7 @@ public class GenTableServiceImpl implements IGenTableService List dbTableColumns = selectDbTableColumnsByName(dataSource.getId(), tableName); for (GenTableColumn column : dbTableColumns) { - GenUtils.initColumnField(column, table); + GenUtils.initColumnField(column, table, dbType); genTableColumnMapper.insertGenTableColumn(column); } } @@ -257,6 +258,7 @@ public class GenTableServiceImpl implements IGenTableService Map dataMap = new LinkedHashMap<>(); // 查询表信息 GenTable table = genTableMapper.selectGenTableById(tableId); + // 查询数据源信息 SysDataSource dataSource = dataSourceMapper.selectSysDataSource(table.getDataSourceId()); // 设置主子表信息 @@ -271,7 +273,7 @@ public class GenTableServiceImpl implements IGenTableService VelocityContext context = VelocityUtils.prepareContext(table); // 获取模板列表 - List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + List templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getDbType()); for (String template : templates) { // 渲染模板 @@ -323,7 +325,7 @@ public class GenTableServiceImpl implements IGenTableService VelocityContext context = VelocityUtils.prepareContext(table); // 获取模板列表 - List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + List templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getDbType()); for (String template : templates) { if (!StringUtils.contains(template, "sql.vm")) @@ -368,7 +370,7 @@ public class GenTableServiceImpl implements IGenTableService dbTableColumns.forEach(column -> { if (!tableColumnNames.contains(column.getColumnName())) { - GenUtils.initColumnField(column, table); + GenUtils.initColumnField(column, table, table.getDbType()); genTableColumnMapper.insertGenTableColumn(column); } }); @@ -428,7 +430,7 @@ public class GenTableServiceImpl implements IGenTableService VelocityContext context = VelocityUtils.prepareContext(table); // 获取模板列表 - List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + List templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getDbType()); for (String template : templates) { // 渲染模板 diff --git a/src/main/java/com/ricky/project/util/GenUtils.java b/src/main/java/com/ricky/project/util/GenUtils.java index 380e41af42326b83c69e299282165e101ecabcee..d22ac80aa3b789c88d9913ad9d2d67b627b74658 100644 --- a/src/main/java/com/ricky/project/util/GenUtils.java +++ b/src/main/java/com/ricky/project/util/GenUtils.java @@ -2,6 +2,8 @@ package com.ricky.project.util; import java.util.Arrays; +import com.alibaba.fastjson.JSON; +import com.ricky.common.constant.Constants; import org.apache.commons.lang3.RegExUtils; import com.ricky.common.constant.GenConstants; @@ -12,7 +14,7 @@ import com.ricky.project.domain.SysConfig; /** * 代码生成器 工具类 - * + * TODO: Clickhouse 支持 * @author ruoyi */ public class GenUtils @@ -34,9 +36,9 @@ public class GenUtils /** * 初始化列属性字段 */ - public static void initColumnField(GenTableColumn column, GenTable table) + public static void initColumnField(GenTableColumn column, GenTable table, String dbType) { - String dataType = getDbType(column.getColumnType()); + String dataType = getDbType(column.getColumnType(), dbType); String columnName = column.getColumnName(); column.setTableId(table.getTableId()); column.setCreateBy(table.getCreateBy()); @@ -61,21 +63,53 @@ public class GenUtils { column.setHtmlType(GenConstants.HTML_INPUT); - // 如果是浮点型 统一用BigDecimal - String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); - if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) - { - column.setJavaType(GenConstants.TYPE_BIGDECIMAL); - } - // 如果是整形 - else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) - { - column.setJavaType(GenConstants.TYPE_INTEGER); - } - // 长整形 - else - { - column.setJavaType(GenConstants.TYPE_LONG); + if (dbType.equals(Constants.DATABASE_TYPE_CLICKHOUSE)) { + if (arraysContains(GenConstants.COLUMNTYPE_CLICKHOUSE_FLOAT, dataType)) { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + else if (arraysContains(GenConstants.COLUMNTYPE_CLICKHOUSE_DEC, dataType)) + { + String _colType = column.getColumnType(); + if (StringUtils.contains(_colType, "Nullable(")) { + _colType = StringUtils.remove(StringUtils.remove(_colType, "Nullable("), ")"); + } + String[] str = StringUtils.split(StringUtils.substringBetween(_colType, "(", ")"), ", "); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) + { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 如果是整形 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) + { + column.setJavaType(GenConstants.TYPE_INTEGER); + } + // 长整形 + else + { + column.setJavaType(GenConstants.TYPE_LONG); + } + } + else + { + column.setJavaType(GenConstants.TYPE_LONG); + } + } else { + // 如果是浮点型 统一用BigDecimal + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) + { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 如果是整形 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) + { + column.setJavaType(GenConstants.TYPE_INTEGER); + } + // 长整形 + else + { + column.setJavaType(GenConstants.TYPE_LONG); + } } } @@ -216,15 +250,36 @@ public class GenUtils * @param columnType 列类型 * @return 截取后的列类型 */ - public static String getDbType(String columnType) + public static String getDbType(String columnType, String dbType) { - if (StringUtils.indexOf(columnType, "(") > 0) + // For other database use; + if (!StringUtils.equals(dbType, Constants.DATABASE_TYPE_CLICKHOUSE)) { - return StringUtils.substringBefore(columnType, "("); + if (StringUtils.indexOf(columnType, "(") > 0) + { + return StringUtils.substringBefore(columnType, "("); + } + else + { + return columnType; + } + // Clickhouse use; } else { - return columnType; + if (StringUtils.contains(columnType, "Nullable(")) + { + columnType = StringUtils.remove(StringUtils.remove(columnType, "Nullable("), ")"); + } + + if (StringUtils.indexOf(columnType, "(") > 0) + { + return StringUtils.substringBefore(columnType, "("); + } + else + { + return columnType; + } } } diff --git a/src/main/java/com/ricky/project/util/VelocityUtils.java b/src/main/java/com/ricky/project/util/VelocityUtils.java index 5f99ae72829b3f5d0c979a4fb35508f1254944c9..10a0e397e55d3d94ddfa7fd5a4f78c410666b1ed 100644 --- a/src/main/java/com/ricky/project/util/VelocityUtils.java +++ b/src/main/java/com/ricky/project/util/VelocityUtils.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import com.ricky.common.constant.Constants; import org.apache.velocity.VelocityContext; import com.alibaba.fastjson.JSONObject; @@ -123,7 +124,7 @@ public class VelocityUtils * * @return 模板列表 */ - public static List getTemplateList(String tplCategory) + public static List getTemplateList(String tplCategory, String dbType) { List templates = new ArrayList(); templates.add("vm/java/domain.java.vm"); @@ -131,7 +132,11 @@ public class VelocityUtils templates.add("vm/java/service.java.vm"); templates.add("vm/java/serviceImpl.java.vm"); templates.add("vm/java/controller.java.vm"); - templates.add("vm/xml/mapper.xml.vm"); + if (dbType.equals(Constants.DATABASE_TYPE_CLICKHOUSE)) { + templates.add("vm/xml/clickhouse/mapper.xml.vm"); + } else { + templates.add("vm/xml/other/mapper.xml.vm"); + } if (GenConstants.TPL_CRUD.equals(tplCategory)) { templates.add("vm/html/list.html.vm"); diff --git a/src/main/resources/application-druid.yml b/src/main/resources/application-druid.yml index 7ec4defcc4a955e9d3bb97e8dd4368d0514d90c3..803a37701595b01262d0b46d52e5902642455c43 100644 --- a/src/main/resources/application-druid.yml +++ b/src/main/resources/application-druid.yml @@ -10,5 +10,5 @@ spring: # url: jdbc:sqlite:./sqlite/code-generator.db # 开发时 url: jdbc:sqlite::resource:static/sqlite/code-generator.db - username: root - password: password \ No newline at end of file + username: + password: \ No newline at end of file diff --git a/src/main/resources/mybatis/mapper/GenTableMapper.xml b/src/main/resources/mybatis/mapper/GenTableMapper.xml index 8df24a5886bc527324c17c6de1aadf7493f46cdc..82fde4b5db47bd489c354939db49f739427c4b3c 100644 --- a/src/main/resources/mybatis/mapper/GenTableMapper.xml +++ b/src/main/resources/mybatis/mapper/GenTableMapper.xml @@ -182,6 +182,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + @@ -203,6 +206,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + @@ -224,6 +230,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + @@ -282,6 +291,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND lower(table_comment) like lower(concat('%', #{genTable.tableComment}, '%')) + + select name as table_name, comment as table_comment, metadata_modification_time as update_time from system.tables + where database = (select database()) + AND name NOT LIKE 'qrtz_%' AND name NOT LIKE 'gen_%' + + AND lower(table_name) like lower(concat('%', #{genTable.tableName}, '%')) + + @@ -327,6 +344,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{name} + + select table_name from information_schema.tables + where table_name NOT LIKE 'qrtz_%' and table_name NOT LIKE 'gen_%' and table_schema = (select database()) + and table_name in + + #{name} + + @@ -398,5 +423,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where D.NAME = #{tableName} ORDER BY A.COLORDER + + select column_name, (case when (is_nullable = 0) then '1' else null end) as is_required, ordinal_position as sort, column_comment, column_type, (case when (b.primary_key = column_name) then 1 else 0 end) as is_pk + from information_schema.columns as a + left join (select primary_key, name from system.tables as b) b on b.name = a.table_name and b.primary_key = a.column_name + where table_schema = (select database()) and table_name = (#{tableName}) + order by ordinal_position + \ No newline at end of file diff --git a/src/main/resources/static/sqlite/code-generator.db b/src/main/resources/static/sqlite/code-generator.db index 8217142dfddee6f30f7cfbc001a64b6feec4fad4..6dace9b1333573a563a861529b89733bfafe3360 100644 Binary files a/src/main/resources/static/sqlite/code-generator.db and b/src/main/resources/static/sqlite/code-generator.db differ diff --git a/src/main/resources/vm/xml/clickhouse/mapper.xml.vm b/src/main/resources/vm/xml/clickhouse/mapper.xml.vm new file mode 100644 index 0000000000000000000000000000000000000000..68dd35ec464c7963eca835d506f4cee66252d212 --- /dev/null +++ b/src/main/resources/vm/xml/clickhouse/mapper.xml.vm @@ -0,0 +1,147 @@ + + + + + +#foreach ($column in $columns) + +#end +#if($table.tree) + +#end + +#if($table.sub) + + + + + + +#foreach ($column in $subTable.columns) + +#end + +#end + + + select#foreach($column in $columns) $column.columnName#if($velocityCount != $columns.size()),#end#end from ${tableName} + + + + + + + + insert into ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + $column.columnName, +#end +#end + + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + #{$column.javaField}, +#end +#end + + + + + alter table ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName) + $column.columnName = #{$column.javaField}, +#end +#end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + alter table ${tableName} delete where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + alter table ${tableName} delete where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + +#if($table.sub) + + + alter table ${subTableName} delete where ${subTableFkName} in + + #{${subTableFkclassName}} + + + + + alter table ${subTableName} delete where ${subTableFkName} = #{${subTableFkclassName}} + + + + insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($velocityCount != $subTable.columns.size()),#end#end) values + + (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($velocityCount != $subTable.columns.size()),#end#end) + + +#end + + \ No newline at end of file diff --git a/src/main/resources/vm/xml/mapper.xml.vm b/src/main/resources/vm/xml/other/mapper.xml.vm similarity index 98% rename from src/main/resources/vm/xml/mapper.xml.vm rename to src/main/resources/vm/xml/other/mapper.xml.vm index cd0d9e517dc0587133b2d47cec2157f1bed0f301..5a5ed3db6d4e65c4411aa7226ffe5c734129b16f 100644 --- a/src/main/resources/vm/xml/mapper.xml.vm +++ b/src/main/resources/vm/xml/other/mapper.xml.vm @@ -1,147 +1,147 @@ - - - - - -#foreach ($column in $columns) - -#end -#if($table.tree) - -#end - -#if($table.sub) - - - - - - -#foreach ($column in $subTable.columns) - -#end - -#end - - - select#foreach($column in $columns) $column.columnName#if($velocityCount != $columns.size()),#end#end from ${tableName} - - - - - - - - insert into ${tableName} - -#foreach($column in $columns) -#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) - $column.columnName, -#end -#end - - -#foreach($column in $columns) -#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) - #{$column.javaField}, -#end -#end - - - - - update ${tableName} - -#foreach($column in $columns) -#if($column.columnName != $pkColumn.columnName) - $column.columnName = #{$column.javaField}, -#end -#end - - where ${pkColumn.columnName} = #{${pkColumn.javaField}} - - - - delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} - - - - delete from ${tableName} where ${pkColumn.columnName} in - - #{${pkColumn.javaField}} - - -#if($table.sub) - - - delete from ${subTableName} where ${subTableFkName} in - - #{${subTableFkclassName}} - - - - - delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} - - - - insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($velocityCount != $subTable.columns.size()),#end#end) values - - (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($velocityCount != $subTable.columns.size()),#end#end) - - -#end - + + + + + +#foreach ($column in $columns) + +#end +#if($table.tree) + +#end + +#if($table.sub) + + + + + + +#foreach ($column in $subTable.columns) + +#end + +#end + + + select#foreach($column in $columns) $column.columnName#if($velocityCount != $columns.size()),#end#end from ${tableName} + + + + + + + + insert into ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + $column.columnName, +#end +#end + + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + #{$column.javaField}, +#end +#end + + + + + update ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName) + $column.columnName = #{$column.javaField}, +#end +#end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + +#if($table.sub) + + + delete from ${subTableName} where ${subTableFkName} in + + #{${subTableFkclassName}} + + + + + delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} + + + + insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($velocityCount != $subTable.columns.size()),#end#end) values + + (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($velocityCount != $subTable.columns.size()),#end#end) + + +#end + \ No newline at end of file