浏览代码

MybatisPlusInterceptor#setProperties 实现

miemie 5 年之前
父节点
当前提交
cb5b12f8d2

+ 4 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/Maps.java

@@ -25,6 +25,10 @@ public final class Maps {
     private static final int MAX_POWER_OF_TWO = 1 << (Integer.SIZE - 2);
 
 
+    public static <K, V> HashMap<K, V> newHashMap() {
+        return new HashMap<>();
+    }
+
     public static <K, V> HashMap<K, V> newHashMapWithExpectedSize(int expectedSize) {
         return new HashMap<>(capacity(expectedSize));
     }

+ 18 - 5
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/MybatisPlusInterceptor.java

@@ -1,6 +1,9 @@
 package com.baomidou.mybatisplus.extension.plugins;
 
+import com.baomidou.mybatisplus.core.toolkit.ClassUtils;
 import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
+import com.baomidou.mybatisplus.extension.toolkit.PropertyMapper;
+import lombok.Setter;
 import org.apache.ibatis.cache.CacheKey;
 import org.apache.ibatis.executor.Executor;
 import org.apache.ibatis.executor.statement.StatementHandler;
@@ -12,9 +15,7 @@ import org.apache.ibatis.session.ResultHandler;
 import org.apache.ibatis.session.RowBounds;
 
 import java.sql.Connection;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 
 /**
  * @author miemie
@@ -31,6 +32,7 @@ import java.util.List;
 )
 public class MybatisPlusInterceptor implements Interceptor {
 
+    @Setter
     private List<InnerInterceptor> interceptors = new ArrayList<>();
 
     @Override
@@ -89,7 +91,18 @@ public class MybatisPlusInterceptor implements Interceptor {
         this.interceptors.add(innerInterceptor);
     }
 
-    public void setInnerInterceptors(List<InnerInterceptor> innerInterceptors) {
-        this.interceptors = innerInterceptors;
+    public List<InnerInterceptor> getInterceptors() {
+        return Collections.unmodifiableList(interceptors);
+    }
+
+    @Override
+    public void setProperties(Properties properties) {
+        PropertyMapper pm = PropertyMapper.newInstance(properties);
+        Map<String, Properties> group = pm.group();
+        group.forEach((k, v) -> {
+            InnerInterceptor innerInterceptor = ClassUtils.newInstance(k);
+            innerInterceptor.setProperties(v);
+            addInnerInterceptor(innerInterceptor);
+        });
     }
 }

+ 2 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/PaginationInterceptor.java

@@ -299,6 +299,8 @@ public class PaginationInterceptor extends AbstractSqlParserHandler implements I
             .whenNotBlack("overflow", Boolean::parseBoolean, this::setOverflow)
             .whenNotBlack("dialectType", this::setDialectType)
             .whenNotBlack("dialectClazz", this::setDialectClazz)
+            .whenNotBlack("dbType", DbType::getDbType, this::setDbType)
+            .whenNotBlack("dialect", ClassUtils::newInstance, this::setDialect)
             .whenNotBlack("limit", Long::parseLong, this::setLimit);
     }
 

+ 5 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/InnerInterceptor.java

@@ -24,6 +24,7 @@ import org.apache.ibatis.session.RowBounds;
 
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.Properties;
 
 /**
  * @author miemie
@@ -72,4 +73,8 @@ public interface InnerInterceptor {
     default void prepare(StatementHandler sh, Connection connection, Integer transactionTimeout) {
         // do nothing
     }
+
+    default void setProperties(Properties properties) {
+        // NOP
+    }
 }

+ 10 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/PaginationInnerInterceptor.java

@@ -23,6 +23,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.DialectFactory;
 import com.baomidou.mybatisplus.extension.plugins.pagination.DialectModel;
 import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.IDialect;
 import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
+import com.baomidou.mybatisplus.extension.toolkit.PropertyMapper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlParserUtils;
 import lombok.Data;
 import lombok.experimental.Accessors;
@@ -349,4 +350,13 @@ public class PaginationInnerInterceptor implements InnerInterceptor {
     protected void handlerOverflow(IPage<?> page) {
         page.setCurrent(1);
     }
+
+    @Override
+    public void setProperties(Properties properties) {
+        PropertyMapper.newInstance(properties)
+            .whenNotBlack("overflow", Boolean::parseBoolean, this::setOverflow)
+            .whenNotBlack("dbType", DbType::getDbType, this::setDbType)
+            .whenNotBlack("dialect", ClassUtils::newInstance, this::setDialect)
+            .whenNotBlack("limit", Long::parseLong, this::setLimit);
+    }
 }

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

@@ -21,7 +21,7 @@ import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport;
 import com.baomidou.mybatisplus.extension.plugins.tenant.TenantLineHandler;
-import lombok.RequiredArgsConstructor;
+import lombok.*;
 import net.sf.jsqlparser.expression.BinaryExpression;
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.Parenthesis;
@@ -50,11 +50,15 @@ import java.util.List;
  * @author hubin
  * @since 2020-06-20
  */
-@RequiredArgsConstructor
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
 @SuppressWarnings({"rawtypes"})
 public class TenantLineInnerInterceptor extends JsqlParserSupport implements InnerInterceptor {
 
-    private final TenantLineHandler tenantLineHandler;
+    private TenantLineHandler tenantLineHandler;
 
     @Override
     public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
@@ -315,3 +319,5 @@ public class TenantLineInnerInterceptor extends JsqlParserSupport implements Inn
         return new Column(column.toString());
     }
 }
+
+

+ 33 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/PropertyMapper.java

@@ -15,13 +15,20 @@
  */
 package com.baomidou.mybatisplus.extension.toolkit;
 
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Maps;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import lombok.AccessLevel;
 import lombok.RequiredArgsConstructor;
 
+import java.util.Collections;
+import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 import java.util.function.Consumer;
 import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * @author miemie
@@ -35,6 +42,10 @@ public class PropertyMapper {
         return new PropertyMapper(properties);
     }
 
+    public Set<String> keys() {
+        return delegate.stringPropertyNames();
+    }
+
     public PropertyMapper whenNotBlack(String key, Consumer<String> consumer) {
         String value = delegate.getProperty(key);
         if (StringUtils.isNotBlank(value)) {
@@ -50,4 +61,26 @@ public class PropertyMapper {
         }
         return this;
     }
+
+    /**
+     * mp 内部规则分组
+     *
+     * @return 分组
+     */
+    public Map<String, Properties> group() {
+        final Set<String> keys = keys();
+        Set<String> inner = keys.stream().filter(i -> i.startsWith("inner:")).collect(Collectors.toSet());
+        if (CollectionUtils.isEmpty(inner)) {
+            return Collections.emptyMap();
+        }
+        Map<String, Properties> map = Maps.newHashMap();
+        inner.forEach(i -> {
+            Properties p = new Properties();
+            String key = i.substring(6) + StringPool.COLON;
+            int keyIndex = key.length();
+            keys.stream().filter(j -> j.startsWith(key)).forEach(j -> p.setProperty(j.substring(keyIndex), delegate.getProperty(j)));
+            map.put(delegate.getProperty(i), p);
+        });
+        return map;
+    }
 }

+ 36 - 0
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/plugins/MybatisPlusInterceptorTest.java

@@ -0,0 +1,36 @@
+package com.baomidou.mybatisplus.extension.plugins;
+
+import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+import java.util.Properties;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * @author miemie
+ * @since 2020-06-30
+ */
+class MybatisPlusInterceptorTest {
+
+    @Test
+    void setProperties() {
+        Properties properties = new Properties();
+        properties.setProperty("inner:page", "com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor");
+        properties.setProperty("page:limit", "10");
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.setProperties(properties);
+        List<InnerInterceptor> interceptors = interceptor.getInterceptors();
+
+        assertThat(interceptors).isNotEmpty();
+        assertThat(interceptors.size()).isEqualTo(1);
+
+        InnerInterceptor page = interceptors.get(0);
+        assertThat(page).isInstanceOf(PaginationInnerInterceptor.class);
+
+        PaginationInnerInterceptor pii = (PaginationInnerInterceptor) page;
+        assertThat(pii.getLimit()).isEqualTo(10);
+    }
+}