فهرست منبع

fix(DynamicTableNameParser): issue:https://gitee.com/baomidou/mybatis-plus/issues/I1K7Q1

825944942@qq.com 5 سال پیش
والد
کامیت
b0670d9695
14فایلهای تغییر یافته به همراه134 افزوده شده و 48 حذف شده
  1. 29 2
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/parser/SqlInfo.java
  2. 21 22
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/parsers/DynamicTableNameParser.java
  3. 1 2
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/DB2TypeConvert.java
  4. 1 2
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/DmTypeConvert.java
  5. 1 2
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/KingbaseESTypeConvert.java
  6. 1 2
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/MySqlTypeConvert.java
  7. 1 2
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/OracleTypeConvert.java
  8. 1 2
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/PostgreSqlTypeConvert.java
  9. 1 2
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/SqlServerTypeConvert.java
  10. 1 2
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/SqliteTypeConvert.java
  11. 7 2
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/TypeConverts.java
  12. 11 0
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/select/Branch.java
  13. 20 0
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/select/BranchBuilder.java
  14. 38 6
      mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/select/Selector.java

+ 29 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/parser/SqlInfo.java

@@ -35,9 +35,36 @@ public class SqlInfo {
     /**
      * 是否排序
      */
-    private boolean orderBy = true;
+    private boolean orderBy;
 
+    /**
+     * 使用工厂快速构建 SQLInfo,默认支持排序
+     *
+     * @param sql SQL 语句
+     * @return 返回新的 SQL 信息
+     * @see #of(String, boolean)
+     */
+    public static SqlInfo of(String sql) {
+        return of(sql, true);
+    }
+
+    /**
+     * 使用工厂快速构建 SQLInfo
+     *
+     * @param sql  sql 语句
+     * @param sort 是否排序
+     * @return 返回新的 SQLInfo
+     */
+    public static SqlInfo of(String sql, boolean sort) {
+        SqlInfo info = new SqlInfo();
+        info.setSql(sql);
+        info.setOrderBy(sort);
+        return info;
+    }
+
+    @Deprecated
     public static SqlInfo newInstance() {
-        return new SqlInfo();
+        return new SqlInfo().setOrderBy(true);
     }
+
 }

+ 21 - 22
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/parsers/DynamicTableNameParser.java

@@ -15,19 +15,15 @@
  */
 package com.baomidou.mybatisplus.extension.parsers;
 
-import java.util.Collection;
-import java.util.Map;
-
-import org.apache.ibatis.reflection.MetaObject;
-
 import com.baomidou.mybatisplus.core.parser.ISqlParser;
 import com.baomidou.mybatisplus.core.parser.SqlInfo;
-import com.baomidou.mybatisplus.core.toolkit.Assert;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.TableNameParser;
-
 import lombok.Data;
 import lombok.experimental.Accessors;
+import org.apache.ibatis.reflection.MetaObject;
+
+import java.util.Collection;
+import java.util.Map;
 
 /**
  * 动态表名 SQL 解析器
@@ -38,28 +34,30 @@ import lombok.experimental.Accessors;
 @Data
 @Accessors(chain = true)
 public class DynamicTableNameParser implements ISqlParser {
-
     private Map<String, ITableNameHandler> tableNameHandlerMap;
 
+    /**
+     * 进行 SQL 表名名替换
+     *
+     * @param metaObject 元对象
+     * @param sql        SQL 语句
+     * @return 返回解析后的 SQL 信息
+     */
     @Override
     public SqlInfo parser(MetaObject metaObject, String sql) {
-        Assert.isFalse(CollectionUtils.isEmpty(tableNameHandlerMap), "tableNameHandlerMap is empty.");
+        // fix-issue:https://gitee.com/baomidou/mybatis-plus/issues/I1K7Q1
+        // Assert.isFalse(CollectionUtils.isEmpty(tableNameHandlerMap), "tableNameHandlerMap is empty.");
         if (allowProcess(metaObject)) {
             Collection<String> tables = new TableNameParser(sql).tables();
-            if (CollectionUtils.isNotEmpty(tables)) {
-                boolean sqlParsed = false;
-                String parsedSql = sql;
-                for (final String table : tables) {
-                    ITableNameHandler tableNameHandler = tableNameHandlerMap.get(table);
-                    if (null != tableNameHandler) {
-                        parsedSql = tableNameHandler.process(metaObject, parsedSql, table);
-                        sqlParsed = true;
-                    }
-                }
-                if (sqlParsed) {
-                    return SqlInfo.newInstance().setSql(parsedSql);
+
+            for (String table : tables) {
+                ITableNameHandler handler = tableNameHandlerMap.get(table);
+                if (null != handler) {
+                    sql = handler.process(metaObject, sql, table);
                 }
             }
+
+            return SqlInfo.of(sql);
         }
         return null;
     }
@@ -75,4 +73,5 @@ public class DynamicTableNameParser implements ISqlParser {
     public boolean allowProcess(MetaObject metaObject) {
         return true;
     }
+
 }

+ 1 - 2
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/DB2TypeConvert.java

@@ -26,8 +26,7 @@ import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.*;
 /**
  * DB2 字段类型转换
  *
- * @author zhanyao
- * @author hanchunlin
+ * @author zhanyao, hanchunlin
  * @since 2018-05-16
  */
 public class DB2TypeConvert implements ITypeConvert {

+ 1 - 2
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/DmTypeConvert.java

@@ -26,8 +26,7 @@ import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.*;
 /**
  * DM 字段类型转换
  *
- * @author halower
- * @author hanchunlin
+ * @author halower, hanchunlin
  * @since 2019-06-27
  */
 public class DmTypeConvert implements ITypeConvert {

+ 1 - 2
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/KingbaseESTypeConvert.java

@@ -28,8 +28,7 @@ import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.*;
 /**
  * KingbaseES 字段类型转换
  *
- * @author kingbase
- * @author hanchunlin
+ * @author kingbase, hanchunlin
  * @since 2019-10-12
  */
 public class KingbaseESTypeConvert implements ITypeConvert {

+ 1 - 2
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/MySqlTypeConvert.java

@@ -27,8 +27,7 @@ import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.*;
 /**
  * MYSQL 数据库字段类型转换
  *
- * @author hubin
- * @author hanchunlin
+ * @author hubin, hanchunlin
  * @since 2017-01-20
  */
 public class MySqlTypeConvert implements ITypeConvert {

+ 1 - 2
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/OracleTypeConvert.java

@@ -27,8 +27,7 @@ import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.*;
 /**
  * Oracle 数据库生成对应实体类时字段类型转换,跟据 Oracle 中的数据类型,返回对应的 Java 类型
  *
- * @author hubin
- * @author hanchunlin
+ * @author hubin, hanchunlin
  * @since 2017-01-20
  */
 public class OracleTypeConvert implements ITypeConvert {

+ 1 - 2
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/PostgreSqlTypeConvert.java

@@ -27,8 +27,7 @@ import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.*;
 /**
  * PostgreSQL 字段类型转换
  *
- * @author hubin
- * @author hanchunlin
+ * @author hubin, hanchunlin
  * @since 2017-01-20
  */
 public class PostgreSqlTypeConvert implements ITypeConvert {

+ 1 - 2
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/SqlServerTypeConvert.java

@@ -26,8 +26,7 @@ import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.*;
 /**
  * SQLServer 字段类型转换
  *
- * @author hubin
- * @author hanchunlin
+ * @author hubin, hanchunlin
  * @since 2017-01-20
  */
 public class SqlServerTypeConvert implements ITypeConvert {

+ 1 - 2
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/SqliteTypeConvert.java

@@ -28,8 +28,7 @@ import static com.baomidou.mybatisplus.generator.config.rules.DbColumnType.*;
 /**
  * SQLite 字段类型转换
  *
- * @author chen_wj
- * @author hanchunlin
+ * @author chen_wj, hanchunlin
  * @since 2019-05-08
  */
 public class SqliteTypeConvert implements ITypeConvert {

+ 7 - 2
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/TypeConverts.java

@@ -24,8 +24,7 @@ import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
 /**
  * 该注册器负责注册并查询类型注册器
  *
- * @author nieqiuqiu
- * @author hanchunlin
+ * @author nieqiuqiu, hanchunlin
  * @since 3.3.1
  */
 public class TypeConverts {
@@ -60,6 +59,12 @@ public class TypeConverts {
         return null;
     }
 
+    /**
+     * 使用指定参数构建一个选择器
+     *
+     * @param param 参数
+     * @return 返回选择器
+     */
     static Selector<String, IColumnType> use(String param) {
         return new Selector<>(param.toLowerCase());
     }

+ 11 - 0
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/select/Branch.java

@@ -22,8 +22,18 @@ public interface Branch<P, T> {
      */
     Function<P, T> factory();
 
+    /**
+     * 工厂方法,快速创建分支
+     *
+     * @param tester  测试器
+     * @param factory 值工厂
+     * @param <P>     参数类型
+     * @param <T>     值类型
+     * @return 返回一个新的分支
+     */
     static <P, T> Branch<P, T> of(Predicate<P> tester, Function<P, T> factory) {
         return new Branch<P, T>() {
+
             @Override
             public Predicate<P> tester() {
                 return tester;
@@ -33,6 +43,7 @@ public interface Branch<P, T> {
             public Function<P, T> factory() {
                 return factory;
             }
+
         };
     }
 }

+ 20 - 0
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/select/BranchBuilder.java

@@ -11,12 +11,32 @@ import java.util.function.Predicate;
  */
 public interface BranchBuilder<P, T> {
 
+    /**
+     * 使用一个值工厂构造出一个分支
+     *
+     * @param factory 值工厂
+     * @return 返回分支
+     */
     Branch<P, T> then(Function<P, T> factory);
 
+    /**
+     * 从值构建出一个分支
+     *
+     * @param value 值
+     * @return 返回一个分支
+     */
     default Branch<P, T> then(T value) {
         return then(p -> value);
     }
 
+    /**
+     * 工厂函数,用于创建分支构建者
+     *
+     * @param tester 测试器
+     * @param <P>    参数类型
+     * @param <T>    返回值类型
+     * @return 返回一个分支创建者
+     */
     static <P, T> BranchBuilder<P, T> of(Predicate<P> tester) {
         return factory -> Branch.of(tester, factory);
     }

+ 38 - 6
mybatis-plus-generator/src/main/java/com/baomidou/mybatisplus/generator/config/converts/select/Selector.java

@@ -5,15 +5,26 @@ import java.util.function.Supplier;
 
 /**
  * 分支结果选择器
+ * <p>
+ * 当前选择器会从给定的分支中选择第一个匹配的分支,并返回其结果
+ * <p>
+ * 一旦结果被选择,其他的分支将不再被调用
  *
  * @author hanchunlin
  * Created at 2020/6/11 16:55
  */
 public class Selector<P, T> {
-    private boolean success = false;
+    private boolean selected = false;
     private Function<P, T> factory;
+
+    /**
+     * 选择器参数,该参数会在进行条件判断和结果获取时会被当做条件传入
+     */
     private final P param;
 
+    /**
+     * @param param 参数
+     */
     public Selector(P param) {
         this.param = param;
     }
@@ -24,7 +35,7 @@ public class Selector<P, T> {
      * @param param 参数
      * @param <P>   参数类型
      * @param <T>   返回值类型
-     * @return 返回选择器自身
+     * @return 返回新的选择器
      */
     public static <P, T> Selector<P, T> param(P param) {
         return new Selector<>(param);
@@ -37,27 +48,48 @@ public class Selector<P, T> {
      * @return 选择器自身
      */
     public Selector<P, T> test(Branch<P, T> branch) {
-        if (!success) {
+        if (!selected) {
             boolean pass = branch.tester().test(param);
             if (pass) {
-                success = true;
+                selected = true;
                 factory = branch.factory();
             }
         }
         return this;
     }
 
+    /**
+     * 获取结果,如果当前选择器没有击中任何条件分支,则从给定的提供者中获取结果;
+     * 否则将使用当前选择器选中的分支
+     *
+     * @param supplier 默认值提供者
+     * @return 如果有分支被击中,则返回分支值,否则返回参数提供的值
+     */
     public T or(Supplier<T> supplier) {
-        return success ? this.factory.apply(param) : supplier.get();
+        return selected ? this.factory.apply(param) : supplier.get();
     }
 
+    /**
+     * @param t 给定默认值
+     * @return 如果有分支被击中,则返回分支值,否则返回参数
+     * @see #or(Supplier)
+     */
     public T or(T t) {
         return or(() -> t);
     }
 
+    /**
+     * 当前选择器是否已经选择分支
+     *
+     * @return 如果已经存在分支被击中,则返回 true;否则返回 false
+     */
+    public boolean isSelected() {
+        return selected;
+    }
+
     @Override
     public String toString() {
-        return String.format("Selector{success=%s}", success);
+        return String.format("Selector{success=%s}", selected);
     }
 
 }