Browse Source

[优化] 日常优化

miemie 6 years ago
parent
commit
afbbdb837c

+ 29 - 6
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/AbstractISegmentList.java

@@ -16,6 +16,7 @@
 package com.baomidou.mybatisplus.core.conditions.segments;
 
 import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -28,22 +29,31 @@ import java.util.List;
  * @since 2018-06-27
  */
 @SuppressWarnings("serial")
-public abstract class AbstractISegmentList extends ArrayList<ISqlSegment> implements ISqlSegment {
+public abstract class AbstractISegmentList extends ArrayList<ISqlSegment> implements ISqlSegment, StringPool {
 
     /**
      * 最后一个值
      */
-    protected ISqlSegment lastValue = null;
+    ISqlSegment lastValue = null;
     /**
      * 刷新 lastValue
      */
-    protected boolean flushLastValue = false;
+    boolean flushLastValue = false;
+    /**
+     * 结果集缓存
+     */
+    private String sqlSegment = EMPTY;
+    /**
+     * 是否缓存过结果集
+     */
+    private boolean cacheSqlSegment = true;
 
     @Override
     public boolean addAll(Collection<? extends ISqlSegment> c) {
         List<ISqlSegment> list = new ArrayList<>(c);
         boolean goon = transformList(list, list.get(0));
         if (goon) {
+            cacheSqlSegment = false;
             if (flushLastValue) {
                 this.flushLastValue(list);
             }
@@ -64,15 +74,28 @@ public abstract class AbstractISegmentList extends ArrayList<ISqlSegment> implem
     /**
      * 刷新属性 lastValue
      */
-    protected void flushLastValue(List<? extends ISqlSegment> list) {
+    private void flushLastValue(List<? extends ISqlSegment> list) {
         lastValue = list.get(list.size() - 1);
     }
 
     /**
-     * 删除元素里最后一个值
+     * 删除元素里最后一个值</br>
+     * 并刷新属性 lastValue
      */
-    protected void removeAndFlushLast() {
+    void removeAndFlushLast() {
         remove(size() - 1);
         flushLastValue(this);
     }
+
+    @Override
+    public String getSqlSegment() {
+        if (cacheSqlSegment) {
+            return sqlSegment;
+        }
+        cacheSqlSegment = true;
+        sqlSegment = childrenSqlSegment();
+        return sqlSegment;
+    }
+
+    protected abstract String childrenSqlSegment();
 }

+ 6 - 8
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/GroupBySegmentList.java

@@ -15,13 +15,12 @@
  */
 package com.baomidou.mybatisplus.core.conditions.segments;
 
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.GROUP_BY;
-import static java.util.stream.Collectors.joining;
+import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
 
 import java.util.List;
 
-import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.GROUP_BY;
+import static java.util.stream.Collectors.joining;
 
 /**
  * Group By SQL 片段
@@ -39,11 +38,10 @@ public class GroupBySegmentList extends AbstractISegmentList {
     }
 
     @Override
-    public String getSqlSegment() {
+    protected String childrenSqlSegment() {
         if (isEmpty()) {
-            return StringPool.EMPTY;
+            return EMPTY;
         }
-        return this.stream().map(ISqlSegment::getSqlSegment).collect(joining(StringPool.COMMA,
-            StringPool.SPACE + GROUP_BY.getSqlSegment() + StringPool.SPACE, StringPool.EMPTY));
+        return this.stream().map(ISqlSegment::getSqlSegment).collect(joining(COMMA, SPACE + GROUP_BY.getSqlSegment() + SPACE, EMPTY));
     }
 }

+ 8 - 10
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/HavingSegmentList.java

@@ -15,14 +15,13 @@
  */
 package com.baomidou.mybatisplus.core.conditions.segments;
 
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.AND;
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.HAVING;
-import static java.util.stream.Collectors.joining;
+import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
+import com.baomidou.mybatisplus.core.enums.SqlKeyword;
 
 import java.util.List;
 
-import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.HAVING;
+import static java.util.stream.Collectors.joining;
 
 /**
  * Having SQL 片段
@@ -36,18 +35,17 @@ public class HavingSegmentList extends AbstractISegmentList {
     @Override
     protected boolean transformList(List<ISqlSegment> list, ISqlSegment firstSegment) {
         if (!isEmpty()) {
-            this.add(AND);
+            this.add(SqlKeyword.AND);
         }
         list.remove(0);
         return true;
     }
 
     @Override
-    public String getSqlSegment() {
+    protected String childrenSqlSegment() {
         if (isEmpty()) {
-            return StringPool.EMPTY;
+            return EMPTY;
         }
-        return this.stream().map(ISqlSegment::getSqlSegment).collect(joining(StringPool.SPACE,
-            StringPool.SPACE + HAVING.getSqlSegment() + StringPool.SPACE, StringPool.EMPTY));
+        return this.stream().map(ISqlSegment::getSqlSegment).collect(joining(SPACE, SPACE + HAVING.getSqlSegment() + SPACE, EMPTY));
     }
 }

+ 2 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/MatchSegment.java

@@ -15,12 +15,12 @@
  */
 package com.baomidou.mybatisplus.core.conditions.segments;
 
-import java.util.function.Predicate;
-
 import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
 import com.baomidou.mybatisplus.core.enums.SqlKeyword;
 import com.baomidou.mybatisplus.core.enums.WrapperKeyword;
 
+import java.util.function.Predicate;
+
 /**
  * 匹配片段
  *

+ 7 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/MergeSegments.java

@@ -17,6 +17,7 @@ package com.baomidou.mybatisplus.core.conditions.segments;
 
 import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import lombok.AccessLevel;
 import lombok.Getter;
 
 import java.util.Arrays;
@@ -37,17 +38,19 @@ public class MergeSegments implements ISqlSegment {
     private final HavingSegmentList having = new HavingSegmentList();
     private final OrderBySegmentList orderBy = new OrderBySegmentList();
 
+    @Getter(AccessLevel.NONE)
     private String sqlSegment = StringPool.EMPTY;
+    @Getter(AccessLevel.NONE)
     private boolean cacheSqlSegment = true;
 
     public void add(ISqlSegment... iSqlSegments) {
         List<ISqlSegment> list = Arrays.asList(iSqlSegments);
-        ISqlSegment sqlSegment = list.get(0);
-        if (MatchSegment.ORDER_BY.match(sqlSegment)) {
+        ISqlSegment firstSqlSegment = list.get(0);
+        if (MatchSegment.ORDER_BY.match(firstSqlSegment)) {
             orderBy.addAll(list);
-        } else if (MatchSegment.GROUP_BY.match(sqlSegment)) {
+        } else if (MatchSegment.GROUP_BY.match(firstSqlSegment)) {
             groupBy.addAll(list);
-        } else if (MatchSegment.HAVING.match(sqlSegment)) {
+        } else if (MatchSegment.HAVING.match(firstSqlSegment)) {
             having.addAll(list);
         } else {
             normal.addAll(list);

+ 5 - 6
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/NormalSegmentList.java

@@ -15,12 +15,11 @@
  */
 package com.baomidou.mybatisplus.core.conditions.segments;
 
-import java.util.List;
-import java.util.stream.Collectors;
-
 import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
 import com.baomidou.mybatisplus.core.enums.SqlKeyword;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
+
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 普通片段
@@ -83,10 +82,10 @@ public class NormalSegmentList extends AbstractISegmentList {
     }
 
     @Override
-    public String getSqlSegment() {
+    protected String childrenSqlSegment() {
         if (MatchSegment.AND_OR.match(lastValue)) {
             removeAndFlushLast();
         }
-        return this.stream().map(ISqlSegment::getSqlSegment).collect(Collectors.joining(StringPool.SPACE));
+        return this.stream().map(ISqlSegment::getSqlSegment).collect(Collectors.joining(SPACE));
     }
 }

+ 7 - 9
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/OrderBySegmentList.java

@@ -15,13 +15,12 @@
  */
 package com.baomidou.mybatisplus.core.conditions.segments;
 
-import static com.baomidou.mybatisplus.core.enums.SqlKeyword.ORDER_BY;
-import static java.util.stream.Collectors.joining;
+import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
 
 import java.util.List;
 
-import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.ORDER_BY;
+import static java.util.stream.Collectors.joining;
 
 /**
  * Order By SQL 片段
@@ -36,17 +35,16 @@ public class OrderBySegmentList extends AbstractISegmentList {
     protected boolean transformList(List<ISqlSegment> list, ISqlSegment firstSegment) {
         list.remove(0);
         if (!isEmpty()) {
-            super.add(() -> StringPool.COMMA);
+            super.add(() -> COMMA);
         }
         return true;
     }
 
     @Override
-    public String getSqlSegment() {
+    protected String childrenSqlSegment() {
         if (isEmpty()) {
-            return StringPool.EMPTY;
+            return EMPTY;
         }
-        return this.stream().map(ISqlSegment::getSqlSegment).collect(joining(StringPool.SPACE,
-            StringPool.SPACE + ORDER_BY.getSqlSegment() + StringPool.SPACE, StringPool.EMPTY));
+        return this.stream().map(ISqlSegment::getSqlSegment).collect(joining(SPACE, SPACE + ORDER_BY.getSqlSegment() + SPACE, EMPTY));
     }
 }

+ 14 - 8
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/test/WrapperTest.java

@@ -15,12 +15,6 @@
  */
 package com.baomidou.mybatisplus.core.test;
 
-import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -29,6 +23,12 @@ import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper;
 import org.junit.jupiter.api.Test;
 
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 class WrapperTest {
 
     private void log(String message) {
@@ -55,7 +55,6 @@ class WrapperTest {
         } catch (Exception e) {
             log(e.getMessage());
         }
-
     }
 
     @Test
@@ -65,6 +64,13 @@ class WrapperTest {
             .and(i -> i.eq("andx", 65444).le("ande", 66666))
             .ne("xxx", 222);
         log(ew.getSqlSegment());
+        log(ew.getSqlSegment());
+        ew.gt("x22", 333);
+        log(ew.getSqlSegment());
+        log(ew.getSqlSegment());
+        ew.orderByAsc("orderBy");
+        log(ew.getSqlSegment());
+        log(ew.getSqlSegment());
         ew.getParamNameValuePairs().forEach((k, v) -> System.out.println("key = " + k + " ; value = " + v));
     }
 
@@ -82,7 +88,7 @@ class WrapperTest {
     @Test
     void test3() {
         UpdateWrapper<User> ew = new UpdateWrapper<User>()
-            .setSql("abc=1,def=2").eq("id", 1).ge("age", 3);
+            .setSql("abc=1,def=2").set("sets", 1111).eq("id", 1).ge("age", 3);
         log(ew.getSqlSet());
         log(ew.getSqlSegment());
     }

+ 0 - 8
mybatis-plus/src/test/resources/mysql/test_data.sql → mybatis-plus/src/test/resources/mysql/test_data.ddl.sql

@@ -46,11 +46,3 @@ CREATE TABLE result_map_entity (
     map        varchar(200)
 )ENGINE = innodb
 DEFAULT CHARSET = utf8;
-
-INSERT INTO `common_data` (`id`, `test_int`, `test_str`) VALUES
-  (1, 25, 'test'),
-  (2, 25, 'test');
-
-INSERT INTO `common_logic_data` (`id`, `test_int`, `test_str`) VALUES
-  (1, 25, 'test'),
-  (2, 25, 'test');