Browse Source

新api not

miemie 5 years ago
parent
commit
67042174c7

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

@@ -168,22 +168,22 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
 
     @Override
     public Children like(boolean condition, R column, Object val) {
-        return likeValue(condition, column, val, SqlLike.DEFAULT);
+        return likeValue(condition, LIKE, column, val, SqlLike.DEFAULT);
     }
 
     @Override
     public Children notLike(boolean condition, R column, Object val) {
-        return not(condition).like(condition, column, val);
+        return likeValue(condition, NOT_LIKE, column, val, SqlLike.DEFAULT);
     }
 
     @Override
     public Children likeLeft(boolean condition, R column, Object val) {
-        return likeValue(condition, column, val, SqlLike.LEFT);
+        return likeValue(condition, LIKE, column, val, SqlLike.LEFT);
     }
 
     @Override
     public Children likeRight(boolean condition, R column, Object val) {
-        return likeValue(condition, column, val, SqlLike.RIGHT);
+        return likeValue(condition, LIKE, column, val, SqlLike.RIGHT);
     }
 
     @Override
@@ -194,7 +194,8 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
 
     @Override
     public Children notBetween(boolean condition, R column, Object val1, Object val2) {
-        return not(condition).between(condition, column, val1, val2);
+        return doIt(condition, () -> columnToString(column), NOT_BETWEEN, () -> formatSql("{0}", val1), AND,
+            () -> formatSql("{0}", val2));
     }
 
     @Override
@@ -212,6 +213,11 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
         return addNestedCondition(condition, consumer);
     }
 
+    @Override
+    public Children not(boolean condition, Consumer<Children> consumer) {
+        return not(condition).addNestedCondition(condition, consumer);
+    }
+
     @Override
     public Children or(boolean condition) {
         return doIt(condition, OR);
@@ -252,8 +258,8 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
     }
 
     @Override
-    public Children notExists(boolean condition, String notExistsSql) {
-        return not(condition).exists(condition, notExistsSql);
+    public Children notExists(boolean condition, String existsSql) {
+        return not(condition).exists(condition, existsSql);
     }
 
     @Override
@@ -273,7 +279,7 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
 
     @Override
     public Children notIn(boolean condition, R column, Collection<?> coll) {
-        return not(condition).in(condition, column, coll);
+        return doIt(condition, () -> columnToString(column), NOT_IN, inExpression(coll));
     }
 
     @Override
@@ -283,7 +289,7 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
 
     @Override
     public Children notInSql(boolean condition, R column, String inValue) {
-        return not(condition).inSql(condition, column, inValue);
+        return doIt(condition, () -> columnToString(column), NOT_IN, () -> String.format("(%s)", inValue));
     }
 
     @Override
@@ -340,8 +346,8 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
      * 内部自用
      * <p>拼接 LIKE 以及 值</p>
      */
-    protected Children likeValue(boolean condition, R column, Object val, SqlLike sqlLike) {
-        return doIt(condition, () -> columnToString(column), LIKE, () -> formatSql("{0}", SqlUtils.concatLike(val, sqlLike)));
+    protected Children likeValue(boolean condition, SqlKeyword keyword, R column, Object val, SqlLike sqlLike) {
+        return doIt(condition, () -> columnToString(column), keyword, () -> formatSql("{0}", SqlUtils.concatLike(val, sqlLike)));
     }
 
     /**

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

@@ -132,8 +132,8 @@ public interface Join<Children> extends Serializable {
     /**
      * ignore
      */
-    default Children notExists(String notExistsSql) {
-        return notExists(true, notExistsSql);
+    default Children notExists(String existsSql) {
+        return notExists(true, existsSql);
     }
 
     /**
@@ -141,9 +141,9 @@ public interface Join<Children> extends Serializable {
      * <p>!! sql 注入方法 !!</p>
      * <p>例: notExists("select id from table where age = 1")</p>
      *
-     * @param condition    执行条件
-     * @param notExistsSql sql语句
+     * @param condition 执行条件
+     * @param existsSql sql语句
      * @return children
      */
-    Children notExists(boolean condition, String notExistsSql);
+    Children notExists(boolean condition, String existsSql);
 }

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

@@ -84,4 +84,23 @@ public interface Nested<Param, Children> extends Serializable {
      * @return children
      */
     Children nested(boolean condition, Consumer<Param> consumer);
+
+    /**
+     * ignore
+     */
+    default Children not(Consumer<Param> consumer) {
+        return not(true, consumer);
+    }
+
+    /**
+     * not嵌套
+     * <p>
+     * 例: not(i -&gt; i.eq("name", "李白").ne("status", "活着"))
+     * </p>
+     *
+     * @param condition 执行条件
+     * @param consumer  消费函数
+     * @return children
+     */
+    Children not(boolean condition, Consumer<Param> consumer);
 }

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

@@ -68,7 +68,7 @@ public class NormalSegmentList extends AbstractISegmentList {
             }
         } else {
             if (!executeNot) {
-                list.add(MatchSegment.EXISTS.match(firstSegment) ? 0 : 1, SqlKeyword.NOT);
+                list.add(0, SqlKeyword.NOT);
                 executeNot = true;
             }
             if (MatchSegment.APPLY.match(firstSegment)) {

+ 5 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/enums/SqlKeyword.java

@@ -28,9 +28,11 @@ import com.baomidou.mybatisplus.core.toolkit.StringPool;
 public enum SqlKeyword implements ISqlSegment {
     AND("AND"),
     OR("OR"),
-    IN("IN"),
     NOT("NOT"),
+    IN("IN"),
+    NOT_IN("NOT IN"),
     LIKE("LIKE"),
+    NOT_LIKE("NOT LIKE"),
     EQ(StringPool.EQUALS),
     NE("<>"),
     GT(StringPool.RIGHT_CHEV),
@@ -43,7 +45,9 @@ public enum SqlKeyword implements ISqlSegment {
     HAVING("HAVING"),
     ORDER_BY("ORDER BY"),
     EXISTS("EXISTS"),
+    NOT_EXISTS("NOT EXISTS"),
     BETWEEN("BETWEEN"),
+    NOT_BETWEEN("NOT BETWEEN"),
     ASC("ASC"),
     DESC("DESC");
 

+ 16 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/test/WrapperTest.java

@@ -150,6 +150,22 @@ class WrapperTest {
         logSqlSegment("只存在 group by", new QueryWrapper<User>()
                 .groupBy("id", "name", "sex").groupBy("id", "name"),
             "GROUP BY id,name,sex,id,name");
+
+        /* not 系列 */
+        logSqlSegment("not in", new QueryWrapper<User>()
+                .notIn("id", 1),
+            "(id NOT IN (?))");
+        logSqlSegment("not in sql", new QueryWrapper<User>()
+                .notInSql("id", "select"),
+            "(id NOT IN (select))");
+
+        logSqlSegment("not like", new QueryWrapper<User>()
+                .notLike("id", 1),
+            "(id NOT LIKE ?)");
+
+        logSqlSegment("not exists", new QueryWrapper<User>()
+                .notExists("select"),
+            "(NOT EXISTS (select))");
     }
 
     @Test

+ 8 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/conditions/AbstractChainWrapper.java

@@ -249,8 +249,8 @@ public abstract class AbstractChainWrapper<T, R, Children extends AbstractChainW
     }
 
     @Override
-    public Children notExists(boolean condition, String notExistsSql) {
-        getWrapper().notExists(condition, notExistsSql);
+    public Children notExists(boolean condition, String existsSql) {
+        getWrapper().notExists(condition, existsSql);
         return typedThis;
     }
 
@@ -272,6 +272,12 @@ public abstract class AbstractChainWrapper<T, R, Children extends AbstractChainW
         return typedThis;
     }
 
+    @Override
+    public Children not(boolean condition, Consumer<Param> consumer) {
+        getWrapper().not(condition, consumer);
+        return typedThis;
+    }
+
     @Override
     public String getSqlSegment() {
         throw ExceptionUtils.mpe("can not use this method for \"%s\"", "getSqlSegment");