Sfoglia il codice sorgente

分页,SQL解析器跳过存储过程.

聂秋秋 6 anni fa
parent
commit
43216ec612

+ 29 - 21
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/handlers/AbstractSqlParserHandler.java

@@ -17,6 +17,7 @@ package com.baomidou.mybatisplus.extension.handlers;
 
 import java.util.List;
 
+import org.apache.ibatis.executor.statement.CallableStatementHandler;
 import org.apache.ibatis.executor.statement.StatementHandler;
 import org.apache.ibatis.reflection.MetaObject;
 import org.apache.ibatis.reflection.SystemMetaObject;
@@ -48,33 +49,40 @@ public abstract class AbstractSqlParserHandler {
      * 拦截 SQL 解析执行
      */
     protected void sqlParser(MetaObject metaObject) {
-        Object originalObject = metaObject.getOriginalObject();
-        StatementHandler statementHandler = PluginUtils.realTarget(originalObject);
-        metaObject = SystemMetaObject.forObject(statementHandler);
         if (null != metaObject) {
-            if (null != this.sqlParserFilter && this.sqlParserFilter.doFilter(metaObject)) {
-                return;
+            Object originalObject = metaObject.getOriginalObject();
+            StatementHandler statementHandler = PluginUtils.realTarget(originalObject);
+            metaObject = SystemMetaObject.forObject(statementHandler);
+            // 好像不用判断也行,为了保险起见,还是加上吧.
+            boolean hasProperty = metaObject.hasGetter("delegate");
+            if (hasProperty) {
+                statementHandler = (StatementHandler) metaObject.getValue("delegate");
             }
-            // SQL 解析
-            if (CollectionUtils.isNotEmpty(this.sqlParserList)) {
-                // @SqlParser(filter = true) 跳过该方法解析
-                if (SqlParserHelper.getSqlParserInfo(metaObject)) {
+            if (!CallableStatementHandler.class.equals(statementHandler.getClass())) {
+                if (null != this.sqlParserFilter && this.sqlParserFilter.doFilter(metaObject)) {
                     return;
                 }
-                // 标记是否修改过 SQL
-                int flag = 0;
-                String originalSql = (String) metaObject.getValue(PluginUtils.DELEGATE_BOUNDSQL_SQL);
-                for (ISqlParser sqlParser : this.sqlParserList) {
-                    if (sqlParser.doFilter(metaObject, originalSql)) {
-                        SqlInfo sqlInfo = sqlParser.parser(metaObject, originalSql);
-                        if (null != sqlInfo) {
-                            originalSql = sqlInfo.getSql();
-                            ++flag;
+                // SQL 解析
+                if (CollectionUtils.isNotEmpty(this.sqlParserList)) {
+                    // @SqlParser(filter = true) 跳过该方法解析
+                    if (SqlParserHelper.getSqlParserInfo(metaObject)) {
+                        return;
+                    }
+                    // 标记是否修改过 SQL
+                    int flag = 0;
+                    String originalSql = (String) metaObject.getValue(PluginUtils.DELEGATE_BOUNDSQL_SQL);
+                    for (ISqlParser sqlParser : this.sqlParserList) {
+                        if (sqlParser.doFilter(metaObject, originalSql)) {
+                            SqlInfo sqlInfo = sqlParser.parser(metaObject, originalSql);
+                            if (null != sqlInfo) {
+                                originalSql = sqlInfo.getSql();
+                                ++flag;
+                            }
                         }
                     }
-                }
-                if (flag >= 1) {
-                    metaObject.setValue(PluginUtils.DELEGATE_BOUNDSQL_SQL, originalSql);
+                    if (flag >= 1) {
+                        metaObject.setValue(PluginUtils.DELEGATE_BOUNDSQL_SQL, originalSql);
+                    }
                 }
             }
         }

+ 5 - 3
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/PaginationInterceptor.java

@@ -31,6 +31,7 @@ import org.apache.ibatis.mapping.BoundSql;
 import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.ParameterMapping;
 import org.apache.ibatis.mapping.SqlCommandType;
+import org.apache.ibatis.mapping.StatementType;
 import org.apache.ibatis.plugin.Interceptor;
 import org.apache.ibatis.plugin.Intercepts;
 import org.apache.ibatis.plugin.Invocation;
@@ -143,10 +144,11 @@ public class PaginationInterceptor extends AbstractSqlParserHandler implements I
 
         // SQL 解析
         this.sqlParser(metaObject);
-
-        // 先判断是不是SELECT操作
+    
+        // 先判断是不是SELECT操作  (2019-04-10 00:37:31 跳过存储过程)
         MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
-        if (!SqlCommandType.SELECT.equals(mappedStatement.getSqlCommandType())) {
+        if (SqlCommandType.SELECT != mappedStatement.getSqlCommandType()
+            || StatementType.CALLABLE == mappedStatement.getStatementType()) {
             return invocation.proceed();
         }