diff --git a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/interceptor/AuditingInterceptor.java b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/interceptor/AuditingInterceptor.java index 4cc536ca..a178fe56 100644 --- a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/interceptor/AuditingInterceptor.java +++ b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/interceptor/AuditingInterceptor.java @@ -68,22 +68,23 @@ public Object intercept(Invocation invocation) throws Throwable { Object parameter = invocation.getArgs()[1]; log.debug("sqlCommandType {}", sqlCommandType); - Collection objects; - if (parameter instanceof MapperMethod.ParamMap) { - MapperMethod.ParamMap paramMap = ((MapperMethod.ParamMap) parameter); - if (paramMap.get("param1") instanceof Collection) { - objects = ((Collection) paramMap.get("param1")); + if (SqlCommandType.INSERT == sqlCommandType || SqlCommandType.UPDATE == sqlCommandType) { + Collection objects; + if (parameter instanceof MapperMethod.ParamMap) { + MapperMethod.ParamMap paramMap = ((MapperMethod.ParamMap) parameter); + if (paramMap.get("param1") instanceof Collection) { + objects = ((Collection) paramMap.get("param1")); + } else { + objects = Collections.singletonList(paramMap.get("param1")); + } } else { - objects = Collections.singletonList(paramMap.get("param1")); + objects = Collections.singletonList(parameter); } - } else { - objects = Collections.singletonList(parameter); - } - for (Object o : objects) { - setAuditFields(o, sqlCommandType); + for (Object o : objects) { + setAuditFields(o, sqlCommandType); + } } - return invocation.proceed(); } @@ -92,26 +93,25 @@ private void setAuditFields(Object object, SqlCommandType sqlCommandType) throws Timestamp timestamp = new Timestamp(System.currentTimeMillis()); List fields = ClassUtils.getFields(object.getClass()); - if (SqlCommandType.INSERT == sqlCommandType || SqlCommandType.UPDATE == sqlCommandType) { - for (Field field : fields) { - boolean accessible = field.canAccess(object); - field.setAccessible(true); - if (field.isAnnotationPresent(CreateBy.class) - && SqlCommandType.INSERT == sqlCommandType - && userId != null) { - field.set(object, userId); - } - if (field.isAnnotationPresent(CreateTime.class) && SqlCommandType.INSERT == sqlCommandType) { - field.set(object, timestamp); - } - if (field.isAnnotationPresent(UpdateBy.class) && userId != null) { - field.set(object, userId); - } - if (field.isAnnotationPresent(UpdateTime.class)) { - field.set(object, timestamp); - } - field.setAccessible(accessible); + + for (Field field : fields) { + boolean accessible = field.canAccess(object); + field.setAccessible(true); + if (field.isAnnotationPresent(CreateBy.class) + && SqlCommandType.INSERT == sqlCommandType + && userId != null) { + field.set(object, userId); + } + if (field.isAnnotationPresent(CreateTime.class) && SqlCommandType.INSERT == sqlCommandType) { + field.set(object, timestamp); + } + if (field.isAnnotationPresent(UpdateBy.class) && userId != null) { + field.set(object, userId); + } + if (field.isAnnotationPresent(UpdateTime.class)) { + field.set(object, timestamp); } + field.setAccessible(accessible); } } } diff --git a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java index ce729c77..45745681 100644 --- a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java +++ b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java @@ -34,12 +34,10 @@ import java.beans.PropertyDescriptor; import java.io.Serializable; import java.lang.reflect.Field; -import java.text.MessageFormat; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; /** * Multiple data source support @@ -98,7 +96,7 @@ public static String update(TableMetaData tableMetaData, Entity entity, } Object value = ReflectionUtils.invokeMethod(ps.getReadMethod(), entity); if (!ObjectUtils.isEmpty(value)) { - sql.SET("`" + getEquals(entry.getValue() + "`", entry.getKey())); + sql.SET(getEquals(entry.getValue(), entry.getKey())); } } @@ -120,7 +118,7 @@ public static String selectById(TableMetaData tableMetaData, String databaseId, case MYSQL: { sql.SELECT(tableMetaData.getBaseColumns()); sql.FROM(tableMetaData.getTableName()); - sql.WHERE(tableMetaData.getPkColumn() + " = '" + id + "'"); + sql.WHERE(getEquals(tableMetaData.getPkColumn(), tableMetaData.getPkProperty())); break; } default: { @@ -137,10 +135,20 @@ public static String selectByIds( SQL sql = new SQL(); switch (DBType.toType(databaseId)) { case MYSQL: { - String idsStr = ids.stream().map(String::valueOf).collect(Collectors.joining("', '")); sql.SELECT(tableMetaData.getBaseColumns()); sql.FROM(tableMetaData.getTableName()); - sql.WHERE(tableMetaData.getPkColumn() + " in ('" + idsStr + "')"); + if (ids == null || ids.isEmpty()) { + sql.WHERE("1 = 0"); + break; + } + + StringBuilder idStr = new StringBuilder(); + for (int i = 0; i < ids.size(); i++) { + idStr.append(getTokenParam("arg0[" + i + "]")).append(","); + } + idStr.deleteCharAt(idStr.lastIndexOf(",")); + + sql.WHERE(tableMetaData.getPkColumn() + " IN ( " + idStr + " )"); break; } default: { @@ -173,7 +181,7 @@ public static String deleteById(TableMetaData tableMetaData, String databaseId, switch (DBType.toType(databaseId)) { case MYSQL: { sql.DELETE_FROM(tableMetaData.getTableName()); - sql.WHERE(tableMetaData.getPkColumn() + " = '" + id + "'"); + sql.WHERE(getEquals(tableMetaData.getPkColumn(), tableMetaData.getPkProperty())); break; } default: { @@ -189,9 +197,18 @@ public static String deleteByIds( SQL sql = new SQL(); switch (DBType.toType(databaseId)) { case MYSQL: { - String idsStr = ids.stream().map(String::valueOf).collect(Collectors.joining("', '")); + if (ids == null || ids.isEmpty()) { + break; + } sql.DELETE_FROM(tableMetaData.getTableName()); - sql.WHERE(tableMetaData.getPkColumn() + " in ('" + idsStr + "')"); + + StringBuilder idStr = new StringBuilder(); + for (int i = 0; i < ids.size(); i++) { + idStr.append(getTokenParam("arg0[" + i + "]")).append(","); + } + idStr.deleteCharAt(idStr.lastIndexOf(",")); + + sql.WHERE(tableMetaData.getPkColumn() + " IN ( " + idStr + " )"); break; } default: { @@ -204,12 +221,11 @@ public static String deleteByIds( public static String findByCondition( TableMetaData tableMetaData, String databaseId, Condition condition) throws IllegalAccessException { - String tableName = tableMetaData.getTableName(); log.info("databaseId: {}", databaseId); SQL sql = new SQL(); switch (DBType.toType(databaseId)) { case MYSQL: { - sql = mysqlCondition(condition, tableName); + sql = mysqlCondition(condition, tableMetaData); break; } default: { @@ -221,14 +237,15 @@ public static String findByCondition( } private static String getEquals(String column, String property) { - return column + " = " + getTokenParam(property); + return "`" + column + "` = " + getTokenParam(property); } private static String getTokenParam(String property) { return "#{" + property + "}"; } - private static SQL mysqlCondition(Condition condition, String tableName) throws IllegalAccessException { + private static SQL mysqlCondition(Condition condition, TableMetaData tableMetaData) + throws IllegalAccessException { Class loadClass; try { @@ -241,7 +258,7 @@ private static SQL mysqlCondition(Condition condition, String tableN /* Prepare SQL */ SQL sql = new SQL(); sql.SELECT("*"); - sql.FROM(tableName); + sql.FROM(tableMetaData.getTableName()); for (Field field : fieldList) { field.setAccessible(true); String fieldName = field.getName(); @@ -249,75 +266,72 @@ private static SQL mysqlCondition(Condition condition, String tableN if (field.isAnnotationPresent(QueryCondition.class) && Objects.nonNull(field.get(condition))) { QueryCondition annotation = field.getAnnotation(QueryCondition.class); - String queryKey = fieldName; + String property = fieldName; if (!annotation.queryKey().isEmpty()) { - queryKey = annotation.queryKey(); + property = annotation.queryKey(); } - log.info( - "[queryKey] {}, [queryType] {}, [queryValue] {}", - queryKey, - annotation.queryType().toString(), - field.get(condition)); - Object value = field.get(condition); - if (value != null) { + Map fieldColumnMap = tableMetaData.getFieldColumnMap(); + + if (value != null && fieldColumnMap.containsKey(property)) { + String columnName = fieldColumnMap.get(property); + + log.info( + "[queryKey] {}, [queryType] {}, [queryValue] {}", + property, + annotation.queryType().toString(), + field.get(condition)); switch (annotation.queryType()) { case EQ: - sql.WHERE(MessageFormat.format("{0} = ''{1}''", queryKey, value)); + sql.WHERE(getEquals(columnName, fieldName)); break; case NOT_EQ: - sql.WHERE(MessageFormat.format("{0} != ''{1}''", queryKey, value)); + sql.WHERE(columnName + " != " + getTokenParam(fieldName)); break; case IN: - sql.WHERE(MessageFormat.format( - "{0} IN (''{1}'')", - queryKey, - String.join("','", value.toString().split(annotation.multipleDelimiter())))); + sql.WHERE(columnName + " IN ( REPLACE( " + getTokenParam(fieldName) + ", '" + + annotation.multipleDelimiter() + "', ',') )"); break; case NOT_IN: - sql.WHERE(MessageFormat.format( - "{0} NOT IN (''{1}'')", - queryKey, - String.join("','", value.toString().split(annotation.multipleDelimiter())))); + sql.WHERE(columnName + " NOT IN ( REPLACE( " + getTokenParam(fieldName) + ", '" + + annotation.multipleDelimiter() + "', ',') )"); break; case GT: - sql.WHERE(MessageFormat.format("{0} > ''{1}''", queryKey, value)); + sql.WHERE(columnName + " > " + getTokenParam(fieldName)); break; case GTE: - sql.WHERE(MessageFormat.format("{0} >= ''{1}''", queryKey, value)); + sql.WHERE(columnName + " >= " + getTokenParam(fieldName)); break; case LT: - sql.WHERE(MessageFormat.format("{0} < ''{1}''", queryKey, value)); + sql.WHERE(columnName + " < " + getTokenParam(fieldName)); break; case LTE: - sql.WHERE(MessageFormat.format("{0} <= ''{1}''", queryKey, value)); + sql.WHERE(columnName + " <= " + getTokenParam(fieldName)); break; case BETWEEN: - String[] valueArr = field.get(condition).toString().split(annotation.pairDelimiter()); - if (valueArr.length == 2) { - sql.WHERE(MessageFormat.format( - "{0} BETWEEN ''{1}'' AND ''{2}''", queryKey, valueArr[0], valueArr[1])); - } + sql.WHERE(columnName + " BETWEEN SUBSTRING_INDEX( " + getTokenParam(fieldName) + ", '" + + annotation.pairDelimiter() + "', 1) AND SUBSTRING_INDEX( " + + getTokenParam(fieldName) + ", '" + + annotation.pairDelimiter() + "', 2)"); break; case PREFIX_LIKE: - sql.WHERE(MessageFormat.format("{0} LIKE CONCAT(''{1}'', ''%'')", queryKey, value)); + sql.WHERE(columnName + " LIKE CONCAT( " + getTokenParam(fieldName) + ", '%')"); break; case SUFFIX_LIKE: - sql.WHERE(MessageFormat.format("{0} LIKE CONCAT(''%'', ''{1}'')", queryKey, value)); + sql.WHERE(columnName + " LIKE CONCAT('%', " + getTokenParam(fieldName) + ")"); break; case LIKE: - sql.WHERE(MessageFormat.format("{0} LIKE CONCAT(''%'', ''{1}'', ''%'')", queryKey, value)); + sql.WHERE(columnName + " LIKE CONCAT('%', " + getTokenParam(fieldName) + ", '%')"); break; case NOT_LIKE: - sql.WHERE(MessageFormat.format( - "{0} NOT LIKE CONCAT(''%'', ''{1}'', ''%'')", queryKey, value)); + sql.WHERE(columnName + " NOT LIKE CONCAT('%', " + getTokenParam(fieldName) + ", '%')"); break; case NULL: - sql.WHERE(queryKey + " IS NULL"); + sql.WHERE(columnName + " IS NULL"); break; case NOT_NULL: - sql.WHERE(queryKey + " IS NOT NULL"); + sql.WHERE(columnName + " IS NOT NULL"); break; default: log.warn("Unknown query type: {}", annotation.queryType());