优化代码
This commit is contained in:
@@ -101,7 +101,7 @@ public class FormTableExecutor {
|
|||||||
param.setConditions(conditions);
|
param.setConditions(conditions);
|
||||||
param.setOrderField(orderField != null ? orderField : ctx.getTableName().contains("formson") ? "sort" : null);
|
param.setOrderField(orderField != null ? orderField : ctx.getTableName().contains("formson") ? "sort" : null);
|
||||||
param.setSortType(sortType);
|
param.setSortType(sortType);
|
||||||
Map<String, Object> sqlMap = generateSql(param);
|
Map<String, Object> sqlMap = SqlGenerator.generateSql(param);
|
||||||
JDBCAgent agent = new JDBCAgent();
|
JDBCAgent agent = new JDBCAgent();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -143,7 +143,7 @@ public class FormTableExecutor {
|
|||||||
param.setOrderField(orderField != null ? orderField : ctx.getTableName().contains("formson") ? "sort" : null);
|
param.setOrderField(orderField != null ? orderField : ctx.getTableName().contains("formson") ? "sort" : null);
|
||||||
param.setSortType(sortType);
|
param.setSortType(sortType);
|
||||||
param.setConditions(conditions);
|
param.setConditions(conditions);
|
||||||
Map<String, Object> sqlMap = generateSql(param);
|
Map<String, Object> sqlMap = SqlGenerator.generateSql(param);
|
||||||
JDBCAgent agent = new JDBCAgent();
|
JDBCAgent agent = new JDBCAgent();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -194,7 +194,7 @@ public class FormTableExecutor {
|
|||||||
param.setPageSize(pageSize);
|
param.setPageSize(pageSize);
|
||||||
param.setOrderField(orderField != null ? orderField : ctx.getTableName().contains("formson") ? "sort" : null);
|
param.setOrderField(orderField != null ? orderField : ctx.getTableName().contains("formson") ? "sort" : null);
|
||||||
param.setSortType(sortType);
|
param.setSortType(sortType);
|
||||||
Map<String, Object> sqlMap = generateSql(param);;
|
Map<String, Object> sqlMap = SqlGenerator.generateSql(param);;
|
||||||
JDBCAgent agent = new JDBCAgent();
|
JDBCAgent agent = new JDBCAgent();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -225,7 +225,7 @@ public class FormTableExecutor {
|
|||||||
param.setTableName(ctx.getTableName());
|
param.setTableName(ctx.getTableName());
|
||||||
param.setConditions(conditions);
|
param.setConditions(conditions);
|
||||||
param.setCountField(countColumn.size() > 0 ? countColumn.get(0) : null);
|
param.setCountField(countColumn.size() > 0 ? countColumn.get(0) : null);
|
||||||
Map<String, Object> sqlMap = generateSql(param);
|
Map<String, Object> sqlMap = SqlGenerator.generateSql(param);
|
||||||
|
|
||||||
JDBCAgent agent = new JDBCAgent();
|
JDBCAgent agent = new JDBCAgent();
|
||||||
try {
|
try {
|
||||||
@@ -260,7 +260,7 @@ public class FormTableExecutor {
|
|||||||
param.setTableName(ctx.getTableName());
|
param.setTableName(ctx.getTableName());
|
||||||
param.setConditions(conditions);
|
param.setConditions(conditions);
|
||||||
param.setUpdateFields(fields);
|
param.setUpdateFields(fields);
|
||||||
Map<String, Object> sqlMap = generateSql(param);
|
Map<String, Object> sqlMap = SqlGenerator.generateSql(param);
|
||||||
JDBCAgent agent = new JDBCAgent();
|
JDBCAgent agent = new JDBCAgent();
|
||||||
try {
|
try {
|
||||||
log.info("执行sql为: " + sqlMap.get("sql"));
|
log.info("执行sql为: " + sqlMap.get("sql"));
|
||||||
@@ -284,7 +284,7 @@ public class FormTableExecutor {
|
|||||||
param.setTableName(tableName);
|
param.setTableName(tableName);
|
||||||
param.setConditions(conditions);
|
param.setConditions(conditions);
|
||||||
param.setUpdateFields(fields);
|
param.setUpdateFields(fields);
|
||||||
Map<String, Object> sqlMap = generateSql(param);
|
Map<String, Object> sqlMap = SqlGenerator.generateSql(param);
|
||||||
JDBCAgent agent = new JDBCAgent();
|
JDBCAgent agent = new JDBCAgent();
|
||||||
try {
|
try {
|
||||||
log.info("执行sql为: " + sqlMap.get("sql"));
|
log.info("执行sql为: " + sqlMap.get("sql"));
|
||||||
@@ -309,7 +309,7 @@ public class FormTableExecutor {
|
|||||||
param.setTableName(ctx.getTableName());
|
param.setTableName(ctx.getTableName());
|
||||||
param.setConditions(conditions);
|
param.setConditions(conditions);
|
||||||
|
|
||||||
Map<String, Object> sqlMap = generateSql(param);
|
Map<String, Object> sqlMap = SqlGenerator.generateSql(param);
|
||||||
JDBCAgent agent = new JDBCAgent();
|
JDBCAgent agent = new JDBCAgent();
|
||||||
try {
|
try {
|
||||||
log.info("执行sql为: " + sqlMap.get("sql"));
|
log.info("执行sql为: " + sqlMap.get("sql"));
|
||||||
@@ -401,346 +401,4 @@ public class FormTableExecutor {
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Map<String, Object> buildCountSql(
|
|
||||||
String countField,
|
|
||||||
String tableName,
|
|
||||||
List<FormWhereCondition> conditions) {
|
|
||||||
countField = countField == null ? "*" : countField;
|
|
||||||
StringBuilder sql = new StringBuilder("SELECT count(" + countField + ") as countnum FROM ")
|
|
||||||
.append(tableName);
|
|
||||||
|
|
||||||
List<Object> params = new ArrayList<>();
|
|
||||||
sql.append(buildWhereClause(conditions, params));
|
|
||||||
|
|
||||||
return buildResult(sql, params);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Map<String, Object> buildSelectSql(
|
|
||||||
String tableName,
|
|
||||||
List<String> queryColumns,
|
|
||||||
List<FormWhereCondition> conditions,
|
|
||||||
Integer limit,
|
|
||||||
Integer offset,
|
|
||||||
String orderField,String sortType) {
|
|
||||||
String dbName = (String) AppContext.getCache("DATABASE_NAME");
|
|
||||||
String orderBy = (orderField == null) ? "start_date" : orderField;
|
|
||||||
StringBuilder sql = new StringBuilder();
|
|
||||||
List<Object> params = new ArrayList<>();
|
|
||||||
// ===== 1. 构建 SELECT 字段 =====
|
|
||||||
StringBuilder selectFields = new StringBuilder();
|
|
||||||
if (queryColumns == null || queryColumns.isEmpty()) {
|
|
||||||
selectFields.append("*");
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < queryColumns.size(); i++) {
|
|
||||||
selectFields.append(queryColumns.get(i));
|
|
||||||
if (i < queryColumns.size() - 1) {
|
|
||||||
selectFields.append(",");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
selectFields.append(",ID");
|
|
||||||
}
|
|
||||||
if(sortType == null) {
|
|
||||||
sortType = "ASC";
|
|
||||||
}
|
|
||||||
// ===== 2. Oracle 分页特殊处理 =====
|
|
||||||
if ("oracle".equalsIgnoreCase(dbName) && limit != null && offset != null) {
|
|
||||||
sql.append("SELECT * FROM ( ");
|
|
||||||
sql.append(" SELECT t.*, ROW_NUMBER() OVER (ORDER BY ")
|
|
||||||
.append(orderBy)
|
|
||||||
.append(" "+ sortType +") rn ");
|
|
||||||
sql.append(" FROM ")
|
|
||||||
.append(tableName)
|
|
||||||
.append(" t ");
|
|
||||||
sql.append(buildWhereClause(conditions, params));
|
|
||||||
sql.append(" ) WHERE rn > ")
|
|
||||||
.append(offset)
|
|
||||||
.append(" AND rn <= ")
|
|
||||||
.append(offset + limit);
|
|
||||||
} else {
|
|
||||||
// ===== 3. MySQL / SQLServer 通用逻辑 =====
|
|
||||||
sql.append("SELECT ").append(selectFields);
|
|
||||||
sql.append(" FROM ").append(tableName);
|
|
||||||
sql.append(buildWhereClause(conditions, params));
|
|
||||||
sql.append(" ORDER BY ").append(orderBy).append(" " + sortType);
|
|
||||||
if (limit != null && offset != null) {
|
|
||||||
if ("mysql".equalsIgnoreCase(dbName)) {
|
|
||||||
sql.append(" LIMIT ").append(offset).append(",").append(limit);
|
|
||||||
}
|
|
||||||
if ("sqlserver".equalsIgnoreCase(dbName)) {
|
|
||||||
sql.append(" OFFSET ")
|
|
||||||
.append(offset)
|
|
||||||
.append(" ROWS FETCH NEXT ")
|
|
||||||
.append(limit)
|
|
||||||
.append(" ROWS ONLY");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sql.append(";");
|
|
||||||
return buildResult(sql, params);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Map<String, Object> buildUpdateSql(
|
|
||||||
String tableName,
|
|
||||||
List<FormUpdateField> fields,
|
|
||||||
List<FormWhereCondition> conditions) {
|
|
||||||
|
|
||||||
if (fields == null || fields.isEmpty()) {
|
|
||||||
throw new IllegalArgumentException("Update fields cannot be empty");
|
|
||||||
}
|
|
||||||
if (conditions == null || conditions.isEmpty()) {
|
|
||||||
throw new IllegalArgumentException("UPDATE must have WHERE conditions");
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuilder sql = new StringBuilder("UPDATE ")
|
|
||||||
.append(tableName)
|
|
||||||
.append(" SET ");
|
|
||||||
|
|
||||||
List<Object> params = new ArrayList<>();
|
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
for (FormUpdateField f : fields) {
|
|
||||||
if (count++ > 0) {
|
|
||||||
sql.append(", ");
|
|
||||||
}
|
|
||||||
if (f.getValue() instanceof String && ((String) f.getValue()).startsWith("DATE>")) {
|
|
||||||
sql.append(f.getFieldName()).append(" = TO_DATE(?, 'YYYY-MM-DD')");
|
|
||||||
params.add(((String) f.getValue()).substring(5));
|
|
||||||
} else {
|
|
||||||
sql.append(f.getFieldName()).append(" = ?");
|
|
||||||
params.add(f.getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count == 0) {
|
|
||||||
throw new IllegalArgumentException("No valid update fields");
|
|
||||||
}
|
|
||||||
|
|
||||||
sql.append(buildWhereClause(conditions, params));
|
|
||||||
return buildResult(sql, params);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Map<String, Object> buildDeleteSql(
|
|
||||||
String tableName,
|
|
||||||
List<FormWhereCondition> conditions) {
|
|
||||||
|
|
||||||
if (conditions == null || conditions.isEmpty()) {
|
|
||||||
throw new IllegalArgumentException("DELETE must have WHERE conditions");
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuilder values = new StringBuilder();
|
|
||||||
List<Object> params = new ArrayList<>();
|
|
||||||
|
|
||||||
StringBuilder sql = new StringBuilder("DELETE FROM ")
|
|
||||||
.append(tableName);
|
|
||||||
|
|
||||||
sql.append(buildWhereClause(conditions, params));
|
|
||||||
return buildResult(sql, params);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Map<String, Object> buildInsertSql(
|
|
||||||
String tableName,
|
|
||||||
Map<String, Object> data) {
|
|
||||||
|
|
||||||
if (data == null || data.isEmpty()) {
|
|
||||||
throw new IllegalArgumentException("Insert data cannot be empty");
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuilder columns = new StringBuilder();
|
|
||||||
StringBuilder values = new StringBuilder();
|
|
||||||
List<Object> params = new ArrayList<>();
|
|
||||||
|
|
||||||
for (Map.Entry<String, Object> e : data.entrySet()) {
|
|
||||||
if (columns.length() > 0) {
|
|
||||||
columns.append(",");
|
|
||||||
values.append(",");
|
|
||||||
}
|
|
||||||
columns.append(e.getKey());
|
|
||||||
values.append("?");
|
|
||||||
params.add(e.getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuilder sql = new StringBuilder("INSERT INTO ")
|
|
||||||
.append(tableName)
|
|
||||||
.append(" (")
|
|
||||||
.append(columns)
|
|
||||||
.append(") VALUES (")
|
|
||||||
.append(values)
|
|
||||||
.append(")");
|
|
||||||
|
|
||||||
return buildResult(sql, params);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 动态生成 WHERE 子句
|
|
||||||
* @param conditions 条件集合
|
|
||||||
* @param params 参数列表(引用传递)
|
|
||||||
* @return 拼接后的 WHERE 子句(包含 WHERE 关键字)
|
|
||||||
*/
|
|
||||||
private static String buildWhereClause(List<FormWhereCondition> conditions, List<Object> params) {
|
|
||||||
if (conditions == null || conditions.isEmpty()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
StringBuilder whereCause = new StringBuilder(" WHERE ");
|
|
||||||
for (int i = 0; i < conditions.size(); i++) {
|
|
||||||
FormWhereCondition c = conditions.get(i);
|
|
||||||
// 左括号
|
|
||||||
for (int b = 0; b < c.getStartWithBracket(); b++) {
|
|
||||||
whereCause.append("(");
|
|
||||||
}
|
|
||||||
String field = c.getFieldName();
|
|
||||||
// 字段表达式替换 如 CAST(fieldName AS DECIMAL(10,2))
|
|
||||||
if (c.getFieldExpression() != null) {
|
|
||||||
field = c.getFieldExpression().replace("fieldName", field);
|
|
||||||
}
|
|
||||||
ClauseFactor factor = c.getClauseFactor();
|
|
||||||
// 自定义表达式优先
|
|
||||||
if (c.getExpression() != null) {
|
|
||||||
whereCause.append(c.getExpression());
|
|
||||||
if (c.getValue() != null) {
|
|
||||||
params.add(c.getValue());
|
|
||||||
}
|
|
||||||
if (c.getValues() != null) {
|
|
||||||
params.addAll(c.getValues());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
String operator = parseOperator(factor);
|
|
||||||
// NULL / NOT NULL
|
|
||||||
if (factor.isNullType()) {
|
|
||||||
whereCause.append(field).append(" ").append(operator);
|
|
||||||
} else if (factor.isInType()) {
|
|
||||||
appendInClause(whereCause, field, operator, c.getValue(), params);
|
|
||||||
} else if (factor == ClauseFactor.FIND_IN_SET) {
|
|
||||||
whereCause.append("FIND_IN_SET(?, ").append(field).append(")");
|
|
||||||
params.add(c.getValue());
|
|
||||||
} else if (factor == ClauseFactor.BETWEEN) {
|
|
||||||
whereCause.append(field).append(" BETWEEN ? AND ?");
|
|
||||||
params.add(c.getValue());
|
|
||||||
params.add(c.getValues().get(0));
|
|
||||||
} else {
|
|
||||||
String placeholder = "?";
|
|
||||||
// 函数模板(如 TO_DATE(?))
|
|
||||||
if (c.getIndex() != null) {
|
|
||||||
placeholder = c.getIndex();
|
|
||||||
}
|
|
||||||
whereCause.append(field).append(" ").append(operator).append(" ").append(placeholder);
|
|
||||||
if (ClauseFactor.LIKE.equals(factor)) {
|
|
||||||
params.add("%" + c.getValue() + "%");
|
|
||||||
} else {
|
|
||||||
params.add(c.getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 右括号
|
|
||||||
for (int b = 0; b < c.getEndWithBracket(); b++) {
|
|
||||||
whereCause.append(")");
|
|
||||||
}
|
|
||||||
// AND / OR
|
|
||||||
if (i < conditions.size() - 1) {
|
|
||||||
whereCause.append(" ").append(c.getConcatFactor()).append(" ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return whereCause.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void appendInClause(
|
|
||||||
StringBuilder sql,
|
|
||||||
String field,
|
|
||||||
String operator,
|
|
||||||
Object value,
|
|
||||||
List<Object> params) {
|
|
||||||
if (!(value instanceof Collection)) {
|
|
||||||
throw new IllegalArgumentException("IN 条件的值必须是 Collection");
|
|
||||||
}
|
|
||||||
Collection<?> values = (Collection<?>) value;
|
|
||||||
if (values.isEmpty()) {
|
|
||||||
// 防止 SQL 语法错误
|
|
||||||
sql.append("1 = 0");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sql.append(field).append(" ").append(operator).append(" (");
|
|
||||||
int index = 0;
|
|
||||||
for (Object v : values) {
|
|
||||||
if (index > 0) {
|
|
||||||
sql.append(", ");
|
|
||||||
}
|
|
||||||
sql.append("?");
|
|
||||||
params.add(v);
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
sql.append(")");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 解析运算符映射(eq -> =, lt -> < 等)
|
|
||||||
*/
|
|
||||||
private static String parseOperator(ClauseFactor factor) {
|
|
||||||
if(factor == null) {
|
|
||||||
return "=";
|
|
||||||
}
|
|
||||||
switch (factor) {
|
|
||||||
case EQ: return "=";
|
|
||||||
case GT: return ">";
|
|
||||||
case GE: return ">=";
|
|
||||||
case LT: return "<";
|
|
||||||
case LE: return "<=";
|
|
||||||
case LIKE: return "LIKE";
|
|
||||||
case FIND_IN_SET: return "FIND_IN_SET";
|
|
||||||
case REGEXP: return "REGEXP";
|
|
||||||
case BETWEEN: return "BETWEEN";
|
|
||||||
case NULL: return "IS NULL"; // 空值判断
|
|
||||||
case NOT_NULL: return "IS NOT NULL"; // 非空判断
|
|
||||||
default: throw new UnsupportedOperationException("不支持的运算符: " + factor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Map<String, Object> buildResult(StringBuilder sql, List<Object> params) {
|
|
||||||
Map<String, Object> result = new HashMap<>();
|
|
||||||
result.put("sql", sql.toString());
|
|
||||||
result.put("params", params);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Map<String, Object> generateSql(SqlBuildParam param) {
|
|
||||||
|
|
||||||
if (param == null || param.getSqlType() == null) {
|
|
||||||
throw new IllegalArgumentException("SqlBuildParam or SqlType cannot be null");
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (param.getSqlType()) {
|
|
||||||
case COUNT:
|
|
||||||
return buildCountSql(
|
|
||||||
param.getCountField(),
|
|
||||||
param.getTableName(),
|
|
||||||
param.getConditions()
|
|
||||||
);
|
|
||||||
case SELECT:
|
|
||||||
return buildSelectSql(
|
|
||||||
param.getTableName(),
|
|
||||||
param.getQueryColumns(),
|
|
||||||
param.getConditions(),
|
|
||||||
param.getLimit(),
|
|
||||||
param.getOffset(),
|
|
||||||
param.getOrderField(),
|
|
||||||
param.getSortType()
|
|
||||||
);
|
|
||||||
case UPDATE:
|
|
||||||
return buildUpdateSql(
|
|
||||||
param.getTableName(),
|
|
||||||
param.getUpdateFields(),
|
|
||||||
param.getConditions()
|
|
||||||
);
|
|
||||||
case INSERT:
|
|
||||||
return buildInsertSql(
|
|
||||||
param.getTableName(),
|
|
||||||
param.getInsertData()
|
|
||||||
);
|
|
||||||
case DELETE:
|
|
||||||
return buildDeleteSql(
|
|
||||||
param.getTableName(),
|
|
||||||
param.getConditions()
|
|
||||||
);
|
|
||||||
default:
|
|
||||||
throw new UnsupportedOperationException("Unsupported SqlType: " + param.getSqlType());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
350
src/main/java/com/seeyon/utils/form/SqlGenerator.java
Normal file
350
src/main/java/com/seeyon/utils/form/SqlGenerator.java
Normal file
@@ -0,0 +1,350 @@
|
|||||||
|
package com.seeyon.utils.form;
|
||||||
|
|
||||||
|
import com.seeyon.ctp.common.AppContext;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class SqlGenerator {
|
||||||
|
|
||||||
|
public static Map<String, Object> generateSql(SqlBuildParam param) {
|
||||||
|
|
||||||
|
if (param == null || param.getSqlType() == null) {
|
||||||
|
throw new IllegalArgumentException("SqlBuildParam or SqlType cannot be null");
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (param.getSqlType()) {
|
||||||
|
case COUNT:
|
||||||
|
return buildCountSql(
|
||||||
|
param.getCountField(),
|
||||||
|
param.getTableName(),
|
||||||
|
param.getConditions()
|
||||||
|
);
|
||||||
|
case SELECT:
|
||||||
|
return buildSelectSql(
|
||||||
|
param.getTableName(),
|
||||||
|
param.getQueryColumns(),
|
||||||
|
param.getConditions(),
|
||||||
|
param.getLimit(),
|
||||||
|
param.getOffset(),
|
||||||
|
param.getOrderField(),
|
||||||
|
param.getSortType()
|
||||||
|
);
|
||||||
|
case UPDATE:
|
||||||
|
return buildUpdateSql(
|
||||||
|
param.getTableName(),
|
||||||
|
param.getUpdateFields(),
|
||||||
|
param.getConditions()
|
||||||
|
);
|
||||||
|
case INSERT:
|
||||||
|
return buildInsertSql(
|
||||||
|
param.getTableName(),
|
||||||
|
param.getInsertData()
|
||||||
|
);
|
||||||
|
case DELETE:
|
||||||
|
return buildDeleteSql(
|
||||||
|
param.getTableName(),
|
||||||
|
param.getConditions()
|
||||||
|
);
|
||||||
|
default:
|
||||||
|
throw new UnsupportedOperationException("Unsupported SqlType: " + param.getSqlType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, Object> buildCountSql(
|
||||||
|
String countField,
|
||||||
|
String tableName,
|
||||||
|
List<FormWhereCondition> conditions) {
|
||||||
|
countField = countField == null ? "*" : countField;
|
||||||
|
StringBuilder sql = new StringBuilder("SELECT count(" + countField + ") as countnum FROM ")
|
||||||
|
.append(tableName);
|
||||||
|
|
||||||
|
List<Object> params = new ArrayList<>();
|
||||||
|
sql.append(buildWhereClause(conditions, params));
|
||||||
|
|
||||||
|
return buildResult(sql, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, Object> buildSelectSql(
|
||||||
|
String tableName,
|
||||||
|
List<String> queryColumns,
|
||||||
|
List<FormWhereCondition> conditions,
|
||||||
|
Integer limit,
|
||||||
|
Integer offset,
|
||||||
|
String orderField, String sortType) {
|
||||||
|
String dbName = (String) AppContext.getCache("DATABASE_NAME");
|
||||||
|
String orderBy = (orderField == null) ? "start_date" : orderField;
|
||||||
|
StringBuilder sql = new StringBuilder();
|
||||||
|
List<Object> params = new ArrayList<>();
|
||||||
|
// ===== 1. 构建 SELECT 字段 =====
|
||||||
|
StringBuilder selectFields = new StringBuilder();
|
||||||
|
if (queryColumns == null || queryColumns.isEmpty()) {
|
||||||
|
selectFields.append("*");
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < queryColumns.size(); i++) {
|
||||||
|
selectFields.append(queryColumns.get(i));
|
||||||
|
if (i < queryColumns.size() - 1) {
|
||||||
|
selectFields.append(",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
selectFields.append(",ID");
|
||||||
|
}
|
||||||
|
if (sortType == null) {
|
||||||
|
sortType = "ASC";
|
||||||
|
}
|
||||||
|
// ===== 2. Oracle 分页特殊处理 =====
|
||||||
|
if ("oracle".equalsIgnoreCase(dbName) && limit != null && offset != null) {
|
||||||
|
sql.append("SELECT * FROM ( ");
|
||||||
|
sql.append(" SELECT t.*, ROW_NUMBER() OVER (ORDER BY ")
|
||||||
|
.append(orderBy)
|
||||||
|
.append(" " + sortType + ") rn ");
|
||||||
|
sql.append(" FROM ")
|
||||||
|
.append(tableName)
|
||||||
|
.append(" t ");
|
||||||
|
sql.append(buildWhereClause(conditions, params));
|
||||||
|
sql.append(" ) WHERE rn > ")
|
||||||
|
.append(offset)
|
||||||
|
.append(" AND rn <= ")
|
||||||
|
.append(offset + limit);
|
||||||
|
} else {
|
||||||
|
// ===== 3. MySQL / SQLServer 通用逻辑 =====
|
||||||
|
sql.append("SELECT ").append(selectFields);
|
||||||
|
sql.append(" FROM ").append(tableName);
|
||||||
|
sql.append(buildWhereClause(conditions, params));
|
||||||
|
sql.append(" ORDER BY ").append(orderBy).append(" " + sortType);
|
||||||
|
if (limit != null && offset != null) {
|
||||||
|
if ("mysql".equalsIgnoreCase(dbName)) {
|
||||||
|
sql.append(" LIMIT ").append(offset).append(",").append(limit);
|
||||||
|
}
|
||||||
|
if ("sqlserver".equalsIgnoreCase(dbName)) {
|
||||||
|
sql.append(" OFFSET ")
|
||||||
|
.append(offset)
|
||||||
|
.append(" ROWS FETCH NEXT ")
|
||||||
|
.append(limit)
|
||||||
|
.append(" ROWS ONLY");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sql.append(";");
|
||||||
|
return buildResult(sql, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, Object> buildUpdateSql(
|
||||||
|
String tableName,
|
||||||
|
List<FormUpdateField> fields,
|
||||||
|
List<FormWhereCondition> conditions) {
|
||||||
|
|
||||||
|
if (fields == null || fields.isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("Update fields cannot be empty");
|
||||||
|
}
|
||||||
|
if (conditions == null || conditions.isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("UPDATE must have WHERE conditions");
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder sql = new StringBuilder("UPDATE ")
|
||||||
|
.append(tableName)
|
||||||
|
.append(" SET ");
|
||||||
|
|
||||||
|
List<Object> params = new ArrayList<>();
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
for (FormUpdateField f : fields) {
|
||||||
|
if (count++ > 0) {
|
||||||
|
sql.append(", ");
|
||||||
|
}
|
||||||
|
if (f.getValue() instanceof String && ((String) f.getValue()).startsWith("DATE>")) {
|
||||||
|
sql.append(f.getFieldName()).append(" = TO_DATE(?, 'YYYY-MM-DD')");
|
||||||
|
params.add(((String) f.getValue()).substring(5));
|
||||||
|
} else {
|
||||||
|
sql.append(f.getFieldName()).append(" = ?");
|
||||||
|
params.add(f.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count == 0) {
|
||||||
|
throw new IllegalArgumentException("No valid update fields");
|
||||||
|
}
|
||||||
|
|
||||||
|
sql.append(buildWhereClause(conditions, params));
|
||||||
|
return buildResult(sql, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, Object> buildDeleteSql(
|
||||||
|
String tableName,
|
||||||
|
List<FormWhereCondition> conditions) {
|
||||||
|
|
||||||
|
if (conditions == null || conditions.isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("DELETE must have WHERE conditions");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Object> params = new ArrayList<>();
|
||||||
|
|
||||||
|
StringBuilder sql = new StringBuilder("DELETE FROM ")
|
||||||
|
.append(tableName);
|
||||||
|
|
||||||
|
sql.append(buildWhereClause(conditions, params));
|
||||||
|
return buildResult(sql, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, Object> buildInsertSql(
|
||||||
|
String tableName,
|
||||||
|
Map<String, Object> data) {
|
||||||
|
|
||||||
|
if (data == null || data.isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("Insert data cannot be empty");
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder columns = new StringBuilder();
|
||||||
|
StringBuilder values = new StringBuilder();
|
||||||
|
List<Object> params = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Map.Entry<String, Object> e : data.entrySet()) {
|
||||||
|
if (columns.length() > 0) {
|
||||||
|
columns.append(",");
|
||||||
|
values.append(",");
|
||||||
|
}
|
||||||
|
columns.append(e.getKey());
|
||||||
|
values.append("?");
|
||||||
|
params.add(e.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder sql = new StringBuilder("INSERT INTO ")
|
||||||
|
.append(tableName)
|
||||||
|
.append(" (")
|
||||||
|
.append(columns)
|
||||||
|
.append(") VALUES (")
|
||||||
|
.append(values)
|
||||||
|
.append(")");
|
||||||
|
|
||||||
|
return buildResult(sql, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 动态生成 WHERE 子句
|
||||||
|
* @param conditions 条件集合
|
||||||
|
* @param params 参数列表(引用传递)
|
||||||
|
* @return 拼接后的 WHERE 子句(包含 WHERE 关键字)
|
||||||
|
*/
|
||||||
|
static String buildWhereClause(List<FormWhereCondition> conditions, List<Object> params) {
|
||||||
|
if (conditions == null || conditions.isEmpty()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
StringBuilder whereCause = new StringBuilder(" WHERE ");
|
||||||
|
for (int i = 0; i < conditions.size(); i++) {
|
||||||
|
FormWhereCondition c = conditions.get(i);
|
||||||
|
// 左括号
|
||||||
|
for (int b = 0; b < c.getStartWithBracket(); b++) {
|
||||||
|
whereCause.append("(");
|
||||||
|
}
|
||||||
|
String field = c.getFieldName();
|
||||||
|
// 字段表达式替换 如 CAST(fieldName AS DECIMAL(10,2))
|
||||||
|
if (c.getFieldExpression() != null) {
|
||||||
|
field = c.getFieldExpression().replace("fieldName", field);
|
||||||
|
}
|
||||||
|
ClauseFactor factor = c.getClauseFactor();
|
||||||
|
// 自定义表达式优先
|
||||||
|
if (c.getExpression() != null) {
|
||||||
|
whereCause.append(c.getExpression());
|
||||||
|
if (c.getValue() != null) {
|
||||||
|
params.add(c.getValue());
|
||||||
|
}
|
||||||
|
if (c.getValues() != null) {
|
||||||
|
params.addAll(c.getValues());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
String operator = parseOperator(factor);
|
||||||
|
// NULL / NOT NULL
|
||||||
|
if (factor.isNullType()) {
|
||||||
|
whereCause.append(field).append(" ").append(operator);
|
||||||
|
} else if (factor.isInType()) {
|
||||||
|
appendInClause(whereCause, field, operator, c.getValue(), params);
|
||||||
|
} else if (factor == ClauseFactor.FIND_IN_SET) {
|
||||||
|
whereCause.append("FIND_IN_SET(?, ").append(field).append(")");
|
||||||
|
params.add(c.getValue());
|
||||||
|
} else if (factor == ClauseFactor.BETWEEN) {
|
||||||
|
whereCause.append(field).append(" BETWEEN ? AND ?");
|
||||||
|
params.add(c.getValue());
|
||||||
|
params.add(c.getValues().get(0));
|
||||||
|
} else {
|
||||||
|
String placeholder = "?";
|
||||||
|
// 函数模板(如 TO_DATE(?))
|
||||||
|
if (c.getIndex() != null) {
|
||||||
|
placeholder = c.getIndex();
|
||||||
|
}
|
||||||
|
whereCause.append(field).append(" ").append(operator).append(" ").append(placeholder);
|
||||||
|
if (ClauseFactor.LIKE.equals(factor)) {
|
||||||
|
params.add("%" + c.getValue() + "%");
|
||||||
|
} else {
|
||||||
|
params.add(c.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 右括号
|
||||||
|
for (int b = 0; b < c.getEndWithBracket(); b++) {
|
||||||
|
whereCause.append(")");
|
||||||
|
}
|
||||||
|
// AND / OR
|
||||||
|
if (i < conditions.size() - 1) {
|
||||||
|
whereCause.append(" ").append(c.getConcatFactor()).append(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return whereCause.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void appendInClause(
|
||||||
|
StringBuilder sql,
|
||||||
|
String field,
|
||||||
|
String operator,
|
||||||
|
Object value,
|
||||||
|
List<Object> params) {
|
||||||
|
if (!(value instanceof Collection)) {
|
||||||
|
throw new IllegalArgumentException("IN 条件的值必须是 Collection");
|
||||||
|
}
|
||||||
|
Collection<?> values = (Collection<?>) value;
|
||||||
|
if (values.isEmpty()) {
|
||||||
|
// 防止 SQL 语法错误
|
||||||
|
sql.append("1 = 0");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sql.append(field).append(" ").append(operator).append(" (");
|
||||||
|
int index = 0;
|
||||||
|
for (Object v : values) {
|
||||||
|
if (index > 0) {
|
||||||
|
sql.append(", ");
|
||||||
|
}
|
||||||
|
sql.append("?");
|
||||||
|
params.add(v);
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
sql.append(")");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解析运算符映射(eq -> =, lt -> < 等)
|
||||||
|
*/
|
||||||
|
private static String parseOperator(ClauseFactor factor) {
|
||||||
|
if (factor == null) {
|
||||||
|
return "=";
|
||||||
|
}
|
||||||
|
switch (factor) {
|
||||||
|
case EQ: return "=";
|
||||||
|
case GT: return ">";
|
||||||
|
case GE: return ">=";
|
||||||
|
case LT: return "<";
|
||||||
|
case LE: return "<=";
|
||||||
|
case LIKE: return "LIKE";
|
||||||
|
case FIND_IN_SET: return "FIND_IN_SET";
|
||||||
|
case REGEXP: return "REGEXP";
|
||||||
|
case BETWEEN: return "BETWEEN";
|
||||||
|
case NULL: return "IS NULL";
|
||||||
|
case NOT_NULL: return "IS NOT NULL";
|
||||||
|
default: throw new UnsupportedOperationException("不支持的运算符: " + factor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, Object> buildResult(StringBuilder sql, List<Object> params) {
|
||||||
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
result.put("sql", sql.toString());
|
||||||
|
result.put("params", params);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user