diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/ModifyAttrsRecordHandler.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/ModifyAttrsRecordHandler.java index d76b083d..6f5e4c2c 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/ModifyAttrsRecordHandler.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/ModifyAttrsRecordHandler.java @@ -25,7 +25,9 @@ import java.util.Map; class ModifyAttrsRecordHandler implements MethodHandler { - //更新内容 + /** + * 更新的字段和内容 + */ private final Map updates = new LinkedHashMap<>(); public Map getUpdates() { diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/ModifyAttrsRecordProxyFactory.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/ModifyAttrsRecordProxyFactory.java index e96fe126..aac36f31 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/ModifyAttrsRecordProxyFactory.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/update/ModifyAttrsRecordProxyFactory.java @@ -19,8 +19,11 @@ import com.mybatisflex.core.util.ClassUtil; import org.apache.ibatis.javassist.util.proxy.ProxyFactory; import org.apache.ibatis.javassist.util.proxy.ProxyObject; import org.apache.ibatis.logging.LogFactory; +import org.apache.ibatis.util.MapUtil; import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** @@ -28,37 +31,38 @@ import java.util.Arrays; */ public class ModifyAttrsRecordProxyFactory { - private static final ModifyAttrsRecordProxyFactory instance = new ModifyAttrsRecordProxyFactory(); + protected static final Map, Class> CACHE = new ConcurrentHashMap<>(); + private static final ModifyAttrsRecordProxyFactory INSTANCE = new ModifyAttrsRecordProxyFactory(); public static ModifyAttrsRecordProxyFactory getInstance() { - return instance; + return INSTANCE; } private ModifyAttrsRecordProxyFactory() { } public T get(Class target) { - ProxyFactory factory = new ProxyFactory(); - factory.setSuperclass(target); + Class proxyClass = MapUtil.computeIfAbsent(CACHE, target, aClass -> { + ProxyFactory factory = new ProxyFactory(); + factory.setSuperclass(target); - Class[] interfaces = Arrays.copyOf(target.getInterfaces(), target.getInterfaces().length + 1); - interfaces[interfaces.length - 1] = UpdateWrapper.class; - factory.setInterfaces(interfaces); + Class[] interfaces = Arrays.copyOf(target.getInterfaces(), target.getInterfaces().length + 1); + interfaces[interfaces.length - 1] = UpdateWrapper.class; + factory.setInterfaces(interfaces); - final Class proxyClass = factory.createClass(); + return factory.createClass(); + }); T proxyObject = null; try { proxyObject = (T) ClassUtil.newInstance(proxyClass); ((ProxyObject) proxyObject).setHandler(new ModifyAttrsRecordHandler()); - } catch (Exception e){ + } catch (Exception e) { LogFactory.getLog(ModifyAttrsRecordProxyFactory.class).error(e.toString(), e); } return proxyObject; } - - } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java index 541018a8..2ba8ac04 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/util/ClassUtil.java @@ -141,7 +141,7 @@ public class ClassUtil { // 没有任何构造函数的情况下,去查找 static 工厂方法,满足 lombok 注解的需求 else { Method factoryMethod = ClassUtil.getFirstMethod(clazz, m -> m.getParameterCount() == 0 - && clazz.isAssignableFrom(m.getReturnType()) + && clazz == m.getReturnType() && Modifier.isPublic(m.getModifiers()) && Modifier.isStatic(m.getModifiers())); if (factoryMethod != null) { diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/MainSqlTest.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/MainSqlTest.java index 528d4fb6..7760bb1f 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/MainSqlTest.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/MainSqlTest.java @@ -53,7 +53,7 @@ public class MainSqlTest { String sql2 = UpdateChain.of(Article.class) .set("xxxx", "xxxx") -// .where(Article::getId).ge(100) + .where(Article::getId).ge(100) .toSQL(); System.out.println(sql2);