Procházet zdrojové kódy

Wrapper添加条件判断

Caratacus před 8 roky
rodič
revize
b15be5c2e4

+ 528 - 58
mybatis-plus/src/main/java/com/baomidou/mybatisplus/mapper/Wrapper.java

@@ -32,6 +32,7 @@ import com.baomidou.mybatisplus.toolkit.MapUtils;
 import com.baomidou.mybatisplus.toolkit.SqlUtils;
 import com.baomidou.mybatisplus.toolkit.StringUtils;
 
+
 /**
  * <p>
  * 条件构造抽象类,定义T-SQL语法
@@ -69,7 +70,7 @@ public abstract class Wrapper<T> implements Serializable {
      */
     protected Boolean isWhere;
     /**
-     * 拼接WHERE后应该是AND还是OR
+     * 拼接WHERE后应该是AND还是ORnull
      */
     protected String AND_OR = "AND";
 
@@ -83,10 +84,7 @@ public abstract class Wrapper<T> implements Serializable {
     }
 
     public String getSqlSelect() {
-        if (StringUtils.isEmpty(sqlSelect)) {
-            return null;
-        }
-        return stripSqlInjection(sqlSelect);
+        return StringUtils.isEmpty(sqlSelect) ? null : stripSqlInjection(sqlSelect);
     }
 
     public Wrapper<T> setSqlSelect(String sqlSelect) {
@@ -129,8 +127,37 @@ public abstract class Wrapper<T> implements Serializable {
     public abstract String getSqlSegment();
 
     public String toString() {
+        StringBuilder sb = new StringBuilder("Wrapper<T>:");
         String sqlSegment = getSqlSegment();
-        return StringUtils.isNotEmpty(sqlSegment) ? sqlSegment.replaceAll("#\\{" + getParamAlias() + ".paramNameValuePairs.MPGENVAL[0-9]+}", "\\?") : super.toString();
+        if (StringUtils.isNotEmpty(sqlSegment)) {
+            sb.append(getSqlSegment().replaceAll("#\\{" + getParamAlias() + ".paramNameValuePairs.MPGENVAL[0-9]+}", "\\?")).append("\n");
+        }
+        Object entity = getEntity();
+        if (entity != null) {
+            sb.append("entity=").append(entity.toString());
+        }
+        return sb.toString();
+    }
+
+    /**
+     * <p>
+     * SQL中WHERE关键字跟的条件语句
+     * </p>
+     * <p>
+     * eg: ew.where("name='zhangsan'").where("id={0}","123");
+     * <p>
+     * 输出: WHERE (NAME='zhangsan' AND id=123)
+     * </p>
+     *
+     * @param isAdd
+     * @param sqlWhere where语句
+     * @param params   参数集
+     * @return this
+     */
+    public Wrapper<T> where(boolean isAdd, String sqlWhere, Object... params) {
+        if (isAdd)
+            sql.WHERE(formatSql(sqlWhere, params));
+        return this;
     }
 
     /**
@@ -148,7 +175,22 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> where(String sqlWhere, Object... params) {
-        sql.WHERE(formatSql(sqlWhere, params));
+        return where(true, sqlWhere, params);
+    }
+
+    /**
+     * <p>
+     * 等同于SQL的"field=value"表达式
+     * </p>
+     *
+     * @param isAdd
+     * @param column
+     * @param params
+     * @return
+     */
+    public Wrapper<T> eq(boolean isAdd, String column, Object params) {
+        if (isAdd)
+            sql.WHERE(formatSql(String.format("%s = {0}", column), params));
         return this;
     }
 
@@ -162,7 +204,22 @@ public abstract class Wrapper<T> implements Serializable {
      * @return
      */
     public Wrapper<T> eq(String column, Object params) {
-        sql.WHERE(formatSql(String.format("%s = {0}", column), params));
+        return eq(true, column, params);
+    }
+
+    /**
+     * <p>
+     * 等同于SQL的"field <> value"表达式
+     * </p>
+     *
+     * @param isAdd
+     * @param column
+     * @param params
+     * @return
+     */
+    public Wrapper<T> ne(boolean isAdd, String column, Object params) {
+        if (isAdd)
+            sql.WHERE(formatSql(String.format("%s <> {0}", column), params));
         return this;
     }
 
@@ -176,8 +233,8 @@ public abstract class Wrapper<T> implements Serializable {
      * @return
      */
     public Wrapper<T> ne(String column, Object params) {
-        sql.WHERE(formatSql(String.format("%s <> {0}", column), params));
-        return this;
+        return ne(true, column, params);
+
     }
 
     /**
@@ -185,12 +242,13 @@ public abstract class Wrapper<T> implements Serializable {
      * 等同于SQL的"field=value"表达式
      * </p>
      *
+     * @param isAdd
      * @param params
      * @return
      */
     @SuppressWarnings({"rawtypes", "unchecked"})
-    public Wrapper<T> allEq(Map<String, Object> params) {
-        if (MapUtils.isNotEmpty(params)) {
+    public Wrapper<T> allEq(boolean isAdd, Map<String, Object> params) {
+        if (isAdd && MapUtils.isNotEmpty(params)) {
             Iterator iterator = params.entrySet().iterator();
             while (iterator.hasNext()) {
                 Map.Entry<String, Object> entry = (Map.Entry<String, Object>) iterator.next();
@@ -205,6 +263,35 @@ public abstract class Wrapper<T> implements Serializable {
         return this;
     }
 
+    /**
+     * <p>
+     * 等同于SQL的"field=value"表达式
+     * </p>
+     *
+     * @param params
+     * @return
+     */
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public Wrapper<T> allEq(Map<String, Object> params) {
+        return allEq(true, params);
+    }
+
+    /**
+     * <p>
+     * 等同于SQL的"field>value"表达式
+     * </p>
+     *
+     * @param isAdd
+     * @param column
+     * @param params
+     * @return
+     */
+    public Wrapper<T> gt(boolean isAdd, String column, Object params) {
+        if (isAdd)
+            sql.WHERE(formatSql(String.format("%s > {0}", column), params));
+        return this;
+    }
+
     /**
      * <p>
      * 等同于SQL的"field>value"表达式
@@ -215,7 +302,22 @@ public abstract class Wrapper<T> implements Serializable {
      * @return
      */
     public Wrapper<T> gt(String column, Object params) {
-        sql.WHERE(formatSql(String.format("%s > {0}", column), params));
+        return gt(true, column, params);
+    }
+
+    /**
+     * <p>
+     * 等同于SQL的"field>=value"表达式
+     * </p>
+     *
+     * @param isAdd
+     * @param column
+     * @param params
+     * @return
+     */
+    public Wrapper<T> ge(boolean isAdd, String column, Object params) {
+        if (isAdd)
+            sql.WHERE(formatSql(String.format("%s >= {0}", column), params));
         return this;
     }
 
@@ -229,7 +331,22 @@ public abstract class Wrapper<T> implements Serializable {
      * @return
      */
     public Wrapper<T> ge(String column, Object params) {
-        sql.WHERE(formatSql(String.format("%s >= {0}", column), params));
+        return ge(true, column, params);
+    }
+
+    /**
+     * <p>
+     * 等同于SQL的"field<value"表达式
+     * </p>
+     *
+     * @param isAdd
+     * @param column
+     * @param params
+     * @return
+     */
+    public Wrapper<T> lt(boolean isAdd, String column, Object params) {
+        if (isAdd)
+            sql.WHERE(formatSql(String.format("%s < {0}", column), params));
         return this;
     }
 
@@ -243,7 +360,22 @@ public abstract class Wrapper<T> implements Serializable {
      * @return
      */
     public Wrapper<T> lt(String column, Object params) {
-        sql.WHERE(formatSql(String.format("%s < {0}", column), params));
+        return lt(true, column, params);
+    }
+
+    /**
+     * <p>
+     * 等同于SQL的"field<=value"表达式
+     * </p>
+     *
+     * @param isAdd
+     * @param column
+     * @param params
+     * @return
+     */
+    public Wrapper<T> le(boolean isAdd, String column, Object params) {
+        if (isAdd)
+            sql.WHERE(formatSql(String.format("%s <= {0}", column), params));
         return this;
     }
 
@@ -257,7 +389,22 @@ public abstract class Wrapper<T> implements Serializable {
      * @return
      */
     public Wrapper<T> le(String column, Object params) {
-        sql.WHERE(formatSql(String.format("%s <= {0}", column), params));
+        return le(true, column, params);
+    }
+
+    /**
+     * <p>
+     * AND 连接后续条件
+     * </p>
+     *
+     * @param isAdd
+     * @param sqlAnd and条件语句
+     * @param params 参数集
+     * @return this
+     */
+    public Wrapper<T> and(boolean isAdd, String sqlAnd, Object... params) {
+        if (isAdd)
+            sql.AND().WHERE(formatSql(sqlAnd, params));
         return this;
     }
 
@@ -271,7 +418,26 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> and(String sqlAnd, Object... params) {
-        sql.AND().WHERE(formatSql(sqlAnd, params));
+        return and(true, sqlAnd, params);
+    }
+
+    /**
+     * <p>
+     * 使用AND连接并换行
+     * </p>
+     * <p>
+     * eg: ew.where("name='zhangsan'").and("id=11").andNew("statu=1"); 输出: WHERE
+     * (name='zhangsan' AND id=11) AND (statu=1)
+     * </p>
+     *
+     * @param isAdd
+     * @param sqlAnd AND 条件语句
+     * @param params 参数值
+     * @return this
+     */
+    public Wrapper<T> andNew(boolean isAdd, String sqlAnd, Object... params) {
+        if (isAdd)
+            sql.AND_NEW().WHERE(formatSql(sqlAnd, params));
         return this;
     }
 
@@ -289,8 +455,7 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> andNew(String sqlAnd, Object... params) {
-        sql.AND_NEW().WHERE(formatSql(sqlAnd, params));
-        return this;
+        return andNew(true, sqlAnd, params);
     }
 
     /**
@@ -318,6 +483,26 @@ public abstract class Wrapper<T> implements Serializable {
         return this;
     }
 
+    /**
+     * <p>
+     * 添加OR条件
+     * </p>
+     *
+     * @param isAdd
+     * @param sqlOr  or 条件语句
+     * @param params 参数集
+     * @return this
+     */
+    public Wrapper<T> or(boolean isAdd, String sqlOr, Object... params) {
+        if (isAdd) {
+            if (StringUtils.isEmpty(sql.toString())) {
+                AND_OR = "OR";
+            }
+            sql.OR().WHERE(formatSql(sqlOr, params));
+        }
+        return this;
+    }
+
     /**
      * <p>
      * 添加OR条件
@@ -328,10 +513,30 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> or(String sqlOr, Object... params) {
-        if (StringUtils.isEmpty(sql.toString())) {
-            AND_OR = "OR";
+        return or(true, sqlOr, params);
+    }
+
+    /**
+     * <p>
+     * 使用OR换行,并添加一个带()的新的条件
+     * </p>
+     * <p>
+     * eg: ew.where("name='zhangsan'").and("id=11").orNew("statu=1"); 输出: WHERE
+     * (name='zhangsan' AND id=11) OR (statu=1)
+     * </p>
+     *
+     * @param isAdd
+     * @param sqlOr  AND 条件语句
+     * @param params 参数值
+     * @return this
+     */
+    public Wrapper<T> orNew(boolean isAdd, String sqlOr, Object... params) {
+        if (isAdd) {
+            if (StringUtils.isEmpty(sql.toString())) {
+                AND_OR = "OR";
+            }
+            sql.OR_NEW().WHERE(formatSql(sqlOr, params));
         }
-        sql.OR().WHERE(formatSql(sqlOr, params));
         return this;
     }
 
@@ -349,10 +554,24 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> orNew(String sqlOr, Object... params) {
-        if (StringUtils.isEmpty(sql.toString())) {
-            AND_OR = "OR";
-        }
-        sql.OR_NEW().WHERE(formatSql(sqlOr, params));
+        return orNew(true, sqlOr, params);
+    }
+
+    /**
+     * <p>
+     * SQL中groupBy关键字跟的条件语句
+     * </p>
+     * <p>
+     * eg: ew.where("name='zhangsan'").groupBy("id,name")
+     * </p>
+     *
+     * @param isAdd
+     * @param columns SQL 中的 Group by 语句,无需输入 Group By 关键字
+     * @return this
+     */
+    public Wrapper<T> groupBy(boolean isAdd, String columns) {
+        if (isAdd)
+            sql.GROUP_BY(columns);
         return this;
     }
 
@@ -368,7 +587,25 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> groupBy(String columns) {
-        sql.GROUP_BY(columns);
+        return groupBy(true, columns);
+    }
+
+    /**
+     * <p>
+     * SQL中having关键字跟的条件语句
+     * </p>
+     * <p>
+     * eg: ew.groupBy("id,name").having("id={0}",22).and("password is not null")
+     * </p>
+     *
+     * @param isAdd
+     * @param sqlHaving having关键字后面跟随的语句
+     * @param params    参数集
+     * @return EntityWrapper<T>
+     */
+    public Wrapper<T> having(boolean isAdd, String sqlHaving, Object... params) {
+        if (isAdd)
+            sql.HAVING(formatSql(sqlHaving, params));
         return this;
     }
 
@@ -385,7 +622,25 @@ public abstract class Wrapper<T> implements Serializable {
      * @return EntityWrapper<T>
      */
     public Wrapper<T> having(String sqlHaving, Object... params) {
-        sql.HAVING(formatSql(sqlHaving, params));
+        return having(true, sqlHaving, params);
+    }
+
+    /**
+     * <p>
+     * SQL中orderby关键字跟的条件语句
+     * </p>
+     * <p>
+     * eg: ew.groupBy("id,name").having("id={0}",22).and("password is not null"
+     * ).orderBy("id,name")
+     * </p>
+     *
+     * @param isAdd
+     * @param columns SQL 中的 order by 语句,无需输入 Order By 关键字
+     * @return this
+     */
+    public Wrapper<T> orderBy(boolean isAdd, String columns) {
+        if (isAdd)
+            sql.ORDER_BY(columns);
         return this;
     }
 
@@ -402,8 +657,7 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> orderBy(String columns) {
-        sql.ORDER_BY(columns);
-        return this;
+        return orderBy(true, columns);
     }
 
     /**
@@ -415,13 +669,40 @@ public abstract class Wrapper<T> implements Serializable {
      * @param isAsc   是否为升序
      * @return this
      */
-    public Wrapper<T> orderBy(String columns, boolean isAsc) {
-        if (StringUtils.isNotEmpty(columns)) {
+    public Wrapper<T> orderBy(boolean isAdd, String columns, boolean isAsc) {
+        if (isAdd && StringUtils.isNotEmpty(columns)) {
             sql.ORDER_BY(columns + (isAsc ? " ASC" : " DESC"));
         }
         return this;
     }
 
+    /**
+     * <p>
+     * SQL中orderby关键字跟的条件语句,可根据变更动态排序
+     * </p>
+     *
+     * @param columns SQL 中的 order by 语句,无需输入 Order By 关键字
+     * @param isAsc   是否为升序
+     * @return this
+     */
+    public Wrapper<T> orderBy(String columns, boolean isAsc) {
+        return orderBy(true, columns, isAsc);
+    }
+
+    /**
+     * LIKE条件语句,value中无需前后%
+     *
+     * @param isAdd
+     * @param column 字段名称
+     * @param value  匹配值
+     * @return this
+     */
+    public Wrapper<T> like(boolean isAdd, String column, String value) {
+        if (isAdd)
+            handerLike(column, value, SqlLike.DEFAULT, false);
+        return this;
+    }
+
     /**
      * LIKE条件语句,value中无需前后%
      *
@@ -430,7 +711,20 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> like(String column, String value) {
-        handerLike(column, value, SqlLike.DEFAULT, false);
+        return like(true, column, value);
+    }
+
+    /**
+     * NOT LIKE条件语句,value中无需前后%
+     *
+     * @param isAdd
+     * @param column 字段名称
+     * @param value  匹配值
+     * @return this
+     */
+    public Wrapper<T> notLike(boolean isAdd, String column, String value) {
+        if (isAdd)
+            handerLike(column, value, SqlLike.DEFAULT, true);
         return this;
     }
 
@@ -442,8 +736,7 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> notLike(String column, String value) {
-        handerLike(column, value, SqlLike.DEFAULT, true);
-        return this;
+        return notLike(true, column, value);
     }
 
     /**
@@ -465,6 +758,21 @@ public abstract class Wrapper<T> implements Serializable {
         }
     }
 
+    /**
+     * LIKE条件语句,value中无需前后%
+     *
+     * @param isAdd
+     * @param column 字段名称
+     * @param value  匹配值
+     * @param type
+     * @return this
+     */
+    public Wrapper<T> like(boolean isAdd, String column, String value, SqlLike type) {
+        if (isAdd)
+            handerLike(column, value, type, false);
+        return this;
+    }
+
     /**
      * LIKE条件语句,value中无需前后%
      *
@@ -474,7 +782,21 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> like(String column, String value, SqlLike type) {
-        handerLike(column, value, type, false);
+        return like(true, column, value, type);
+    }
+
+    /**
+     * NOT LIKE条件语句,value中无需前后%
+     *
+     * @param isAdd
+     * @param column 字段名称
+     * @param value  匹配值
+     * @param type
+     * @return this
+     */
+    public Wrapper<T> notLike(boolean isAdd, String column, String value, SqlLike type) {
+        if (isAdd)
+            handerLike(column, value, type, true);
         return this;
     }
 
@@ -487,7 +809,19 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> notLike(String column, String value, SqlLike type) {
-        handerLike(column, value, type, true);
+        return notLike(true, column, value, type);
+    }
+
+    /**
+     * is not null 条件
+     *
+     * @param isAdd
+     * @param columns 字段名称。多个字段以逗号分隔。
+     * @return this
+     */
+    public Wrapper<T> isNotNull(boolean isAdd, String columns) {
+        if (isAdd)
+            sql.IS_NOT_NULL(columns);
         return this;
     }
 
@@ -498,7 +832,19 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> isNotNull(String columns) {
-        sql.IS_NOT_NULL(columns);
+        return isNotNull(true, columns);
+    }
+
+    /**
+     * is not null 条件
+     *
+     * @param isAdd
+     * @param columns 字段名称。多个字段以逗号分隔。
+     * @return this
+     */
+    public Wrapper<T> isNull(boolean isAdd, String columns) {
+        if (isAdd)
+            sql.IS_NULL(columns);
         return this;
     }
 
@@ -509,7 +855,19 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> isNull(String columns) {
-        sql.IS_NULL(columns);
+        return isNull(true, columns);
+    }
+
+    /**
+     * EXISTS 条件语句,目前适配mysql及oracle
+     *
+     * @param isAdd
+     * @param value 匹配值
+     * @return this
+     */
+    public Wrapper<T> exists(boolean isAdd, String value) {
+        if (isAdd)
+            sql.EXISTS(value);
         return this;
     }
 
@@ -520,7 +878,19 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> exists(String value) {
-        sql.EXISTS(value);
+        return exists(true, value);
+    }
+
+    /**
+     * NOT EXISTS条件语句
+     *
+     * @param isAdd
+     * @param value 匹配值
+     * @return this
+     */
+    public Wrapper<T> notExists(boolean isAdd, String value) {
+        if (isAdd)
+            sql.NOT_EXISTS(value);
         return this;
     }
 
@@ -531,90 +901,161 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> notExists(String value) {
-        sql.NOT_EXISTS(value);
-        return this;
+        return notExists(true, value);
     }
 
     /**
      * IN 条件语句,目前适配mysql及oracle
      *
+     * @param isAdd
      * @param column 字段名称
      * @param value  逗号拼接的字符串
      * @return this
      */
-    public Wrapper<T> in(String column, String value) {
-        if (StringUtils.isNotEmpty(value)) {
+    public Wrapper<T> in(boolean isAdd, String column, String value) {
+        if (isAdd && StringUtils.isNotEmpty(value)) {
             in(column, StringUtils.splitWorker(value, ",", -1, false));
         }
         return this;
     }
 
+    /**
+     * IN 条件语句,目前适配mysql及oracle
+     *
+     * @param column 字段名称
+     * @param value  逗号拼接的字符串
+     * @return this
+     */
+    public Wrapper<T> in(String column, String value) {
+        return in(true, column, value);
+    }
+
     /**
      * NOT IN条件语句
      *
+     * @param isAdd
      * @param column 字段名称
      * @param value  逗号拼接的字符串
      * @return this
      */
-    public Wrapper<T> notIn(String column, String value) {
-        if (StringUtils.isNotEmpty(value)) {
+    public Wrapper<T> notIn(boolean isAdd, String column, String value) {
+        if (isAdd && StringUtils.isNotEmpty(value)) {
             notIn(column, StringUtils.splitWorker(value, ",", -1, false));
         }
         return this;
     }
 
+    /**
+     * NOT IN条件语句
+     *
+     * @param column 字段名称
+     * @param value  逗号拼接的字符串
+     * @return this
+     */
+    public Wrapper<T> notIn(String column, String value) {
+        return notIn(true, column, value);
+    }
+
     /**
      * IN 条件语句,目前适配mysql及oracle
      *
+     * @param isAdd
      * @param column 字段名称
      * @param value  匹配值 List集合
      * @return this
      */
-    public Wrapper<T> in(String column, Collection<?> value) {
-        if (CollectionUtils.isNotEmpty(value))
+    public Wrapper<T> in(boolean isAdd, String column, Collection<?> value) {
+        if (isAdd && CollectionUtils.isNotEmpty(value))
             sql.WHERE(formatSql(inExpression(column, value, false), value.toArray()));
         return this;
     }
 
+    /**
+     * IN 条件语句,目前适配mysql及oracle
+     *
+     * @param column 字段名称
+     * @param value  匹配值 List集合
+     * @return this
+     */
+    public Wrapper<T> in(String column, Collection<?> value) {
+        return in(true, column, value);
+    }
+
     /**
      * NOT IN 条件语句,目前适配mysql及oracle
      *
+     * @param isAdd
      * @param column 字段名称
      * @param value  匹配值 List集合
      * @return this
      */
-    public Wrapper<T> notIn(String column, Collection<?> value) {
-        if (CollectionUtils.isNotEmpty(value))
+    public Wrapper<T> notIn(boolean isAdd, String column, Collection<?> value) {
+        if (isAdd && CollectionUtils.isNotEmpty(value))
             sql.WHERE(formatSql(inExpression(column, value, true), value.toArray()));
         return this;
     }
 
+    /**
+     * NOT IN 条件语句,目前适配mysql及oracle
+     *
+     * @param column 字段名称
+     * @param value  匹配值 List集合
+     * @return this
+     */
+    public Wrapper<T> notIn(String column, Collection<?> value) {
+        return notIn(true, column, value);
+    }
+
     /**
      * IN 条件语句,目前适配mysql及oracle
      *
+     * @param isAdd
      * @param column 字段名称
      * @param value  匹配值 object数组
      * @return this
      */
-    public Wrapper<T> in(String column, Object[] value) {
-        if (ArrayUtils.isNotEmpty(value))
+    public Wrapper<T> in(boolean isAdd, String column, Object[] value) {
+        if (isAdd && ArrayUtils.isNotEmpty(value))
             sql.WHERE(formatSql(inExpression(column, Arrays.asList(value), false), value));
         return this;
     }
 
+    /**
+     * IN 条件语句,目前适配mysql及oracle
+     *
+     * @param column 字段名称
+     * @param value  匹配值 object数组
+     * @return this
+     */
+    public Wrapper<T> in(String column, Object[] value) {
+        return in(true, column, value);
+    }
+
     /**
      * NOT IN 条件语句,目前适配mysql及oracle
      *
+     * @param isAdd
      * @param column 字段名称
      * @param value  匹配值 object数组
      * @return this
      */
-    public Wrapper<T> notIn(String column, Object... value) {
-        if (ArrayUtils.isNotEmpty(value))
+    public Wrapper<T> notIn(boolean isAdd, String column, Object... value) {
+        if (isAdd && ArrayUtils.isNotEmpty(value))
             sql.WHERE(formatSql(inExpression(column, Arrays.asList(value), true), value));
         return this;
     }
 
+    /**
+     * NOT IN 条件语句,目前适配mysql及oracle
+     *
+     * @param column 字段名称
+     * @param value  匹配值 object数组
+     * @return this
+     */
+    public Wrapper<T> notIn(String column, Object... value) {
+        return notIn(true, column, value);
+    }
+
     /**
      * 获取in表达式
      *
@@ -644,6 +1085,21 @@ public abstract class Wrapper<T> implements Serializable {
         return null;
     }
 
+    /**
+     * betwwee 条件语句
+     *
+     * @param isAdd
+     * @param column 字段名称
+     * @param val1
+     * @param val2
+     * @return this
+     */
+    public Wrapper<T> between(boolean isAdd, String column, Object val1, Object val2) {
+        if (isAdd)
+            sql.WHERE(formatSql(String.format("%s BETWEEN {0} AND {1}", column), val1, val2));
+        return this;
+    }
+
     /**
      * betwwee 条件语句
      *
@@ -653,7 +1109,21 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> between(String column, Object val1, Object val2) {
-        sql.WHERE(formatSql(String.format("%s BETWEEN {0} AND {1}", column), val1, val2));
+        return between(true, column, val1, val2);
+    }
+
+    /**
+     * NOT betwwee 条件语句
+     *
+     * @param isAdd
+     * @param column 字段名称
+     * @param val1
+     * @param val2
+     * @return this
+     */
+    public Wrapper<T> notBetween(boolean isAdd, String column, Object val1, Object val2) {
+        if (isAdd)
+            sql.WHERE(formatSql(String.format("%s NOT BETWEEN {0} AND {1}", column), val1, val2));
         return this;
     }
 
@@ -666,8 +1136,8 @@ public abstract class Wrapper<T> implements Serializable {
      * @return this
      */
     public Wrapper<T> notBetween(String column, Object val1, Object val2) {
-        sql.WHERE(formatSql(String.format("%s NOT BETWEEN {0} AND {1}", column), val1, val2));
-        return this;
+        return notBetween(true, column, val1, val2);
+
     }
 
     /**
@@ -730,7 +1200,7 @@ public abstract class Wrapper<T> implements Serializable {
      * <p>
      * 根据需要格式化SQL<BR>
      * <BR>
-     * Format SQL for methods: EntityWrapper.where/and/or...("name={0}", value);
+     * Format SQL for methods: EntityWrapper<T>.where/and/or...("name={0}", value);
      * ALL the {<b>i</b>} will be replaced with #{MPGENVAL<b>i</b>}<BR>
      * <BR>
      * ew.where("sample_name=<b>{0}</b>", "haha").and("sample_age &gt;<b>{0}</b>