Преглед изворни кода

修复动态代理引发的bug.

聂秋秋 пре 6 година
родитељ
комит
01f83fd810

+ 11 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/test/h2/config/MybatisPlusConfig.java

@@ -2,6 +2,9 @@ package com.baomidou.mybatisplus.test.h2.config;
 
 import javax.sql.DataSource;
 
+import com.baomidou.mybatisplus.plugins.pagination.optimize.JsqlParserCountOptimize;
+import com.baomidou.mybatisplus.plugins.parser.ISqlParser;
+import com.baomidou.mybatisplus.test.plugins.CustomInterceptor;
 import org.apache.ibatis.plugin.Interceptor;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.apache.ibatis.type.JdbcType;
@@ -19,6 +22,9 @@ import com.baomidou.mybatisplus.plugins.PerformanceInterceptor;
 import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean;
 import com.baomidou.mybatisplus.test.h2.H2MetaObjectHandler;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * <p>
  * Mybatis Plus Config
@@ -46,9 +52,14 @@ public class MybatisPlusConfig {
         PaginationInterceptor pagination = new PaginationInterceptor();
         pagination.setLocalPage(true);
         OptimisticLockerInterceptor optLock = new OptimisticLockerInterceptor();
+        List<ISqlParser> sqlParserList = new ArrayList<>();
+        sqlParserList.add(new JsqlParserCountOptimize());
+        CustomInterceptor customInterceptor = new CustomInterceptor();
+        customInterceptor.setSqlParserList(sqlParserList);
         sqlSessionFactory.setPlugins(new Interceptor[]{
             pagination,
             optLock,
+            customInterceptor,
             new PerformanceInterceptor()
         });
         globalConfiguration.setMetaObjectHandler(new H2MetaObjectHandler());

+ 51 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/test/plugins/CustomInterceptor.java

@@ -0,0 +1,51 @@
+package com.baomidou.mybatisplus.test.plugins;
+
+import com.baomidou.mybatisplus.plugins.SqlParserHandler;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.executor.statement.StatementHandler;
+import org.apache.ibatis.mapping.MappedStatement;
+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.SystemMetaObject;
+import org.apache.ibatis.session.Configuration;
+import org.apache.ibatis.session.RowBounds;
+
+import java.util.Properties;
+
+/**
+ * 自定义拦截器
+ * @author nieqiurong 2019/1/27.
+ */
+@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
+public class CustomInterceptor extends SqlParserHandler implements Interceptor {
+    
+    private Properties properties;
+    
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable {
+        Object[] args = invocation.getArgs();
+        MappedStatement ms = (MappedStatement) args[0];
+        Object parameter = args[1];
+        Configuration configuration = ms.getConfiguration();
+        Object target = invocation.getTarget();
+        StatementHandler handler = configuration.newStatementHandler((Executor) target, ms, parameter, RowBounds.DEFAULT, null, null);
+        this.sqlParser(SystemMetaObject.forObject(handler));
+        return invocation.proceed();
+    }
+    
+    @Override
+    public Object plugin(Object target) {
+        if (target instanceof Executor) {
+            return Plugin.wrap(target, this);
+        }
+        return target;
+    }
+    
+    @Override
+    public void setProperties(Properties properties) {
+        this.properties = properties;
+    }
+}

+ 5 - 0
mybatis-plus-support/src/main/java/com/baomidou/mybatisplus/plugins/SqlParserHandler.java

@@ -17,6 +17,7 @@ package com.baomidou.mybatisplus.plugins;
 
 import java.util.List;
 
+import org.apache.ibatis.executor.statement.StatementHandler;
 import org.apache.ibatis.reflection.MetaObject;
 
 import com.baomidou.mybatisplus.entity.SqlParserInfo;
@@ -25,6 +26,7 @@ import com.baomidou.mybatisplus.plugins.parser.ISqlParserFilter;
 import com.baomidou.mybatisplus.plugins.parser.SqlInfo;
 import com.baomidou.mybatisplus.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.toolkit.PluginUtils;
+import org.apache.ibatis.reflection.SystemMetaObject;
 
 /**
  * <p>
@@ -43,6 +45,9 @@ public abstract class SqlParserHandler {
      * 拦截 SQL 解析执行
      */
     protected void sqlParser(MetaObject metaObject) {
+        Object originalObject = metaObject.getOriginalObject();
+        StatementHandler statementHandler = (StatementHandler) PluginUtils.realTarget(originalObject);
+        metaObject = SystemMetaObject.forObject(statementHandler);
         if (null != metaObject) {
             if (null != this.sqlParserFilter && this.sqlParserFilter.doFilter(metaObject)) {
                 return;