package com.micro.util;
import com.micro.contaxt.PrimaryKeyType;
import com.micro.entity.ColumnData;
import com.micro.entity.TableData;
import com.micro.model.ConvertType;
import org.springframework.util.StringUtils;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author JiaYue
* @date 2019/6/28 13:56
*/
public class GeneratorUtils {
public static Map<String, Object> getAutoCreateSql(TableData tableData, List<ColumnData> columnDataList,Integer primaryKeyType ,boolean isHump) throws Exception{
Map<String, Object> sqlMap = new HashMap(9);
String tableName = tableData.getTableName();
String columns = getColumnSplit(columnDataList);
String formatColumns = getFormatColumnSplit(columnDataList,isHump);
String[] columnList = getColumnList(columns);
String columnFields = getColumnFields(columns);
String insert = getInsertSql(tableName,columns,formatColumns,primaryKeyType);
String insertSelective = getInsertSelectiveSql(tableName,columnDataList,primaryKeyType,isHump);
String update = getUpdateSql(tableName,columnList,isHump);
String updateSelective = getUpdateSelectiveSql(tableName,columnDataList,isHump);
String selectById = getSelectByIdSql(tableName,columnList,isHump);
String delete = getDeleteSql(tableName,columnList,isHump);
sqlMap.put("columnList", columnList);
sqlMap.put("columnFields", columnFields);
sqlMap.put("insert", insert.replace("#{createTime}", "now()").replace("#{updateTime}", "now()"));
sqlMap.put("insertSelective", insertSelective.replace("#{createTime}", "now()").replace("#{updateTime}", "now()"));
sqlMap.put("update", update.replace("#{createTime}", "now()").replace("#{updateTime}", "now()"));
sqlMap.put("delete", delete);
sqlMap.put("updateSelective", updateSelective);
sqlMap.put("selectById", selectById);
sqlMap.put("keyName", formatCloumnName(columnList[0],isHump));
return sqlMap;
}
/**
* 添加UUID类型主键插入语句前缀
* @param insertSql 原插入语句
* @return 格式化后语句
*/
private static String addUuidInsertPrefix(String insertSql){
StringBuilder uuidPrefix = new StringBuilder();
uuidPrefix.append("<selectKey resultType=\"java.lang.String\" keyProperty=\"activityId\" order=\"BEFORE\" >\n")
.append("\t\t\tselect UUID()\n")
.append("\t\t</selectKey>\n");
return uuidPrefix.append(insertSql).toString();
}
/**
* 添加SnowFlake类型主键插入语句前缀
* @param insertSql 原插入语句
* @return 格式化后语句
*/
private static String addSnowFlakePrefix(String insertSql){
StringBuilder snowFlakePrefix = new StringBuilder();
snowFlakePrefix.append("<selectKey resultType=\"java.lang.Long\" keyProperty=\"activityId\" order=\"BEFORE\" >\n")
.append("\t\t\tselect ${@com.micro.generate.util.SnowFlakeUtils@getId()}\n")
.append("\t\t</selectKey>\n");
return snowFlakePrefix.append(insertSql).toString();
}
/**
* 生成插入语句
* @param tableName 表名
* @param columns 带分隔符的列字符串
* @param formatColumns 格式化后带分隔符的列字符串
* @param primaryKeyType 主键类型
* @return 格式化后语句
*/
private static String getInsertSql(String tableName, String columns, String formatColumns, Integer primaryKeyType){
String insert = null;
if (PrimaryKeyType.getPrimaryKeyType(primaryKeyType) == PrimaryKeyType.UUID){
insert = "\t\tinsert into " + tableName + "(" + columns.replaceAll("\\|", ",") + ")\n \t\tvalues(#{" + formatColumns.replaceAll("\\|", "},#{") + "})";
insert = addUuidInsertPrefix(insert);
} else if (PrimaryKeyType.getPrimaryKeyType(primaryKeyType) == PrimaryKeyType.SNOW_FLAKE){
insert = "\t\tinsert into " + tableName + "(" + columns.replaceAll("\\|", ",") + ")\n \t\tvalues(#{" + formatColumns.replaceAll("\\|", "},#{") + "})";
insert = addSnowFlakePrefix(insert);
} else {
insert = "insert into " + tableName + "(" + columns.replaceAll("\\|", ",") + ")\n \t\tvalues(#{" + formatColumns.replaceAll("\\|", "},#{") + "})";
}
return insert;
}
/**
* 生成非必填参数的插入语句
* @param tableName 表名
* @param columnList 列数据集
* @param primaryKeyType 主键类型
* @param isHump 是否驼峰命名
* @return 格式化后的语句
* @throws SQLException
*/
private static String getInsertSelectiveSql(String tableName, List<ColumnData> columnList, Integer primaryKeyType, boolean isHump) throws SQLException {
StringBuffer columns = new StringBuffer();
StringBuffer values = new StringBuffer();
String format = "\t\t";
columns.append(format+"<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\" >\n");
values.append(format+"<trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\" >\n");
for (int i = 0; i < columnList.size(); i++) {
ColumnData data = (ColumnData) columnList.get(i);
String columnName = data.getColumnName();
columns.append(format+"\t<if test=\"").append(formatCloumnName(columnName,isHump)).append(" != null ");
values.append(format+"\t<if test=\"").append(formatCloumnName(columnName,isHump)).append(" != null ");
if ("String" == data.getDataType()) {
columns.append(" and ").append(formatCloumnName(columnName,isHump)).append(" != ''");
values.append(" and ").append(formatCloumnName(columnName,isHump)).append(" != ''");
}
columns.append(" \">\n"+format+format);
values.append(" \">\n"+format+format);
columns.append(columnName + ",\n");
values.append("#{" + formatCloumnName(columnName,isHump) + "},\n");
columns.append(format+"\t</if>\n");
values.append(format+"\t</if>\n");
}
columns.append(format+"</trim>");
values.append(format+"</trim>");
String insert = null;
if (PrimaryKeyType.getPrimaryKeyType(primaryKeyType) == PrimaryKeyType.UUID){
insert = "\t\tinsert into " + tableName + "\n"+columns.toString() +"\n"+values.toString();
insert = addUuidInsertPrefix(insert);
} else if (PrimaryKeyType.getPrimaryKeyType(primaryKeyType) == PrimaryKeyType.SNOW_FLAKE){
insert = "\t\tinsert into " + tableName + "\n"+columns.toString() +"\n"+values.toString();
insert = addSnowFlakePrefix(insert);
} else {
insert = "insert into " + tableName + "\n"+columns.toString() +"\n"+values.toString();
}
return insert;
}
/**
* 生成更新语句
* @param tableName 表名
* @param columnsList 列数据集
* @param isHump 是否驼峰命名
* @return 格式化后的语句
* @throws SQLException
*/
private static String getUpdateSql(String tableName, String[] columnsList, boolean isHump) throws SQLException {
StringBuffer sb = new StringBuffer();
for (int i = 1; i < columnsList.length; i++) {
String column = columnsList[i];
if (!"CREATETIME".equals(column.toUpperCase())) {
if ("UPDATETIME".equals(column.toUpperCase())) {
sb.append(column + "=now()");
} else {
sb.append(column + "=#{" + formatCloumnName(column,isHump) + "}");
}
if (i + 1 < columnsList.length) {