Переглянути джерело

Merge pull request #5458 from nieqiurong/fix_3812

解决PluginUtils重复获取元数据带来的性能消耗.
qmdx 1 рік тому
батько
коміт
235e8581da

+ 25 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/PluginUtils.java

@@ -21,6 +21,7 @@ import org.apache.ibatis.executor.statement.StatementHandler;
 import org.apache.ibatis.mapping.BoundSql;
 import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.ParameterMapping;
+import org.apache.ibatis.reflection.DefaultReflectorFactory;
 import org.apache.ibatis.reflection.MetaObject;
 import org.apache.ibatis.reflection.SystemMetaObject;
 import org.apache.ibatis.session.Configuration;
@@ -38,6 +39,14 @@ import java.util.Map;
  * @since 2017-06-20
  */
 public abstract class PluginUtils {
+
+    /**
+     * 缓存内置的插件对象反射信息
+     *
+     * @since 3.5.3
+     */
+    public static final DefaultReflectorFactory DEFAULT_REFLECTOR_FACTORY = new DefaultReflectorFactory();
+
     public static final String DELEGATE_BOUNDSQL_SQL = "delegate.boundSql.sql";
 
     /**
@@ -46,12 +55,23 @@ public abstract class PluginUtils {
     @SuppressWarnings("unchecked")
     public static <T> T realTarget(Object target) {
         if (Proxy.isProxyClass(target.getClass())) {
-            MetaObject metaObject = SystemMetaObject.forObject(target);
+            MetaObject metaObject = getMetaObject(target);
             return realTarget(metaObject.getValue("h.target"));
         }
         return (T) target;
     }
 
+    /**
+     * 获取对象元数据信息
+     *
+     * @param object 参数
+     * @return 元数据信息
+     * @since 3.5.3
+     */
+    public static MetaObject getMetaObject(Object object) {
+        return MetaObject.forObject(object, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, DEFAULT_REFLECTOR_FACTORY);
+    }
+
     /**
      * 给 BoundSql 设置 additionalParameters
      *
@@ -68,8 +88,8 @@ public abstract class PluginUtils {
 
     public static MPStatementHandler mpStatementHandler(StatementHandler statementHandler) {
         statementHandler = realTarget(statementHandler);
-        MetaObject object = SystemMetaObject.forObject(statementHandler);
-        return new MPStatementHandler(SystemMetaObject.forObject(object.getValue("delegate")));
+        MetaObject object = getMetaObject(statementHandler);
+        return new MPStatementHandler(getMetaObject(object.getValue("delegate")));
     }
 
     /**
@@ -116,12 +136,13 @@ public abstract class PluginUtils {
      * {@link BoundSql}
      */
     public static class MPBoundSql {
+
         private final MetaObject boundSql;
         private final BoundSql delegate;
 
         MPBoundSql(BoundSql boundSql) {
             this.delegate = boundSql;
-            this.boundSql = SystemMetaObject.forObject(boundSql);
+            this.boundSql = getMetaObject(boundSql);
         }
 
         public String sql() {

+ 3 - 4
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DataChangeRecorderInnerInterceptor.java

@@ -42,7 +42,6 @@ import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.ParameterMapping;
 import org.apache.ibatis.mapping.SqlCommandType;
 import org.apache.ibatis.reflection.MetaObject;
-import org.apache.ibatis.reflection.SystemMetaObject;
 import org.apache.ibatis.scripting.defaults.DefaultParameterHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -220,7 +219,7 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
         BoundSql boundSql4Select = new BoundSql(mappedStatement.getConfiguration(), selectStmt.toString(),
             prepareParameterMapping4Select(boundSql.getParameterMappings(), updateStmt),
             boundSql.getParameterObject());
-        MetaObject metaObject = SystemMetaObject.forObject(boundSql);
+        MetaObject metaObject = PluginUtils.getMetaObject(boundSql);
         Map<String, Object> additionalParameters = (Map<String, Object>) metaObject.getValue("additionalParameters");
         if (additionalParameters != null && !additionalParameters.isEmpty()) {
             for (Map.Entry<String, Object> ety : additionalParameters.entrySet()) {
@@ -285,7 +284,7 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
             //FIRSTNAME: FIRST_NAME/FIRST-NAME/FIRST$NAME/FIRST.NAME
             relatedColumnsUpperCaseWithoutUnderline.put(item.toString().replaceAll("[._\\-$]", "").toUpperCase(), item.toString().toUpperCase());
         }
-        MetaObject metaObject = SystemMetaObject.forObject(updateSql.getParameterObject());
+        MetaObject metaObject = PluginUtils.getMetaObject(updateSql.getParameterObject());
 
         for (ParameterMapping parameterMapping : updateSql.getParameterMappings()) {
             String propertyName = parameterMapping.getProperty();
@@ -324,7 +323,7 @@ public class DataChangeRecorderInnerInterceptor implements InnerInterceptor {
 
 
     private Map<String, Object> buildParameterObjectMap(BoundSql boundSql) {
-        MetaObject metaObject = SystemMetaObject.forObject(boundSql.getParameterObject());
+        MetaObject metaObject = PluginUtils.getMetaObject(boundSql.getParameterObject());
         Map<String, Object> propertyValMap = new HashMap<>(boundSql.getParameterMappings().size());
         for (ParameterMapping parameterMapping : boundSql.getParameterMappings()) {
             String propertyName = parameterMapping.getProperty();