瀏覽代碼

bugfix for oracle > get original sql

yuxiaobin 7 年之前
父節點
當前提交
02300f0e1a
共有 1 個文件被更改,包括 34 次插入15 次删除
  1. 34 15
      src/main/java/com/baomidou/mybatisplus/plugins/PerformanceInterceptor.java

+ 34 - 15
src/main/java/com/baomidou/mybatisplus/plugins/PerformanceInterceptor.java

@@ -15,25 +15,29 @@
  */
 package com.baomidou.mybatisplus.plugins;
 
-import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
-import com.baomidou.mybatisplus.toolkit.PluginUtils;
-import com.baomidou.mybatisplus.toolkit.SqlUtils;
-import com.baomidou.mybatisplus.toolkit.StringUtils;
-import com.baomidou.mybatisplus.toolkit.SystemClock;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.sql.Statement;
+import java.util.Properties;
 
 import org.apache.ibatis.executor.statement.StatementHandler;
 import org.apache.ibatis.logging.Log;
 import org.apache.ibatis.logging.LogFactory;
 import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.plugin.*;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.plugin.Intercepts;
+import org.apache.ibatis.plugin.Invocation;
+import org.apache.ibatis.plugin.Plugin;
+import org.apache.ibatis.plugin.Signature;
 import org.apache.ibatis.reflection.MetaObject;
 import org.apache.ibatis.reflection.SystemMetaObject;
 import org.apache.ibatis.session.ResultHandler;
 
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.sql.Statement;
-import java.util.Properties;
+import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
+import com.baomidou.mybatisplus.toolkit.PluginUtils;
+import com.baomidou.mybatisplus.toolkit.SqlUtils;
+import com.baomidou.mybatisplus.toolkit.StringUtils;
+import com.baomidou.mybatisplus.toolkit.SystemClock;
 
 /**
  * <p>
@@ -107,11 +111,14 @@ public class PerformanceInterceptor implements Interceptor {
                     }
                 } else {
                     Class<?> clazz = Class.forName(stmtClassName);
-                    oracleGetOriginalSqlMethod = clazz.getDeclaredMethod("getOriginalSql");
-                    if (oracleGetOriginalSqlMethod != null) {
-                        Object stmtSql = oracleGetOriginalSqlMethod.invoke(statement);
-                        if (stmtSql != null && stmtSql instanceof String) {
-                            originalSql = (String) stmtSql;
+                    oracleGetOriginalSqlMethod = getMethodRegular(clazz, "getOriginalSql");
+                    if(oracleGetOriginalSqlMethod!=null) {
+                        oracleGetOriginalSqlMethod.setAccessible(true);//OraclePreparedStatementWrapper is not a public class, need set this.
+                        if (oracleGetOriginalSqlMethod != null) {
+                            Object stmtSql = oracleGetOriginalSqlMethod.invoke(statement);
+                            if (stmtSql != null && stmtSql instanceof String) {
+                                originalSql = (String) stmtSql;
+                            }
                         }
                     }
                 }
@@ -200,4 +207,16 @@ public class PerformanceInterceptor implements Interceptor {
         this.writeInLog = writeInLog;
         return this;
     }
+
+    public Method getMethodRegular(Class<?> clazz, String methodName) {
+        if (Object.class.equals(clazz)) {
+            return null;
+        }
+        for (Method method : clazz.getDeclaredMethods()) {
+            if (method.getName().equals(methodName)) {
+                return method;
+            }
+        }
+        return getMethodRegular(clazz.getSuperclass(), methodName);
+    }
 }