diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/EnumWrapper.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/EnumWrapper.java index f9605ce8..d8d5c613 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/EnumWrapper.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/EnumWrapper.java @@ -98,14 +98,15 @@ public class EnumWrapper> { * @param object * @return */ - public Object getEnumValue(E object) { + public Object getEnumValue(Object object) { try { if (getterMethod != null) { return getterMethod.invoke(object); } else if(property != null){ return property.get(object); } else { - return object.name(); + //noinspection unchecked + return ((E)object).name(); } } catch (Exception e) { throw FlexExceptions.wrap(e); diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/SqlUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/SqlUtil.java index 59339f51..f78240a6 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/SqlUtil.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/SqlUtil.java @@ -15,7 +15,13 @@ */ package com.mybatisflex.core.util; +import com.mybatisflex.core.audit.AuditMessage; +import com.mybatisflex.core.mybatis.TypeHandlerObject; + import java.lang.reflect.Array; +import java.lang.reflect.Proxy; +import java.sql.PreparedStatement; +import java.sql.SQLException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; @@ -163,6 +169,26 @@ public class SqlUtil { } return joiner.toString(); } + // TypeHandlerObject + else if (value instanceof TypeHandlerObject) { + TypeHandlerObject handlerObject = (TypeHandlerObject) value; + String[] paramArray = new String[1]; + PreparedStatement preparedStatement = createPreparedStatement(paramArray); + try { + handlerObject.setParameter(preparedStatement, 0); + } catch (SQLException e) { + throw new RuntimeException(e); + } + return paramArray[0]; + } + + // enum + else if (value.getClass().isEnum()) { + EnumWrapper ew = EnumWrapper.of(value.getClass()); + Object enumValue = ew.getEnumValue(value); + return enumValue.toString(); + } + // other else { StringBuilder sb = new StringBuilder(); @@ -192,4 +218,15 @@ public class SqlUtil { return sb.toString(); } + + private static PreparedStatement createPreparedStatement(String[] params) { + return (PreparedStatement) Proxy.newProxyInstance( + AuditMessage.class.getClassLoader(), + new Class[]{PreparedStatement.class}, (proxy, method, args) -> { + if (args != null && (args.length == 2 || args.length == 3)) { + params[0] = args[1].toString(); + } + return null; + }); + } } diff --git a/mybatis-flex-test/mybatis-flex-spring-test/src/main/java/com/mybatisflex/test/model/EnumTypeHandler.java b/mybatis-flex-test/mybatis-flex-spring-test/src/main/java/com/mybatisflex/test/model/EnumTypeHandler.java index c0a84be1..c261893b 100644 --- a/mybatis-flex-test/mybatis-flex-spring-test/src/main/java/com/mybatisflex/test/model/EnumTypeHandler.java +++ b/mybatis-flex-test/mybatis-flex-spring-test/src/main/java/com/mybatisflex/test/model/EnumTypeHandler.java @@ -51,7 +51,7 @@ public class EnumTypeHandler & BaseEnum> extends BaseTypeHandl * @param value 枚举值 * @return 枚举对象 */ - private E getEnumByValue(int value) { + public E getEnumByValue(int value) { return Stream.of(enumClass.getEnumConstants()).filter(e -> e.getValue() == value).findAny().orElse(null); } }