Browse Source

提交一大波修改

miemie 6 years ago
parent
commit
2a12b0053e
18 changed files with 383 additions and 199 deletions
  1. 42 42
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractWrapper.java
  2. 31 31
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/interfaces/Compare.java
  3. 34 34
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/interfaces/Func.java
  4. 11 11
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/interfaces/Join.java
  5. 7 7
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/interfaces/Nested.java
  6. 4 4
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/query/Query.java
  7. 5 2
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/LambdaUpdateWrapper.java
  8. 11 4
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/Update.java
  9. 5 2
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/UpdateWrapper.java
  10. 5 2
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/kotlin/KtUpdateWrapper.kt
  11. 1 1
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/IService.java
  12. 44 37
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/AbstractChainWrapper.java
  13. 71 0
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/query/impl/LambdaQueryChainWrapper.java
  14. 13 21
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/query/impl/QueryChainWrapper.java
  15. 10 0
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/update/Updates.java
  16. 44 0
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/update/impl/LambdaUpdateChainWrapper.java
  17. 43 0
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/update/impl/UpdateChainWrapper.java
  18. 2 1
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/H2UserTest.java

+ 42 - 42
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractWrapper.java

@@ -42,8 +42,8 @@ import static java.util.stream.Collectors.joining;
  * @since 2017-05-26
  */
 @SuppressWarnings({"serial", "unchecked"})
-public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, This>> extends Wrapper<T>
-    implements Compare<This, R>, Nested<This>, Join<This>, Func<This, R> {
+public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T, R, Children>> extends Wrapper<T>
+    implements Compare<Children, R>, Nested<Children, Children>, Join<Children>, Func<Children, R> {
 
     /**
      * 前缀
@@ -55,7 +55,7 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
      */
     private static final String PLACE_HOLDER = "{%s}";
     private static final String MYBATIS_PLUS_TOKEN = "#{%s.paramNameValuePairs.%s}";
-    protected final This typedThis = (This) this;
+    protected final Children typedThis = (Children) this;
     protected final String paramAlias = null;
     /**
      * 必要度量
@@ -78,7 +78,7 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
         return entity;
     }
 
-    public This setEntity(T entity) {
+    public Children setEntity(T entity) {
         this.entity = entity;
         this.initEntityClass();
         return typedThis;
@@ -96,7 +96,7 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
     }
 
     @Override
-    public <V> This allEq(boolean condition, Map<R, V> params, boolean null2IsNull) {
+    public <V> Children allEq(boolean condition, Map<R, V> params, boolean null2IsNull) {
         if (condition && CollectionUtils.isNotEmpty(params)) {
             params.forEach((k, v) -> {
                 if (StringUtils.checkValNotNull(v)) {
@@ -112,7 +112,7 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
     }
 
     @Override
-    public <V> This allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull) {
+    public <V> Children allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull) {
         if (condition && CollectionUtils.isNotEmpty(params)) {
             params.forEach((k, v) -> {
                 if (filter.test(k, v)) {
@@ -130,93 +130,93 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
     }
 
     @Override
-    public This eq(boolean condition, R column, Object val) {
+    public Children eq(boolean condition, R column, Object val) {
         return addCondition(condition, column, EQ, val);
     }
 
     @Override
-    public This ne(boolean condition, R column, Object val) {
+    public Children ne(boolean condition, R column, Object val) {
         return addCondition(condition, column, NE, val);
     }
 
     @Override
-    public This gt(boolean condition, R column, Object val) {
+    public Children gt(boolean condition, R column, Object val) {
         return addCondition(condition, column, GT, val);
     }
 
     @Override
-    public This ge(boolean condition, R column, Object val) {
+    public Children ge(boolean condition, R column, Object val) {
         return addCondition(condition, column, GE, val);
     }
 
     @Override
-    public This lt(boolean condition, R column, Object val) {
+    public Children lt(boolean condition, R column, Object val) {
         return addCondition(condition, column, LT, val);
     }
 
     @Override
-    public This le(boolean condition, R column, Object val) {
+    public Children le(boolean condition, R column, Object val) {
         return addCondition(condition, column, LE, val);
     }
 
     @Override
-    public This like(boolean condition, R column, Object val) {
+    public Children like(boolean condition, R column, Object val) {
         return doIt(condition, () -> columnToString(column), LIKE, () -> formatSql("{0}", StringPool.PERCENT + val + StringPool.PERCENT));
     }
 
     @Override
-    public This notLike(boolean condition, R column, Object val) {
+    public Children notLike(boolean condition, R column, Object val) {
         return not(condition).like(condition, column, val);
     }
 
     @Override
-    public This likeLeft(boolean condition, R column, Object val) {
+    public Children likeLeft(boolean condition, R column, Object val) {
         return doIt(condition, () -> columnToString(column), LIKE, () -> formatSql("{0}", StringPool.PERCENT + val));
     }
 
     @Override
-    public This likeRight(boolean condition, R column, Object val) {
+    public Children likeRight(boolean condition, R column, Object val) {
         return doIt(condition, () -> columnToString(column), LIKE, () -> formatSql("{0}", val + StringPool.PERCENT));
     }
 
     @Override
-    public This between(boolean condition, R column, Object val1, Object val2) {
+    public Children between(boolean condition, R column, Object val1, Object val2) {
         return doIt(condition, () -> columnToString(column), BETWEEN, () -> formatSql("{0}", val1), AND,
             () -> formatSql("{0}", val2));
     }
 
     @Override
-    public This notBetween(boolean condition, R column, Object val1, Object val2) {
+    public Children notBetween(boolean condition, R column, Object val1, Object val2) {
         return not(condition).between(condition, column, val1, val2);
     }
 
     @Override
-    public This and(boolean condition, Function<This, This> func) {
+    public Children and(boolean condition, Function<Children, Children> func) {
         return and(condition).addNestedCondition(condition, func);
     }
 
     @Override
-    public This or(boolean condition, Function<This, This> func) {
+    public Children or(boolean condition, Function<Children, Children> func) {
         return or(condition).addNestedCondition(condition, func);
     }
 
     @Override
-    public This nested(boolean condition, Function<This, This> func) {
+    public Children nested(boolean condition, Function<Children, Children> func) {
         return addNestedCondition(condition, func);
     }
 
     @Override
-    public This or(boolean condition) {
+    public Children or(boolean condition) {
         return doIt(condition, OR);
     }
 
     @Override
-    public This apply(boolean condition, String applySql, Object... value) {
+    public Children apply(boolean condition, String applySql, Object... value) {
         return doIt(condition, APPLY, () -> formatSql(applySql, value));
     }
 
     @Override
-    public This last(boolean condition, String lastSql) {
+    public Children last(boolean condition, String lastSql) {
         if (condition) {
             this.lastSql = StringPool.SPACE + lastSql;
         }
@@ -224,27 +224,27 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
     }
 
     @Override
-    public This exists(boolean condition, String existsSql) {
+    public Children exists(boolean condition, String existsSql) {
         return doIt(condition, EXISTS, () -> String.format("(%s)", existsSql));
     }
 
     @Override
-    public This notExists(boolean condition, String notExistsSql) {
+    public Children notExists(boolean condition, String notExistsSql) {
         return not(condition).exists(condition, notExistsSql);
     }
 
     @Override
-    public This isNull(boolean condition, R column) {
+    public Children isNull(boolean condition, R column) {
         return doIt(condition, () -> columnToString(column), IS_NULL);
     }
 
     @Override
-    public This isNotNull(boolean condition, R column) {
+    public Children isNotNull(boolean condition, R column) {
         return doIt(condition, () -> columnToString(column), IS_NOT_NULL);
     }
 
     @Override
-    public This in(boolean condition, R column, Collection<?> coll) {
+    public Children in(boolean condition, R column, Collection<?> coll) {
         if (CollectionUtils.isEmpty(coll)) {
             return typedThis;
         }
@@ -252,7 +252,7 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
     }
 
     @Override
-    public This notIn(boolean condition, R column, Collection<?> coll) {
+    public Children notIn(boolean condition, R column, Collection<?> coll) {
         if (CollectionUtils.isEmpty(coll)) {
             return typedThis;
         }
@@ -260,17 +260,17 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
     }
 
     @Override
-    public This inSql(boolean condition, R column, String inValue) {
+    public Children inSql(boolean condition, R column, String inValue) {
         return doIt(condition, () -> columnToString(column), IN, () -> String.format("(%s)", inValue));
     }
 
     @Override
-    public This notInSql(boolean condition, R column, String inValue) {
+    public Children notInSql(boolean condition, R column, String inValue) {
         return not(condition).inSql(condition, column, inValue);
     }
 
     @Override
-    public This groupBy(boolean condition, R... columns) {
+    public Children groupBy(boolean condition, R... columns) {
         if (ArrayUtils.isEmpty(columns)) {
             return typedThis;
         }
@@ -278,7 +278,7 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
     }
 
     @Override
-    public This orderBy(boolean condition, boolean isAsc, R... columns) {
+    public Children orderBy(boolean condition, boolean isAsc, R... columns) {
         if (ArrayUtils.isEmpty(columns)) {
             return typedThis;
         }
@@ -290,7 +290,7 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
     }
 
     @Override
-    public This having(boolean condition, String sqlHaving, Object... params) {
+    public Children having(boolean condition, String sqlHaving, Object... params) {
         return doIt(condition, HAVING, () -> formatSqlIfNeed(condition, sqlHaving, params));
     }
 
@@ -299,7 +299,7 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
      * <p>
      * NOT 关键词
      */
-    protected This not(boolean condition) {
+    protected Children not(boolean condition) {
         return doIt(condition, NOT);
     }
 
@@ -308,7 +308,7 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
      * <p>
      * 拼接 AND
      */
-    protected This and(boolean condition) {
+    protected Children and(boolean condition) {
         return doIt(condition, AND);
     }
 
@@ -320,7 +320,7 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
      * @param sqlKeyword SQL 关键词
      * @param val        条件值
      */
-    protected This addCondition(boolean condition, R column, SqlKeyword sqlKeyword, Object val) {
+    protected Children addCondition(boolean condition, R column, SqlKeyword sqlKeyword, Object val) {
         return doIt(condition, () -> columnToString(column), sqlKeyword, () -> formatSql("{0}", val));
     }
 
@@ -329,14 +329,14 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
      *
      * @param condition 查询条件值
      */
-    protected This addNestedCondition(boolean condition, Function<This, This> func) {
+    protected Children addNestedCondition(boolean condition, Function<Children, Children> func) {
         return doIt(condition, LEFT_BRACKET, func.apply(instance()), RIGHT_BRACKET);
     }
 
     /**
      * 子类返回一个自己的新对象
      */
-    protected abstract This instance();
+    protected abstract Children instance();
 
     /**
      * 格式化SQL
@@ -408,7 +408,7 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
      * @param sqlSegments sql片段数组
      * @return children
      */
-    protected This doIt(boolean condition, ISqlSegment... sqlSegments) {
+    protected Children doIt(boolean condition, ISqlSegment... sqlSegments) {
         if (condition) {
             expression.add(sqlSegments);
         }
@@ -490,7 +490,7 @@ public abstract class AbstractWrapper<T, R, This extends AbstractWrapper<T, R, T
 
     @Override
     @SuppressWarnings("all")
-    public This clone() {
+    public Children clone() {
         return SerializationUtils.clone(typedThis);
     }
 }

+ 31 - 31
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/interfaces/Compare.java

@@ -28,19 +28,19 @@ import java.util.function.BiPredicate;
  * @author hubin miemie HCL
  * @since 2017-05-26
  */
-public interface Compare<This, R> extends Serializable {
+public interface Compare<Children, R> extends Serializable {
 
     /**
      * ignore
      */
-    default <V> This allEq(Map<R, V> params) {
+    default <V> Children allEq(Map<R, V> params) {
         return allEq(params, true);
     }
 
     /**
      * ignore
      */
-    default <V> This allEq(Map<R, V> params, boolean null2IsNull) {
+    default <V> Children allEq(Map<R, V> params, boolean null2IsNull) {
         return allEq(true, params, null2IsNull);
     }
 
@@ -52,19 +52,19 @@ public interface Compare<This, R> extends Serializable {
      * @param null2IsNull 是否参数为 null 自动执行 isNull 方法, false 则忽略这个字段\
      * @return children
      */
-    <V> This allEq(boolean condition, Map<R, V> params, boolean null2IsNull);
+    <V> Children allEq(boolean condition, Map<R, V> params, boolean null2IsNull);
 
     /**
      * ignore
      */
-    default <V> This allEq(BiPredicate<R, V> filter, Map<R, V> params) {
+    default <V> Children allEq(BiPredicate<R, V> filter, Map<R, V> params) {
         return allEq(filter, params, true);
     }
 
     /**
      * ignore
      */
-    default <V> This allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull) {
+    default <V> Children allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull) {
         return allEq(true, filter, params, null2IsNull);
     }
 
@@ -77,12 +77,12 @@ public interface Compare<This, R> extends Serializable {
      * @param null2IsNull 是否参数为 null 自动执行 isNull 方法, false 则忽略这个字段
      * @return children
      */
-    <V> This allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull);
+    <V> Children allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull);
 
     /**
      * ignore
      */
-    default This eq(R column, Object val) {
+    default Children eq(R column, Object val) {
         return eq(true, column, val);
     }
 
@@ -94,12 +94,12 @@ public interface Compare<This, R> extends Serializable {
      * @param val       值
      * @return children
      */
-    This eq(boolean condition, R column, Object val);
+    Children eq(boolean condition, R column, Object val);
 
     /**
      * ignore
      */
-    default This ne(R column, Object val) {
+    default Children ne(R column, Object val) {
         return ne(true, column, val);
     }
 
@@ -111,12 +111,12 @@ public interface Compare<This, R> extends Serializable {
      * @param val       值
      * @return children
      */
-    This ne(boolean condition, R column, Object val);
+    Children ne(boolean condition, R column, Object val);
 
     /**
      * ignore
      */
-    default This gt(R column, Object val) {
+    default Children gt(R column, Object val) {
         return gt(true, column, val);
     }
 
@@ -128,12 +128,12 @@ public interface Compare<This, R> extends Serializable {
      * @param val       值
      * @return children
      */
-    This gt(boolean condition, R column, Object val);
+    Children gt(boolean condition, R column, Object val);
 
     /**
      * ignore
      */
-    default This ge(R column, Object val) {
+    default Children ge(R column, Object val) {
         return ge(true, column, val);
     }
 
@@ -145,12 +145,12 @@ public interface Compare<This, R> extends Serializable {
      * @param val       值
      * @return children
      */
-    This ge(boolean condition, R column, Object val);
+    Children ge(boolean condition, R column, Object val);
 
     /**
      * ignore
      */
-    default This lt(R column, Object val) {
+    default Children lt(R column, Object val) {
         return lt(true, column, val);
     }
 
@@ -162,12 +162,12 @@ public interface Compare<This, R> extends Serializable {
      * @param val       值
      * @return children
      */
-    This lt(boolean condition, R column, Object val);
+    Children lt(boolean condition, R column, Object val);
 
     /**
      * ignore
      */
-    default This le(R column, Object val) {
+    default Children le(R column, Object val) {
         return le(true, column, val);
     }
 
@@ -179,12 +179,12 @@ public interface Compare<This, R> extends Serializable {
      * @param val       值
      * @return children
      */
-    This le(boolean condition, R column, Object val);
+    Children le(boolean condition, R column, Object val);
 
     /**
      * ignore
      */
-    default This between(R column, Object val1, Object val2) {
+    default Children between(R column, Object val1, Object val2) {
         return between(true, column, val1, val2);
     }
 
@@ -197,12 +197,12 @@ public interface Compare<This, R> extends Serializable {
      * @param val2      值2
      * @return children
      */
-    This between(boolean condition, R column, Object val1, Object val2);
+    Children between(boolean condition, R column, Object val1, Object val2);
 
     /**
      * ignore
      */
-    default This notBetween(R column, Object val1, Object val2) {
+    default Children notBetween(R column, Object val1, Object val2) {
         return notBetween(true, column, val1, val2);
     }
 
@@ -215,12 +215,12 @@ public interface Compare<This, R> extends Serializable {
      * @param val2      值2
      * @return children
      */
-    This notBetween(boolean condition, R column, Object val1, Object val2);
+    Children notBetween(boolean condition, R column, Object val1, Object val2);
 
     /**
      * ignore
      */
-    default This like(R column, Object val) {
+    default Children like(R column, Object val) {
         return like(true, column, val);
     }
 
@@ -232,12 +232,12 @@ public interface Compare<This, R> extends Serializable {
      * @param val       值
      * @return children
      */
-    This like(boolean condition, R column, Object val);
+    Children like(boolean condition, R column, Object val);
 
     /**
      * ignore
      */
-    default This notLike(R column, Object val) {
+    default Children notLike(R column, Object val) {
         return notLike(true, column, val);
     }
 
@@ -249,12 +249,12 @@ public interface Compare<This, R> extends Serializable {
      * @param val       值
      * @return children
      */
-    This notLike(boolean condition, R column, Object val);
+    Children notLike(boolean condition, R column, Object val);
 
     /**
      * ignore
      */
-    default This likeLeft(R column, Object val) {
+    default Children likeLeft(R column, Object val) {
         return likeLeft(true, column, val);
     }
 
@@ -266,12 +266,12 @@ public interface Compare<This, R> extends Serializable {
      * @param val       值
      * @return children
      */
-    This likeLeft(boolean condition, R column, Object val);
+    Children likeLeft(boolean condition, R column, Object val);
 
     /**
      * ignore
      */
-    default This likeRight(R column, Object val) {
+    default Children likeRight(R column, Object val) {
         return likeRight(true, column, val);
     }
 
@@ -283,5 +283,5 @@ public interface Compare<This, R> extends Serializable {
      * @param val       值
      * @return children
      */
-    This likeRight(boolean condition, R column, Object val);
+    Children likeRight(boolean condition, R column, Object val);
 }

+ 34 - 34
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/interfaces/Func.java

@@ -34,12 +34,12 @@ import static java.util.stream.Collectors.toList;
  * @since 2017-05-26
  */
 @SuppressWarnings("unchecked")
-public interface Func<This, R> extends Serializable {
+public interface Func<Children, R> extends Serializable {
 
     /**
      * ignore
      */
-    default This isNull(R column) {
+    default Children isNull(R column) {
         return isNull(true, column);
     }
 
@@ -51,12 +51,12 @@ public interface Func<This, R> extends Serializable {
      * @param column    字段
      * @return children
      */
-    This isNull(boolean condition, R column);
+    Children isNull(boolean condition, R column);
 
     /**
      * ignore
      */
-    default This isNotNull(R column) {
+    default Children isNotNull(R column) {
         return isNotNull(true, column);
     }
 
@@ -68,19 +68,19 @@ public interface Func<This, R> extends Serializable {
      * @param column    字段
      * @return children
      */
-    This isNotNull(boolean condition, R column);
+    Children isNotNull(boolean condition, R column);
 
     /**
      * ignore
      */
-    default This in(R column, Collection<?> coll) {
+    default Children in(R column, Collection<?> coll) {
         return in(true, column, coll);
     }
 
     /**
      * ignore
      */
-    default This inOrThrow(R column, Collection<?> value) {
+    default Children inOrThrow(R column, Collection<?> value) {
         return inOrThrow(true, column, value);
     }
 
@@ -95,7 +95,7 @@ public interface Func<This, R> extends Serializable {
      * @param coll      数据集合
      * @return children
      */
-    default This inOrThrow(boolean condition, R column, Collection<?> coll) {
+    default Children inOrThrow(boolean condition, R column, Collection<?> coll) {
         Assert.notEmpty(coll, "coll could not be empty!");
         return in(condition, column, coll);
     }
@@ -111,12 +111,12 @@ public interface Func<This, R> extends Serializable {
      * @param coll      数据集合
      * @return children
      */
-    This in(boolean condition, R column, Collection<?> coll);
+    Children in(boolean condition, R column, Collection<?> coll);
 
     /**
      * ignore
      */
-    default This inOrThrow(R column, Object... values) {
+    default Children inOrThrow(R column, Object... values) {
         return inOrThrow(true, column, values);
     }
 
@@ -131,7 +131,7 @@ public interface Func<This, R> extends Serializable {
      * @param values    数据数组
      * @return children
      */
-    default This inOrThrow(boolean condition, R column, Object... values) {
+    default Children inOrThrow(boolean condition, R column, Object... values) {
         Assert.notEmpty(values, "values could not be empty!");
         return in(condition, column, Arrays.stream(values).collect(toList()));
     }
@@ -139,7 +139,7 @@ public interface Func<This, R> extends Serializable {
     /**
      * ignore
      */
-    default This in(R column, Object... values) {
+    default Children in(R column, Object... values) {
         return in(true, column, values);
     }
 
@@ -154,7 +154,7 @@ public interface Func<This, R> extends Serializable {
      * @param values    数据数组
      * @return children
      */
-    default This in(boolean condition, R column, Object... values) {
+    default Children in(boolean condition, R column, Object... values) {
         return in(condition, column, Arrays.stream(Optional.ofNullable(values).orElseGet(() -> new Object[]{}))
             .collect(toList()));
     }
@@ -162,14 +162,14 @@ public interface Func<This, R> extends Serializable {
     /**
      * ignore
      */
-    default This notIn(R column, Collection<?> coll) {
+    default Children notIn(R column, Collection<?> coll) {
         return notIn(true, column, coll);
     }
 
     /**
      * ignore
      */
-    default This notInOrThrow(R column, Collection<?> value) {
+    default Children notInOrThrow(R column, Collection<?> value) {
         return notInOrThrow(true, column, value);
     }
 
@@ -184,7 +184,7 @@ public interface Func<This, R> extends Serializable {
      * @param coll      数据集合
      * @return children
      */
-    default This notInOrThrow(boolean condition, R column, Collection<?> coll) {
+    default Children notInOrThrow(boolean condition, R column, Collection<?> coll) {
         Assert.notEmpty(coll, "coll could not be empty!");
         return notIn(condition, column, coll);
     }
@@ -198,19 +198,19 @@ public interface Func<This, R> extends Serializable {
      * @param coll      数据集合
      * @return children
      */
-    This notIn(boolean condition, R column, Collection<?> coll);
+    Children notIn(boolean condition, R column, Collection<?> coll);
 
     /**
      * ignore
      */
-    default This notIn(R column, Object... value) {
+    default Children notIn(R column, Object... value) {
         return notIn(true, column, value);
     }
 
     /**
      * ignore
      */
-    default This notInOrThrow(R column, Object... values) {
+    default Children notInOrThrow(R column, Object... values) {
         return notInOrThrow(true, column, values);
     }
 
@@ -225,7 +225,7 @@ public interface Func<This, R> extends Serializable {
      * @param values    数据数组
      * @return children
      */
-    default This notInOrThrow(boolean condition, R column, Object... values) {
+    default Children notInOrThrow(boolean condition, R column, Object... values) {
         Assert.notEmpty(values, "values could not be empty!");
         return notIn(condition, column, Arrays.stream(values).collect(toList()));
     }
@@ -239,7 +239,7 @@ public interface Func<This, R> extends Serializable {
      * @param values    数据数组
      * @return children
      */
-    default This notIn(boolean condition, R column, Object... values) {
+    default Children notIn(boolean condition, R column, Object... values) {
         return notIn(condition, column, Arrays.stream(Optional.ofNullable(values).orElseGet(() -> new Object[]{}))
             .collect(toList()));
     }
@@ -247,7 +247,7 @@ public interface Func<This, R> extends Serializable {
     /**
      * ignore
      */
-    default This inSql(R column, String inValue) {
+    default Children inSql(R column, String inValue) {
         return inSql(true, column, inValue);
     }
 
@@ -262,12 +262,12 @@ public interface Func<This, R> extends Serializable {
      * @param inValue   sql语句
      * @return children
      */
-    This inSql(boolean condition, R column, String inValue);
+    Children inSql(boolean condition, R column, String inValue);
 
     /**
      * ignore
      */
-    default This notInSql(R column, String inValue) {
+    default Children notInSql(R column, String inValue) {
         return notInSql(true, column, inValue);
     }
 
@@ -282,12 +282,12 @@ public interface Func<This, R> extends Serializable {
      * @param inValue   sql语句 ---> 1,2,3,4,5,6 或者 select id from table where id < 3
      * @return children
      */
-    This notInSql(boolean condition, R column, String inValue);
+    Children notInSql(boolean condition, R column, String inValue);
 
     /**
      * ignore
      */
-    default This groupBy(R... columns) {
+    default Children groupBy(R... columns) {
         return groupBy(true, columns);
     }
 
@@ -299,12 +299,12 @@ public interface Func<This, R> extends Serializable {
      * @param columns   字段数组
      * @return children
      */
-    This groupBy(boolean condition, R... columns);
+    Children groupBy(boolean condition, R... columns);
 
     /**
      * ignore
      */
-    default This orderByAsc(R... columns) {
+    default Children orderByAsc(R... columns) {
         return orderByAsc(true, columns);
     }
 
@@ -316,14 +316,14 @@ public interface Func<This, R> extends Serializable {
      * @param columns   字段数组
      * @return children
      */
-    default This orderByAsc(boolean condition, R... columns) {
+    default Children orderByAsc(boolean condition, R... columns) {
         return orderBy(condition, true, columns);
     }
 
     /**
      * ignore
      */
-    default This orderByDesc(R... columns) {
+    default Children orderByDesc(R... columns) {
         return orderByDesc(true, columns);
     }
 
@@ -335,7 +335,7 @@ public interface Func<This, R> extends Serializable {
      * @param columns   字段数组
      * @return children
      */
-    default This orderByDesc(boolean condition, R... columns) {
+    default Children orderByDesc(boolean condition, R... columns) {
         return orderBy(condition, false, columns);
     }
 
@@ -348,12 +348,12 @@ public interface Func<This, R> extends Serializable {
      * @param columns   字段数组
      * @return children
      */
-    This orderBy(boolean condition, boolean isAsc, R... columns);
+    Children orderBy(boolean condition, boolean isAsc, R... columns);
 
     /**
      * ignore
      */
-    default This having(String sqlHaving, Object... params) {
+    default Children having(String sqlHaving, Object... params) {
         return having(true, sqlHaving, params);
     }
 
@@ -367,5 +367,5 @@ public interface Func<This, R> extends Serializable {
      * @param params    参数数组
      * @return children
      */
-    This having(boolean condition, String sqlHaving, Object... params);
+    Children having(boolean condition, String sqlHaving, Object... params);
 }

+ 11 - 11
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/interfaces/Join.java

@@ -26,12 +26,12 @@ import java.io.Serializable;
  * @author hubin miemie HCL
  * @since 2017-05-26
  */
-public interface Join<This> extends Serializable {
+public interface Join<Children> extends Serializable {
 
     /**
      * ignore
      */
-    default This or() {
+    default Children or() {
         return or(true);
     }
 
@@ -41,12 +41,12 @@ public interface Join<This> extends Serializable {
      * @param condition 执行条件
      * @return children
      */
-    This or(boolean condition);
+    Children or(boolean condition);
 
     /**
      * ignore
      */
-    default This apply(String applySql, Object... value) {
+    default Children apply(String applySql, Object... value) {
         return apply(true, applySql, value);
     }
 
@@ -60,12 +60,12 @@ public interface Join<This> extends Serializable {
      * @param condition 执行条件
      * @return children
      */
-    This apply(boolean condition, String applySql, Object... value);
+    Children apply(boolean condition, String applySql, Object... value);
 
     /**
      * ignore
      */
-    default This last(String lastSql) {
+    default Children last(String lastSql) {
         return last(true, lastSql);
     }
 
@@ -78,12 +78,12 @@ public interface Join<This> extends Serializable {
      * @param lastSql   sql语句
      * @return children
      */
-    This last(boolean condition, String lastSql);
+    Children last(boolean condition, String lastSql);
 
     /**
      * ignore
      */
-    default This exists(String existsSql) {
+    default Children exists(String existsSql) {
         return exists(true, existsSql);
     }
 
@@ -96,12 +96,12 @@ public interface Join<This> extends Serializable {
      * @param existsSql sql语句
      * @return children
      */
-    This exists(boolean condition, String existsSql);
+    Children exists(boolean condition, String existsSql);
 
     /**
      * ignore
      */
-    default This notExists(String notExistsSql) {
+    default Children notExists(String notExistsSql) {
         return notExists(true, notExistsSql);
     }
 
@@ -114,5 +114,5 @@ public interface Join<This> extends Serializable {
      * @param notExistsSql sql语句
      * @return children
      */
-    This notExists(boolean condition, String notExistsSql);
+    Children notExists(boolean condition, String notExistsSql);
 }

+ 7 - 7
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/interfaces/Nested.java

@@ -27,12 +27,12 @@ import java.util.function.Function;
  * @author hubin miemie HCL
  * @since 2017-05-26
  */
-public interface Nested<This> extends Serializable {
+public interface Nested<Param, Children> extends Serializable {
 
     /**
      * ignore
      */
-    default This and(Function<This, This> func) {
+    default Children and(Function<Param, Param> func) {
         return and(true, func);
     }
 
@@ -44,12 +44,12 @@ public interface Nested<This> extends Serializable {
      * @param func      函数
      * @return children
      */
-    This and(boolean condition, Function<This, This> func);
+    Children and(boolean condition, Function<Param, Param> func);
 
     /**
      * ignore
      */
-    default This or(Function<This, This> func) {
+    default Children or(Function<Param, Param> func) {
         return or(true, func);
     }
 
@@ -61,12 +61,12 @@ public interface Nested<This> extends Serializable {
      * @param func      函数
      * @return children
      */
-    This or(boolean condition, Function<This, This> func);
+    Children or(boolean condition, Function<Param, Param> func);
 
     /**
      * ignore
      */
-    default This nested(Function<This, This> func) {
+    default Children nested(Function<Param, Param> func) {
         return nested(true, func);
     }
 
@@ -78,5 +78,5 @@ public interface Nested<This> extends Serializable {
      * @param func      函数
      * @return children
      */
-    This nested(boolean condition, Function<This, This> func);
+    Children nested(boolean condition, Function<Param, Param> func);
 }

+ 4 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/query/Query.java

@@ -24,7 +24,7 @@ import java.util.function.Predicate;
  * @author miemie
  * @since 2018-12-12
  */
-public interface Query<This, T, R> extends Serializable {
+public interface Query<Children, T, R> extends Serializable {
 
     /**
      * 设置查询字段
@@ -32,13 +32,13 @@ public interface Query<This, T, R> extends Serializable {
      * @param columns 字段数组
      * @return children
      */
-    This select(R... columns);
+    Children select(R... columns);
 
     /**
      * ignore
      * <li> 注意只有内部有 entity 才能使用该方法 </li>
      */
-    This select(Predicate<TableFieldInfo> predicate);
+    Children select(Predicate<TableFieldInfo> predicate);
 
     /**
      * <p>
@@ -55,7 +55,7 @@ public interface Query<This, T, R> extends Serializable {
      * @param predicate 过滤方式
      * @return children
      */
-    This select(Class<T> entityClass, Predicate<TableFieldInfo> predicate);
+    Children select(Class<T> entityClass, Predicate<TableFieldInfo> predicate);
 
     /**
      * 查询条件 SQL 片段

+ 5 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/LambdaUpdateWrapper.java

@@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper;
 import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 
 import java.util.ArrayList;
@@ -72,8 +73,10 @@ public class LambdaUpdateWrapper<T> extends AbstractLambdaWrapper<T, LambdaUpdat
     }
 
     @Override
-    public LambdaUpdateWrapper<T> setSql(String sql) {
-        sqlSet.add(sql);
+    public LambdaUpdateWrapper<T> setSql(boolean condition, String sql) {
+        if (condition && StringUtils.isNotEmpty(sql)) {
+            sqlSet.add(sql);
+        }
         return typedThis;
     }
 

+ 11 - 4
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/Update.java

@@ -21,12 +21,12 @@ import java.io.Serializable;
  * @author miemie
  * @since 2018-12-12
  */
-public interface Update<This, R> extends Serializable {
+public interface Update<Children, R> extends Serializable {
 
     /**
      * ignore
      */
-    default This set(R column, Object val) {
+    default Children set(R column, Object val) {
         return set(true, column, val);
     }
 
@@ -38,7 +38,14 @@ public interface Update<This, R> extends Serializable {
      * @param val       值
      * @return children
      */
-    This set(boolean condition, R column, Object val);
+    Children set(boolean condition, R column, Object val);
+
+    /**
+     * ignore
+     */
+    default Children setSql(String sql) {
+        return setSql(true, sql);
+    }
 
     /**
      * 设置 更新 SQL 的 SET 片段
@@ -46,7 +53,7 @@ public interface Update<This, R> extends Serializable {
      * @param sql set sql
      * @return children
      */
-    This setSql(String sql);
+    Children setSql(boolean condition, String sql);
 
     /**
      * 获取 更新 SQL 的 SET 片段

+ 5 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/UpdateWrapper.java

@@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
 import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -79,8 +80,10 @@ public class UpdateWrapper<T> extends AbstractWrapper<T, String, UpdateWrapper<T
     }
 
     @Override
-    public UpdateWrapper<T> setSql(String sql) {
-        sqlSet.add(sql);
+    public UpdateWrapper<T> setSql(boolean condition, String sql) {
+        if (condition && StringUtils.isNotEmpty(sql)) {
+            sqlSet.add(sql);
+        }
         return typedThis;
     }
 

+ 5 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/kotlin/KtUpdateWrapper.kt

@@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments
 import com.baomidou.mybatisplus.core.conditions.update.Update
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils
 import com.baomidou.mybatisplus.core.toolkit.StringPool
+import com.baomidou.mybatisplus.core.toolkit.StringUtils
 import java.util.concurrent.atomic.AtomicInteger
 import java.util.stream.Collectors.joining
 import kotlin.reflect.KProperty
@@ -55,8 +56,10 @@ class KtUpdateWrapper<T : Any> : AbstractKtWrapper<T, KtUpdateWrapper<T>>, Updat
         else sqlSet.stream().collect(joining(StringPool.COMMA))
     }
 
-    override fun setSql(sql: String): KtUpdateWrapper<T> {
-        sqlSet.add(sql)
+    override fun setSql(condition: Boolean, sql: String): KtUpdateWrapper<T> {
+        if (condition && StringUtils.isNotEmpty(sql)) {
+            sqlSet.add(sql)
+        }
         return typedThis
     }
 

+ 1 - 1
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/IService.java

@@ -21,7 +21,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
-import com.baomidou.mybatisplus.extension.service.additional.query.QueryChainWrapper;
+import com.baomidou.mybatisplus.extension.service.additional.query.impl.QueryChainWrapper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 
 import java.io.Serializable;

+ 44 - 37
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/AbstractChainWrapper.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.interfaces.Func;
 import com.baomidou.mybatisplus.core.conditions.interfaces.Join;
 import com.baomidou.mybatisplus.core.conditions.interfaces.Nested;
 import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 import java.util.Collection;
 import java.util.Map;
@@ -14,17 +15,23 @@ import java.util.function.BiPredicate;
 import java.util.function.Function;
 
 /**
- * , Func<This, R>, Join<This>, Nested<This>
- *
  * @author miemie
  * @since 2018-12-19
  */
 @SuppressWarnings({"serial", "unchecked"})
-public abstract class AbstractChainWrapper<T, R, This extends AbstractChainWrapper<T, R, This>> extends Wrapper<T>
-    implements Compare<This, R>, Func<This, R>, Join<This>, Nested<This> {
-    protected final This typedThis = (This) this;
+public abstract class AbstractChainWrapper<T, R, Children extends AbstractChainWrapper<T, R, Children, Param>, Param>
+    extends Wrapper<T> implements Compare<Children, R>, Func<Children, R>, Join<Children>, Nested<Param, Children> {
+    protected final Children typedThis = (Children) this;
+    protected BaseMapper<T> baseMapper;
+    protected Param wrapperChildren;
 
-    protected abstract AbstractWrapper getWrapper();
+    public AbstractChainWrapper(BaseMapper<T> baseMapper) {
+        this.baseMapper = baseMapper;
+    }
+
+    protected AbstractWrapper getWrapper() {
+        return (AbstractWrapper) wrapperChildren;
+    }
 
     @Override
     public T getEntity() {
@@ -42,187 +49,187 @@ public abstract class AbstractChainWrapper<T, R, This extends AbstractChainWrapp
     }
 
     @Override
-    public <V> This allEq(boolean condition, Map<R, V> params, boolean null2IsNull) {
+    public <V> Children allEq(boolean condition, Map<R, V> params, boolean null2IsNull) {
         getWrapper().allEq(condition, params, null2IsNull);
         return typedThis;
     }
 
     @Override
-    public <V> This allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull) {
+    public <V> Children allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull) {
         getWrapper().allEq(condition, filter, params, null2IsNull);
         return typedThis;
     }
 
     @Override
-    public This eq(boolean condition, R column, Object val) {
+    public Children eq(boolean condition, R column, Object val) {
         getWrapper().eq(condition, column, val);
         return typedThis;
     }
 
     @Override
-    public This ne(boolean condition, R column, Object val) {
+    public Children ne(boolean condition, R column, Object val) {
         getWrapper().ne(condition, column, val);
         return typedThis;
     }
 
     @Override
-    public This gt(boolean condition, R column, Object val) {
+    public Children gt(boolean condition, R column, Object val) {
         getWrapper().gt(condition, column, val);
         return typedThis;
     }
 
     @Override
-    public This ge(boolean condition, R column, Object val) {
+    public Children ge(boolean condition, R column, Object val) {
         getWrapper().ge(condition, column, val);
         return typedThis;
     }
 
     @Override
-    public This lt(boolean condition, R column, Object val) {
+    public Children lt(boolean condition, R column, Object val) {
         getWrapper().lt(condition, column, val);
         return typedThis;
     }
 
     @Override
-    public This le(boolean condition, R column, Object val) {
+    public Children le(boolean condition, R column, Object val) {
         getWrapper().le(condition, column, val);
         return typedThis;
     }
 
     @Override
-    public This between(boolean condition, R column, Object val1, Object val2) {
+    public Children between(boolean condition, R column, Object val1, Object val2) {
         getWrapper().between(condition, column, val1, val2);
         return typedThis;
     }
 
     @Override
-    public This notBetween(boolean condition, R column, Object val1, Object val2) {
+    public Children notBetween(boolean condition, R column, Object val1, Object val2) {
         getWrapper().notBetween(condition, column, val1, val2);
         return typedThis;
     }
 
     @Override
-    public This like(boolean condition, R column, Object val) {
+    public Children like(boolean condition, R column, Object val) {
         getWrapper().like(condition, column, val);
         return typedThis;
     }
 
     @Override
-    public This notLike(boolean condition, R column, Object val) {
+    public Children notLike(boolean condition, R column, Object val) {
         getWrapper().notLike(condition, column, val);
         return typedThis;
     }
 
     @Override
-    public This likeLeft(boolean condition, R column, Object val) {
+    public Children likeLeft(boolean condition, R column, Object val) {
         getWrapper().likeLeft(condition, column, val);
         return typedThis;
     }
 
     @Override
-    public This likeRight(boolean condition, R column, Object val) {
+    public Children likeRight(boolean condition, R column, Object val) {
         getWrapper().likeRight(condition, column, val);
         return typedThis;
     }
 
     @Override
-    public This isNull(boolean condition, R column) {
+    public Children isNull(boolean condition, R column) {
         getWrapper().isNull(condition, column);
         return typedThis;
     }
 
     @Override
-    public This isNotNull(boolean condition, R column) {
+    public Children isNotNull(boolean condition, R column) {
         getWrapper().isNotNull(condition, column);
         return typedThis;
     }
 
     @Override
-    public This in(boolean condition, R column, Collection<?> coll) {
+    public Children in(boolean condition, R column, Collection<?> coll) {
         getWrapper().in(condition, column, coll);
         return typedThis;
     }
 
     @Override
-    public This notIn(boolean condition, R column, Collection<?> coll) {
+    public Children notIn(boolean condition, R column, Collection<?> coll) {
         getWrapper().notIn(condition, column, coll);
         return typedThis;
     }
 
     @Override
-    public This inSql(boolean condition, R column, String inValue) {
+    public Children inSql(boolean condition, R column, String inValue) {
         getWrapper().inSql(condition, column, inValue);
         return typedThis;
     }
 
     @Override
-    public This notInSql(boolean condition, R column, String inValue) {
+    public Children notInSql(boolean condition, R column, String inValue) {
         getWrapper().notInSql(condition, column, inValue);
         return typedThis;
     }
 
     @Override
-    public This groupBy(boolean condition, R... columns) {
+    public Children groupBy(boolean condition, R... columns) {
         getWrapper().groupBy(condition, columns);
         return typedThis;
     }
 
     @Override
-    public This orderBy(boolean condition, boolean isAsc, R... columns) {
+    public Children orderBy(boolean condition, boolean isAsc, R... columns) {
         getWrapper().orderBy(condition, isAsc, columns);
         return typedThis;
     }
 
     @Override
-    public This having(boolean condition, String sqlHaving, Object... params) {
+    public Children having(boolean condition, String sqlHaving, Object... params) {
         getWrapper().having(condition, sqlHaving, params);
         return typedThis;
     }
 
     @Override
-    public This or(boolean condition) {
+    public Children or(boolean condition) {
         getWrapper().or(condition);
         return typedThis;
     }
 
     @Override
-    public This apply(boolean condition, String applySql, Object... value) {
+    public Children apply(boolean condition, String applySql, Object... value) {
         getWrapper().apply(condition, applySql, value);
         return typedThis;
     }
 
     @Override
-    public This last(boolean condition, String lastSql) {
+    public Children last(boolean condition, String lastSql) {
         getWrapper().last(condition, lastSql);
         return typedThis;
     }
 
     @Override
-    public This exists(boolean condition, String existsSql) {
+    public Children exists(boolean condition, String existsSql) {
         getWrapper().exists(condition, existsSql);
         return typedThis;
     }
 
     @Override
-    public This notExists(boolean condition, String notExistsSql) {
+    public Children notExists(boolean condition, String notExistsSql) {
         getWrapper().notExists(condition, notExistsSql);
         return typedThis;
     }
 
     @Override
-    public This and(boolean condition, Function<This, This> func) {
+    public Children and(boolean condition, Function<Param, Param> func) {
         getWrapper().and(condition, func);
         return typedThis;
     }
 
     @Override
-    public This or(boolean condition, Function<This, This> func) {
+    public Children or(boolean condition, Function<Param, Param> func) {
         getWrapper().or(condition, func);
         return typedThis;
     }
 
     @Override
-    public This nested(boolean condition, Function<This, This> func) {
+    public Children nested(boolean condition, Function<Param, Param> func) {
         getWrapper().nested(condition, func);
         return typedThis;
     }

+ 71 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/query/impl/LambdaQueryChainWrapper.java

@@ -0,0 +1,71 @@
+package com.baomidou.mybatisplus.extension.service.additional.query.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.Query;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.baomidou.mybatisplus.extension.service.additional.AbstractChainWrapper;
+import com.baomidou.mybatisplus.extension.service.additional.query.Querys;
+
+import java.util.List;
+import java.util.function.Predicate;
+
+/**
+ * @author miemie
+ * @since 2018-12-19
+ */
+@SuppressWarnings("serial")
+public class LambdaQueryChainWrapper<T> extends AbstractChainWrapper<T, String, LambdaQueryChainWrapper<T>, LambdaQueryWrapper<T>>
+    implements Querys<T>, Query<LambdaQueryChainWrapper<T>, T, SFunction<T, ?>> {
+
+    public LambdaQueryChainWrapper(BaseMapper<T> baseMapper) {
+        super(baseMapper);
+        wrapperChildren = new LambdaQueryWrapper<>();
+    }
+
+    @SafeVarargs
+    @Override
+    public final LambdaQueryChainWrapper<T> select(SFunction<T, ?>... columns) {
+        wrapperChildren.select(columns);
+        return typedThis;
+    }
+
+    @Override
+    public LambdaQueryChainWrapper<T> select(Predicate<TableFieldInfo> predicate) {
+        wrapperChildren.select(predicate);
+        return typedThis;
+    }
+
+    @Override
+    public LambdaQueryChainWrapper<T> select(Class<T> entityClass, Predicate<TableFieldInfo> predicate) {
+        wrapperChildren.select(entityClass, predicate);
+        return typedThis;
+    }
+
+    @Override
+    public String getSqlSelect() {
+        return wrapperChildren.getSqlSelect();
+    }
+
+    @Override
+    public List<T> list() {
+        return baseMapper.selectList(wrapperChildren);
+    }
+
+    @Override
+    public T one() {
+        return baseMapper.selectOne(wrapperChildren);
+    }
+
+    @Override
+    public Integer count() {
+        return baseMapper.selectCount(wrapperChildren);
+    }
+
+    @Override
+    public IPage<T> page(IPage<T> page) {
+        return baseMapper.selectPage(page, wrapperChildren);
+    }
+}

+ 13 - 21
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/query/QueryChainWrapper.java → mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/query/impl/QueryChainWrapper.java

@@ -1,12 +1,12 @@
-package com.baomidou.mybatisplus.extension.service.additional.query;
+package com.baomidou.mybatisplus.extension.service.additional.query.impl;
 
-import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.Query;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
 import com.baomidou.mybatisplus.extension.service.additional.AbstractChainWrapper;
+import com.baomidou.mybatisplus.extension.service.additional.query.Querys;
 
 import java.util.List;
 import java.util.function.Predicate;
@@ -16,62 +16,54 @@ import java.util.function.Predicate;
  * @since 2018-12-19
  */
 @SuppressWarnings("serial")
-public class QueryChainWrapper<T> extends AbstractChainWrapper<T, String, QueryChainWrapper<T>>
+public class QueryChainWrapper<T> extends AbstractChainWrapper<T, String, QueryChainWrapper<T>, QueryWrapper<T>>
     implements Querys<T>, Query<QueryChainWrapper<T>, T, String> {
 
-    private QueryWrapper<T> queryWrapper;
-    private BaseMapper<T> baseMapper;
-
     public QueryChainWrapper(BaseMapper<T> baseMapper) {
-        this.baseMapper = baseMapper;
-        queryWrapper = new QueryWrapper<>();
-    }
-
-    @Override
-    protected AbstractWrapper getWrapper() {
-        return queryWrapper;
+        super(baseMapper);
+        wrapperChildren = new QueryWrapper<>();
     }
 
     @Override
     public List<T> list() {
-        return baseMapper.selectList(queryWrapper);
+        return baseMapper.selectList(wrapperChildren);
     }
 
     @Override
     public T one() {
-        return baseMapper.selectOne(queryWrapper);
+        return baseMapper.selectOne(wrapperChildren);
     }
 
     @Override
     public Integer count() {
-        return baseMapper.selectCount(queryWrapper);
+        return baseMapper.selectCount(wrapperChildren);
     }
 
     @Override
     public IPage<T> page(IPage<T> page) {
-        return baseMapper.selectPage(page, queryWrapper);
+        return baseMapper.selectPage(page, wrapperChildren);
     }
 
     @Override
     public QueryChainWrapper<T> select(String... columns) {
-        queryWrapper.select(columns);
+        wrapperChildren.select(columns);
         return typedThis;
     }
 
     @Override
     public QueryChainWrapper<T> select(Predicate<TableFieldInfo> predicate) {
-        queryWrapper.select(predicate);
+        wrapperChildren.select(predicate);
         return typedThis;
     }
 
     @Override
     public QueryChainWrapper<T> select(Class<T> entityClass, Predicate<TableFieldInfo> predicate) {
-        queryWrapper.select(entityClass, predicate);
+        wrapperChildren.select(entityClass, predicate);
         return typedThis;
     }
 
     @Override
     public String getSqlSelect() {
-        return queryWrapper.getSqlSelect();
+        return wrapperChildren.getSqlSelect();
     }
 }

+ 10 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/update/Updates.java

@@ -0,0 +1,10 @@
+package com.baomidou.mybatisplus.extension.service.additional.update;
+
+/**
+ * @author miemie
+ * @since 2018-12-19
+ */
+public interface Updates<T> {
+
+    int update(T entity);
+}

+ 44 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/update/impl/LambdaUpdateChainWrapper.java

@@ -0,0 +1,44 @@
+package com.baomidou.mybatisplus.extension.service.additional.update.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.Update;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.baomidou.mybatisplus.extension.service.additional.AbstractChainWrapper;
+import com.baomidou.mybatisplus.extension.service.additional.update.Updates;
+
+/**
+ * @author miemie
+ * @since 2018-12-19
+ */
+@SuppressWarnings("serial")
+public class LambdaUpdateChainWrapper<T> extends AbstractChainWrapper<T, String, LambdaUpdateChainWrapper<T>, LambdaUpdateWrapper<T>>
+    implements Updates<T>, Update<LambdaUpdateChainWrapper<T>, SFunction<T, ?>> {
+
+    public LambdaUpdateChainWrapper(BaseMapper<T> baseMapper) {
+        super(baseMapper);
+        wrapperChildren = new LambdaUpdateWrapper<>();
+    }
+
+    @Override
+    public LambdaUpdateChainWrapper<T> set(boolean condition, SFunction<T, ?> column, Object val) {
+        wrapperChildren.set(condition, column, val);
+        return typedThis;
+    }
+
+    @Override
+    public LambdaUpdateChainWrapper<T> setSql(boolean condition, String sql) {
+        wrapperChildren.setSql(condition, sql);
+        return typedThis;
+    }
+
+    @Override
+    public String getSqlSet() {
+        return wrapperChildren.getSqlSet();
+    }
+
+    @Override
+    public int update(T entity) {
+        return baseMapper.update(entity, wrapperChildren);
+    }
+}

+ 43 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/update/impl/UpdateChainWrapper.java

@@ -0,0 +1,43 @@
+package com.baomidou.mybatisplus.extension.service.additional.update.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.Update;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.service.additional.AbstractChainWrapper;
+import com.baomidou.mybatisplus.extension.service.additional.update.Updates;
+
+/**
+ * @author miemie
+ * @since 2018-12-19
+ */
+@SuppressWarnings("serial")
+public class UpdateChainWrapper<T> extends AbstractChainWrapper<T, String, UpdateChainWrapper<T>, UpdateWrapper<T>>
+    implements Updates<T>, Update<UpdateChainWrapper<T>, String> {
+
+    public UpdateChainWrapper(BaseMapper<T> baseMapper) {
+        super(baseMapper);
+        wrapperChildren = new UpdateWrapper<>();
+    }
+
+    @Override
+    public UpdateChainWrapper<T> set(boolean condition, String column, Object val) {
+        wrapperChildren.set(condition, column, val);
+        return typedThis;
+    }
+
+    @Override
+    public UpdateChainWrapper<T> setSql(boolean condition, String sql) {
+        wrapperChildren.setSql(condition, sql);
+        return typedThis;
+    }
+
+    @Override
+    public String getSqlSet() {
+        return wrapperChildren.getSqlSet();
+    }
+
+    @Override
+    public int update(T entity) {
+        return baseMapper.update(entity, wrapperChildren);
+    }
+}

+ 2 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/H2UserTest.java

@@ -286,7 +286,7 @@ public class H2UserTest extends BaseTest {
         H2User tomcat = userService.lambdaQuery().eq(H2User::getName, "Tomcat").getOne();
         Assert.assertNotNull("tomcat should not be null", tomcat);
         Assert.assertNotEquals("count should not be zero", 0, userService.lambdaQuery().like(H2User::getName, "a").count());
-        userService.lambdaQuery().like(H2User::getName,"T")
+        userService.lambdaQuery().like(H2User::getName, "T")
             .ne(H2User::getAge, AgeEnum.TWO)
             .ge(H2User::getVersion, 1)
             .isNull(H2User::getPrice)
@@ -297,5 +297,6 @@ public class H2UserTest extends BaseTest {
     public void testServiceChainQuery() {
         H2User tomcat = userService.query().eq("name", "Tomcat").one();
         Assert.assertNotNull("tomcat should not be null", tomcat);
+        userService.query().nested(i -> i.eq("name", "Tomcat")).list();
     }
 }