瀏覽代碼

完善EntityWrapper(感谢D.Yang提出的BETWEEN AND)

Caratacus 8 年之前
父節點
當前提交
c13988400c

+ 467 - 421
mybatis-plus/src/main/java/com/baomidou/mybatisplus/mapper/EntityWrapper.java

@@ -33,58 +33,58 @@ import java.util.List;
 @SuppressWarnings("serial")
 public class EntityWrapper<T> implements Serializable {
 
-    /**
-     * 数据库表映射实体类
-     */
-    protected T entity = null;
-
-    /**
-     * SQL 查询字段内容,例如:id,name,age
-     */
-    protected String sqlSelect = null;
-
-    /**
-     * 实现了TSQL语法的SQL实体
-     */
-    protected TSqlPlus sql = new TSqlPlus();
-
-    public EntityWrapper() {
-        /* 注意,传入查询参数 */
-    }
-
-    public EntityWrapper(T entity) {
-        this.entity = entity;
-    }
-
-    public EntityWrapper(T entity, String sqlSelect) {
-        this.entity = entity;
-        this.sqlSelect = sqlSelect;
-    }
-
-    public T getEntity() {
-        return entity;
-    }
-
-    public void setEntity(T entity) {
-        this.entity = entity;
-    }
-
-    public String getSqlSelect() {
-        if (StringUtils.isEmpty(sqlSelect)) {
-            return null;
-        }
-        return stripSqlInjection(sqlSelect);
-    }
-
-    public void setSqlSelect(String sqlSelect) {
-        if (StringUtils.isNotEmpty(sqlSelect)) {
-            this.sqlSelect = sqlSelect;
-        }
-    }
-
-    /**
-     * SQL 片段
-     */
+	/**
+	 * 数据库表映射实体类
+	 */
+	protected T entity = null;
+
+	/**
+	 * SQL 查询字段内容,例如:id,name,age
+	 */
+	protected String sqlSelect = null;
+
+	/**
+	 * 实现了TSQL语法的SQL实体
+	 */
+	protected TSqlPlus sql = new TSqlPlus();
+
+	public EntityWrapper() {
+		/* 注意,传入查询参数 */
+	}
+
+	public EntityWrapper(T entity) {
+		this.entity = entity;
+	}
+
+	public EntityWrapper(T entity, String sqlSelect) {
+		this.entity = entity;
+		this.sqlSelect = sqlSelect;
+	}
+
+	public T getEntity() {
+		return entity;
+	}
+
+	public void setEntity(T entity) {
+		this.entity = entity;
+	}
+
+	public String getSqlSelect() {
+		if (StringUtils.isEmpty(sqlSelect)) {
+			return null;
+		}
+		return stripSqlInjection(sqlSelect);
+	}
+
+	public void setSqlSelect(String sqlSelect) {
+		if (StringUtils.isNotEmpty(sqlSelect)) {
+			this.sqlSelect = sqlSelect;
+		}
+	}
+
+	/**
+	 * SQL 片段
+	 */
 	public String getSqlSegment() {
 		/*
 		 * 无条件
@@ -105,377 +105,423 @@ public class EntityWrapper<T> implements Serializable {
 		return stripSqlInjection(sqlWhere);
 	}
 
-    /**
-     * <p>
-     * SQL中WHERE关键字跟的条件语句
-     * </p>
-     * <p>
-     * eg: ew.where("name='zhangsan'").where("id={0}","123");
-     * <p>
-     * 输出: WHERE (NAME='zhangsan' AND id=123)
-     * </p>
-     *
-     * @param sqlWhere where语句
-     * @param params   参数集
-     * @return this
-     */
-    public EntityWrapper<T> where(String sqlWhere, Object... params) {
-        sql.WHERE(formatSql(sqlWhere, params));
-        return this;
-    }
-
-    /**
-     * <p>
-     * AND 连接后续条件
-     * </p>
-     *
-     * @param sqlAnd and条件语句
-     * @param params 参数集
-     * @return this
-     */
-    public EntityWrapper<T> and(String sqlAnd, Object... params) {
-        sql.AND().WHERE(formatSql(sqlAnd, params));
-        return this;
-    }
-
-    /**
-     * <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 sqlAnd AND 条件语句
-     * @param params 参数值
-     * @return this
-     */
-    public EntityWrapper<T> andNew(String sqlAnd, Object... params) {
-        sql.AND_NEW().WHERE(formatSql(sqlAnd, params));
-        return this;
-    }
-
-    /**
-     * <p>
-     * 添加OR条件
-     * </p>
-     *
-     * @param sqlOr  or 条件语句
-     * @param params 参数集
-     * @return this
-     */
-    public EntityWrapper<T> or(String sqlOr, Object... params) {
-        sql.OR().WHERE(formatSql(sqlOr, params));
-        return this;
-    }
-
-    /**
-     * <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 sqlOr  AND 条件语句
-     * @param params 参数值
-     * @return this
-     */
-    public EntityWrapper<T> orNew(String sqlOr, Object... params) {
-        sql.OR_NEW().WHERE(formatSql(sqlOr, params));
-        return this;
-    }
-
-    /**
-     * <p>
-     * SQL中groupBy关键字跟的条件语句
-     * </p>
-     * <p>
-     * eg: ew.where("name='zhangsan'").groupBy("id,name")
-     * </p>
-     *
-     * @param columns SQL 中的 Group by 语句,无需输入 Group By 关键字
-     * @return this
-     */
-    public EntityWrapper<T> groupBy(String columns) {
-        sql.GROUP_BY(columns);
-        return this;
-    }
-
-    /**
-     * <p>
-     * SQL中having关键字跟的条件语句
-     * </p>
-     * <p>
-     * eg: ew.groupBy("id,name").having("id={0}",22).and("password is not null")
-     * </p>
-     *
-     * @param sqlHaving having关键字后面跟随的语句
-     * @param params    参数集
-     * @return EntityWrapper
-     */
-    public EntityWrapper<T> having(String sqlHaving, Object... params) {
-        sql.HAVING(formatSql(sqlHaving, params));
-        return this;
-    }
-
-    /**
-     * <p>
-     * SQL中orderby关键字跟的条件语句
-     * </p>
-     * <p>
-     * eg: ew.groupBy("id,name").having("id={0}",22).and("password is not null"
-     * ).orderBy("id,name")
-     * </p>
-     *
-     * @param columns SQL 中的 order by 语句,无需输入 Order By 关键字
-     * @return this
-     */
-    public EntityWrapper<T> orderBy(String columns) {
-        sql.ORDER_BY(columns);
-        return this;
-    }
-
-    /**
-     * <p>
-     * SQL中orderby关键字跟的条件语句,可根据变更动态排序
-     * </p>
-     *
-     * @param columns SQL 中的 order by 语句,无需输入 Order By 关键字
-     * @param isAsc   是否为升序
-     * @return this
-     */
-    public EntityWrapper<T> orderBy(String columns, boolean isAsc) {
-        if (StringUtils.isNotEmpty(columns)) {
-            sql.ORDER_BY(columns + (isAsc ? " ASC" : " DESC"));
-        }
-        return this;
-    }
-
-    /**
-     * LIKE条件语句,value中无需前后% 目前适配mysql及oracle
-     *
-     * @param column 字段名称
-     * @param value  匹配值
-     * @return this
-     */
-    public EntityWrapper<T> like(String column, String value) {
-        sql.LIKE(column, value);
-        return this;
-    }
-
-    /**
-     * NOT LIKE条件语句,value中无需前后% 目前适配mysql及oracle
-     *
-     * @param column 字段名称
-     * @param value  匹配值
-     * @return this
-     */
-    public EntityWrapper<T> notLike(String column, String value) {
-        sql.NOT_LIKE(column, value);
-        return this;
-    }
-
-    /**
-     * is not null 条件
-     *
-     * @param columns 字段名称。多个字段以逗号分隔。
-     * @return this
-     */
-    public EntityWrapper<T> isNotNull(String columns) {
-        sql.IS_NOT_NULL(columns);
-        return this;
-    }
-
-    /**
-     * is not null 条件
-     *
-     * @param columns 字段名称。多个字段以逗号分隔。
-     * @return this
-     */
-    public EntityWrapper<T> isNull(String columns) {
-        sql.IS_NULL(columns);
-        return this;
-    }
-
-    /**
-     * EXISTS 条件语句,目前适配mysql及oracle
-     *
-     * @param value
-     *            匹配值
-     * @return this
-     */
-    public EntityWrapper<T> exists(String value) {
-        sql.EXISTS(value);
-        return this;
-    }
-
-    /**
-     * NOT EXISTS条件语句
-     *
-     * @param value
-     *            匹配值
-     * @return this
-     */
-    public EntityWrapper<T> notExists(String value) {
-        sql.NOT_EXISTS(value);
-        return this;
-    }
-
-    /**
-     * IN 条件语句,目前适配mysql及oracle
-     *
-     * @param column
-     *            字段名称
-     * @param value
-     *            逗号拼接的字符串
-     * @return this
-     */
-    public EntityWrapper<T> in(String column, String value) {
-        sql.IN(column, value);
-        return this;
-    }
-
-    /**
-     * NOT IN条件语句
-     *
-     * @param column
-     *            字段名称
-     * @param value
-     *            逗号拼接的字符串
-     * @return this
-     */
-    public EntityWrapper<T> notIn(String column, String value) {
-        sql.NOT_IN(column, value);
-        return this;
-    }
-
-    /**
-     * IN 条件语句,目前适配mysql及oracle
-     *
-     * @param column
-     *            字段名称
-     * @param value
-     *            匹配值 List集合
-     * @return this
-     */
-    public EntityWrapper<T> in(String column, List<?> value) {
-        sql.IN(column, value);
-        return this;
-    }
-
-    /**
-     * NOT IN 条件语句,目前适配mysql及oracle
-     *
-     * @param column
-     *            字段名称
-     * @param value
-     *            匹配值 List集合
-     * @return this
-     */
-    public EntityWrapper<T> notIn(String column, List<?> value) {
-        sql.NOT_IN(column, value);
-        return this;
-    }
-
-
-    /**
-     * 为了兼容之前的版本,可使用where()或and()替代
-     *
-     * @param sqlWhere where sql部分
-     * @param params   参数集
-     * @return this
-     */
-    public EntityWrapper<T> addFilter(String sqlWhere, Object... params) {
-        return and(sqlWhere, params);
-    }
-
-    /**
-     * <p>
-     * 根据判断条件来添加条件语句部分 使用 andIf() 替代
-     * </p>
-     * <p>
-     * eg: ew.filterIfNeed(false,"name='zhangsan'").where("name='zhangsan'")
-     * .filterIfNeed(true,"id={0}",22)
-     * <p>
-     * 输出: WHERE (name='zhangsan' AND id=22)
-     * </p>
-     *
-     * @param need     是否需要添加该条件
-     * @param sqlWhere 条件语句
-     * @param params   参数集
-     * @return this
-     */
-    public EntityWrapper<T> addFilterIfNeed(boolean need, String sqlWhere, Object... params) {
-        return need ? where(sqlWhere, params) : this;
-    }
-
-    /**
-     * <p>
-     * SQL注入内容剥离
-     * </p>
-     *
-     * @param value 待处理内容
-     * @return this
-     */
-    protected String stripSqlInjection(String value) {
-        return value.replaceAll("('.+--)|(--)|(\\|)|(%7C)", "");
-    }
-
-
-    /**
-     * <p>
-     * 格式化SQL
-     * </p>
-     *
-     * @param sqlStr SQL语句部分
-     * @param params 参数集
-     * @return this
-     */
-    protected String formatSql(String sqlStr, Object... params) {
-        return formatSqlIfNeed(true, sqlStr, params);
-    }
-
-    /**
-     * <p>
-     * 根据需要格式化SQL
-     * </p>
-     *
-     * @param need   是否需要格式化
-     * @param sqlStr SQL语句部分
-     * @param params 参数集
-     * @return this
-     */
-    protected String formatSqlIfNeed(boolean need, String sqlStr, Object... params) {
-        if (!need || StringUtils.isEmpty(sqlStr)) {
-            return null;
-        }
-        if (null != params) {
-        	int length = params.length;
+	/**
+	 * <p>
+	 * SQL中WHERE关键字跟的条件语句
+	 * </p>
+	 * <p>
+	 * eg: ew.where("name='zhangsan'").where("id={0}","123");
+	 * <p>
+	 * 输出: WHERE (NAME='zhangsan' AND id=123)
+	 * </p>
+	 *
+	 * @param sqlWhere
+	 *            where语句
+	 * @param params
+	 *            参数集
+	 * @return this
+	 */
+	public EntityWrapper<T> where(String sqlWhere, Object... params) {
+		sql.WHERE(formatSql(sqlWhere, params));
+		return this;
+	}
+
+	/**
+	 * <p>
+	 * AND 连接后续条件
+	 * </p>
+	 *
+	 * @param sqlAnd
+	 *            and条件语句
+	 * @param params
+	 *            参数集
+	 * @return this
+	 */
+	public EntityWrapper<T> and(String sqlAnd, Object... params) {
+		sql.AND().WHERE(formatSql(sqlAnd, params));
+		return this;
+	}
+
+	/**
+	 * <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 sqlAnd
+	 *            AND 条件语句
+	 * @param params
+	 *            参数值
+	 * @return this
+	 */
+	public EntityWrapper<T> andNew(String sqlAnd, Object... params) {
+		sql.AND_NEW().WHERE(formatSql(sqlAnd, params));
+		return this;
+	}
+
+	/**
+	 * <p>
+	 * 添加OR条件
+	 * </p>
+	 *
+	 * @param sqlOr
+	 *            or 条件语句
+	 * @param params
+	 *            参数集
+	 * @return this
+	 */
+	public EntityWrapper<T> or(String sqlOr, Object... params) {
+		sql.OR().WHERE(formatSql(sqlOr, params));
+		return this;
+	}
+
+	/**
+	 * <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 sqlOr
+	 *            AND 条件语句
+	 * @param params
+	 *            参数值
+	 * @return this
+	 */
+	public EntityWrapper<T> orNew(String sqlOr, Object... params) {
+		sql.OR_NEW().WHERE(formatSql(sqlOr, params));
+		return this;
+	}
+
+	/**
+	 * <p>
+	 * SQL中groupBy关键字跟的条件语句
+	 * </p>
+	 * <p>
+	 * eg: ew.where("name='zhangsan'").groupBy("id,name")
+	 * </p>
+	 *
+	 * @param columns
+	 *            SQL 中的 Group by 语句,无需输入 Group By 关键字
+	 * @return this
+	 */
+	public EntityWrapper<T> groupBy(String columns) {
+		sql.GROUP_BY(columns);
+		return this;
+	}
+
+	/**
+	 * <p>
+	 * SQL中having关键字跟的条件语句
+	 * </p>
+	 * <p>
+	 * eg: ew.groupBy("id,name").having("id={0}",22).and("password is not null")
+	 * </p>
+	 *
+	 * @param sqlHaving
+	 *            having关键字后面跟随的语句
+	 * @param params
+	 *            参数集
+	 * @return EntityWrapper
+	 */
+	public EntityWrapper<T> having(String sqlHaving, Object... params) {
+		sql.HAVING(formatSql(sqlHaving, params));
+		return this;
+	}
+
+	/**
+	 * <p>
+	 * SQL中orderby关键字跟的条件语句
+	 * </p>
+	 * <p>
+	 * eg: ew.groupBy("id,name").having("id={0}",22).and("password is not null"
+	 * ).orderBy("id,name")
+	 * </p>
+	 *
+	 * @param columns
+	 *            SQL 中的 order by 语句,无需输入 Order By 关键字
+	 * @return this
+	 */
+	public EntityWrapper<T> orderBy(String columns) {
+		sql.ORDER_BY(columns);
+		return this;
+	}
+
+	/**
+	 * <p>
+	 * SQL中orderby关键字跟的条件语句,可根据变更动态排序
+	 * </p>
+	 *
+	 * @param columns
+	 *            SQL 中的 order by 语句,无需输入 Order By 关键字
+	 * @param isAsc
+	 *            是否为升序
+	 * @return this
+	 */
+	public EntityWrapper<T> orderBy(String columns, boolean isAsc) {
+		if (StringUtils.isNotEmpty(columns)) {
+			sql.ORDER_BY(columns + (isAsc ? " ASC" : " DESC"));
+		}
+		return this;
+	}
+
+	/**
+	 * LIKE条件语句,value中无需前后% 目前适配mysql及oracle
+	 *
+	 * @param column
+	 *            字段名称
+	 * @param value
+	 *            匹配值
+	 * @return this
+	 */
+	public EntityWrapper<T> like(String column, String value) {
+		sql.LIKE(column, value);
+		return this;
+	}
+
+	/**
+	 * NOT LIKE条件语句,value中无需前后% 目前适配mysql及oracle
+	 *
+	 * @param column
+	 *            字段名称
+	 * @param value
+	 *            匹配值
+	 * @return this
+	 */
+	public EntityWrapper<T> notLike(String column, String value) {
+		sql.NOT_LIKE(column, value);
+		return this;
+	}
+
+	/**
+	 * is not null 条件
+	 *
+	 * @param columns
+	 *            字段名称。多个字段以逗号分隔。
+	 * @return this
+	 */
+	public EntityWrapper<T> isNotNull(String columns) {
+		sql.IS_NOT_NULL(columns);
+		return this;
+	}
+
+	/**
+	 * is not null 条件
+	 *
+	 * @param columns
+	 *            字段名称。多个字段以逗号分隔。
+	 * @return this
+	 */
+	public EntityWrapper<T> isNull(String columns) {
+		sql.IS_NULL(columns);
+		return this;
+	}
+
+	/**
+	 * EXISTS 条件语句,目前适配mysql及oracle
+	 *
+	 * @param value
+	 *            匹配值
+	 * @return this
+	 */
+	public EntityWrapper<T> exists(String value) {
+		sql.EXISTS(value);
+		return this;
+	}
+
+	/**
+	 * NOT EXISTS条件语句
+	 *
+	 * @param value
+	 *            匹配值
+	 * @return this
+	 */
+	public EntityWrapper<T> notExists(String value) {
+		sql.NOT_EXISTS(value);
+		return this;
+	}
+
+	/**
+	 * IN 条件语句,目前适配mysql及oracle
+	 *
+	 * @param column
+	 *            字段名称
+	 * @param value
+	 *            逗号拼接的字符串
+	 * @return this
+	 */
+	public EntityWrapper<T> in(String column, String value) {
+		sql.IN(column, value);
+		return this;
+	}
+
+	/**
+	 * NOT IN条件语句
+	 *
+	 * @param column
+	 *            字段名称
+	 * @param value
+	 *            逗号拼接的字符串
+	 * @return this
+	 */
+	public EntityWrapper<T> notIn(String column, String value) {
+		sql.NOT_IN(column, value);
+		return this;
+	}
+
+	/**
+	 * IN 条件语句,目前适配mysql及oracle
+	 *
+	 * @param column
+	 *            字段名称
+	 * @param value
+	 *            匹配值 List集合
+	 * @return this
+	 */
+	public EntityWrapper<T> in(String column, List<?> value) {
+		sql.IN(column, value);
+		return this;
+	}
+
+	/**
+	 * NOT IN 条件语句,目前适配mysql及oracle
+	 *
+	 * @param column
+	 *            字段名称
+	 * @param value
+	 *            匹配值 List集合
+	 * @return this
+	 */
+	public EntityWrapper<T> notIn(String column, List<?> value) {
+		sql.NOT_IN(column, value);
+		return this;
+	}
+
+	/**
+	 * betwwee 条件语句
+	 *
+	 * @param column
+	 *            字段名称
+	 * @param val1
+	 * @param val2
+	 * @return this
+	 */
+	public EntityWrapper<T> between(String column, String val1, String val2) {
+		sql.BETWEEN_AND(column, val1, val2);
+		return this;
+	}
+
+	/**
+	 * 为了兼容之前的版本,可使用where()或and()替代
+	 *
+	 * @param sqlWhere
+	 *            where sql部分
+	 * @param params
+	 *            参数集
+	 * @return this
+	 */
+	public EntityWrapper<T> addFilter(String sqlWhere, Object... params) {
+		return and(sqlWhere, params);
+	}
+
+	/**
+	 * <p>
+	 * 根据判断条件来添加条件语句部分 使用 andIf() 替代
+	 * </p>
+	 * <p>
+	 * eg: ew.filterIfNeed(false,"name='zhangsan'").where("name='zhangsan'")
+	 * .filterIfNeed(true,"id={0}",22)
+	 * <p>
+	 * 输出: WHERE (name='zhangsan' AND id=22)
+	 * </p>
+	 *
+	 * @param need
+	 *            是否需要添加该条件
+	 * @param sqlWhere
+	 *            条件语句
+	 * @param params
+	 *            参数集
+	 * @return this
+	 */
+	public EntityWrapper<T> addFilterIfNeed(boolean need, String sqlWhere, Object... params) {
+		return need ? where(sqlWhere, params) : this;
+	}
+
+	/**
+	 * <p>
+	 * SQL注入内容剥离
+	 * </p>
+	 *
+	 * @param value
+	 *            待处理内容
+	 * @return this
+	 */
+	protected String stripSqlInjection(String value) {
+		return value.replaceAll("('.+--)|(--)|(\\|)|(%7C)", "");
+	}
+
+	/**
+	 * <p>
+	 * 格式化SQL
+	 * </p>
+	 *
+	 * @param sqlStr
+	 *            SQL语句部分
+	 * @param params
+	 *            参数集
+	 * @return this
+	 */
+	protected String formatSql(String sqlStr, Object... params) {
+		return formatSqlIfNeed(true, sqlStr, params);
+	}
+
+	/**
+	 * <p>
+	 * 根据需要格式化SQL
+	 * </p>
+	 *
+	 * @param need
+	 *            是否需要格式化
+	 * @param sqlStr
+	 *            SQL语句部分
+	 * @param params
+	 *            参数集
+	 * @return this
+	 */
+	protected String formatSqlIfNeed(boolean need, String sqlStr, Object... params) {
+		if (!need || StringUtils.isEmpty(sqlStr)) {
+			return null;
+		}
+		if (null != params) {
+			int length = params.length;
 			if (length >= 1) {
 				dealParams(params, length);
 				sqlStr = MessageFormat.format(sqlStr, params);
-        	}
-        }
-        return sqlStr;
-    }
-
-    /**
-     * <p>
-     * 处理Object类型的参数
-     * 如果类型为String,自动添加单引号 'value'。当前字符串已经包含单引号,则不做修改
-     * 如果类型为Object,自动转换成String类型
-     * </p>
-     *
-     * @param params 参数集
-     * @param length 参数数量
-     */
-    protected void dealParams(Object[] params, int length) {
-        for (int i = 0; i < length; i++) {
-            params[i] = StringUtils.quotaMark(params[i]);
-        }
-    }
+			}
+		}
+		return sqlStr;
+	}
+
+	/**
+	 * <p>
+	 * 处理Object类型的参数 如果类型为String,自动添加单引号 'value'。当前字符串已经包含单引号,则不做修改
+	 * 如果类型为Object,自动转换成String类型
+	 * </p>
+	 *
+	 * @param params
+	 *            参数集
+	 * @param length
+	 *            参数数量
+	 */
+	protected void dealParams(Object[] params, int length) {
+		for (int i = 0; i < length; i++) {
+			params[i] = StringUtils.quotaMark(params[i]);
+		}
+	}
 
 }

+ 231 - 224
mybatis-plus/src/main/java/com/baomidou/mybatisplus/mapper/TSqlPlus.java

@@ -1,12 +1,12 @@
 /**
  * Copyright (c) 2011-2020, hubin (jobob@qq.com).
- *
+ * <p>
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- *
+ * <p>
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -33,242 +33,249 @@ import java.util.List;
 @SuppressWarnings("serial")
 public class TSqlPlus extends MybatisAbstractSQL<TSqlPlus> {
 
-	private final String IS_NOT_NULL = " IS NOT NULL";
-	private final String IS_NULL = " IS NULL";
-	private final String SQL_LIKE = " LIKE CONCAT(CONCAT({0},{1}),{2})";
+    private final String IS_NOT_NULL = " IS NOT NULL";
+    private final String IS_NULL = " IS NULL";
+    private final String SQL_LIKE = " LIKE CONCAT(CONCAT({0},{1}),{2})";
+    private final String SQL_BETWEEN_AND = " BETWEEN {0} AND {1}";
+
+    @Override
+    public TSqlPlus getSelf() {
+        return this;
+    }
 
-	@Override
-	public TSqlPlus getSelf() {
-		return this;
-	}
+    /**
+     * 将LIKE语句添加到WHERE条件中
+     *
+     * @param column 字段名
+     * @param value  like值,无需前后%, MYSQL及ORACEL通用
+     * @return
+     */
+    public TSqlPlus LIKE(String column, String value) {
+        handerLike(column, value, false);
+        return this;
+    }
 
-	/**
-	 * 将LIKE语句添加到WHERE条件中
-	 *
-	 * @param column
-	 *            字段名
-	 * @param value
-	 *            like值,无需前后%, MYSQL及ORACEL通用
-	 * @return
-	 */
-	public TSqlPlus LIKE(String column, String value) {
-		handerLike(column, value, false);
-		return this;
-	}
+    /**
+     * 将LIKE语句添加到WHERE条件中
+     *
+     * @param column 字段名
+     * @param value  like值,无需前后%, MYSQL及ORACEL通用
+     * @return
+     */
+    public TSqlPlus NOT_LIKE(String column, String value) {
+        handerLike(column, value, true);
+        return this;
+    }
 
-	/**
-	 * 将LIKE语句添加到WHERE条件中
-	 *
-	 * @param column
-	 *            字段名
-	 * @param value
-	 *            like值,无需前后%, MYSQL及ORACEL通用
-	 * @return
-	 */
-	public TSqlPlus NOT_LIKE(String column, String value) {
-		handerLike(column, value, true);
-		return this;
-	}
+    /**
+     * IS NOT NULL查询
+     *
+     * @param columns 以逗号分隔的字段名称
+     * @return this
+     */
+    public TSqlPlus IS_NOT_NULL(String columns) {
+        handerNull(columns, IS_NOT_NULL);
+        return this;
+    }
 
-	/**
-	 * IS NOT NULL查询
-	 *
-	 * @param columns
-	 *            以逗号分隔的字段名称
-	 * @return this
-	 */
-	public TSqlPlus IS_NOT_NULL(String columns) {
-		handerNull(columns, IS_NOT_NULL);
-		return this;
-	}
+    /**
+     * IS NULL查询
+     *
+     * @param columns 以逗号分隔的字段名称
+     * @return
+     */
+    public TSqlPlus IS_NULL(String columns) {
+        handerNull(columns, IS_NULL);
+        return this;
+    }
 
-	/**
-	 * IS NULL查询
-	 *
-	 * @param columns
-	 *            以逗号分隔的字段名称
-	 * @return
-	 */
-	public TSqlPlus IS_NULL(String columns) {
-		handerNull(columns, IS_NULL);
-		return this;
-	}
+    /**
+     * 处理LIKE操作
+     *
+     * @param column 字段名称
+     * @param value  like匹配值
+     * @param isNot  是否为NOT LIKE操作
+     */
+    private void handerLike(String column, String value, boolean isNot) {
+        if (StringUtils.isNotEmpty(column) && StringUtils.isNotEmpty(value)) {
+            StringBuilder inSql = new StringBuilder();
+            inSql.append(column);
+            if (isNot) {
+                inSql.append(" NOT");
+            }
+            inSql.append(MessageFormat.format(SQL_LIKE, "'%'", StringUtils.quotaMark(value), "'%'"));
+            WHERE(inSql.toString());
+        }
+    }
 
-	/**
-	 * 处理LIKE操作
-	 *
-	 * @param column
-	 *            字段名称
-	 * @param value
-	 *            like匹配值
-	 * @param isNot
-	 *            是否为NOT LIKE操作
-	 */
-	private void handerLike(String column, String value, boolean isNot) {
-		if (StringUtils.isNotEmpty(column) && StringUtils.isNotEmpty(value)) {
-			StringBuilder inSql = new StringBuilder();
-			inSql.append(column);
-			if (isNot) {
-				inSql.append(" NOT");
-			}
-			inSql.append(MessageFormat.format(SQL_LIKE, "'%'", StringUtils.quotaMark(value), "'%'"));
-			WHERE(inSql.toString());
-		}
-	}
+    /**
+     * 将IN语句添加到WHERE条件中
+     *
+     * @param column 字段名
+     * @param value  List集合
+     * @return
+     */
+    public TSqlPlus IN(String column, List<?> value) {
+        handerIn(column, value, false);
+        return this;
+    }
 
-	/**
-	 * 将IN语句添加到WHERE条件中
-	 *
-	 * @param column 字段名
-	 * @param value  List集合
-	 * @return
-	 */
-	public TSqlPlus IN(String column, List<?> value) {
-		handerIn(column, value, false);
-		return this;
-	}
+    /**
+     * 将IN语句添加到WHERE条件中
+     *
+     * @param column 字段名
+     * @param value  List集合
+     * @return
+     */
+    public TSqlPlus NOT_IN(String column, List<?> value) {
+        handerIn(column, value, true);
+        return this;
+    }
 
-	/**
-	 * 将IN语句添加到WHERE条件中
-	 *
-	 * @param column 字段名
-	 * @param value  List集合
-	 * @return
-	 */
-	public TSqlPlus NOT_IN(String column, List<?> value) {
-		handerIn(column, value, true);
-		return this;
-	}
+    /**
+     * 将IN语句添加到WHERE条件中
+     *
+     * @param column 字段名
+     * @param value  逗号拼接的字符串
+     * @return
+     */
+    public TSqlPlus IN(String column, String value) {
+        handerIn(column, value, false);
+        return this;
+    }
 
-	/**
-	 * 将IN语句添加到WHERE条件中
-	 *
-	 * @param column 字段名
-	 * @param value  逗号拼接的字符串
-	 * @return
-	 */
-	public TSqlPlus IN(String column, String value) {
-		handerIn(column, value, false);
-		return this;
-	}
+    /**
+     * 将IN语句添加到WHERE条件中
+     *
+     * @param column 字段名
+     * @param value  逗号拼接的字符串
+     * @return
+     */
+    public TSqlPlus NOT_IN(String column, String value) {
+        handerIn(column, value, true);
+        return this;
+    }
 
-	/**
-	 * 将IN语句添加到WHERE条件中
-	 *
-	 * @param column 字段名
-	 * @param value  逗号拼接的字符串
-	 * @return
-	 */
-	public TSqlPlus NOT_IN(String column, String value) {
-		handerIn(column, value, true);
-		return this;
-	}
+    /**
+     * 将EXISTS语句添加到WHERE条件中
+     *
+     * @param value
+     * @return
+     */
+    public TSqlPlus EXISTS(String value) {
+        handerExists(value, false);
+        return this;
+    }
 
-	/**
-	 * 将EXISTS语句添加到WHERE条件中
-	 *
-	 * @param value
-	 * @return
-	 */
-	public TSqlPlus EXISTS(String value) {
-		handerExists(value, false);
-		return this;
-	}
+    /**
+     * 处理EXISTS操作
+     *
+     * @param value
+     * @param isNot 是否为NOT EXISTS操作
+     */
+    private void handerExists(String value, boolean isNot) {
+        if (StringUtils.isNotEmpty(value)) {
+            StringBuilder inSql = new StringBuilder();
+            if (isNot) {
+                inSql.append(" NOT");
+            }
+            inSql.append(" EXISTS (").append(value).append(")");
+            WHERE(inSql.toString());
+        }
+    }
 
-	/**
-	 * 处理EXISTS操作
-	 *
-	 * @param value
-	 * @param isNot 是否为NOT EXISTS操作
-	 */
-	private void handerExists(String value, boolean isNot) {
-		if (StringUtils.isNotEmpty(value)) {
-			StringBuilder inSql = new StringBuilder();
-			if (isNot) {
-				inSql.append(" NOT");
-			}
-			inSql.append(" EXISTS (").append(value).append(")");
-			WHERE(inSql.toString());
-		}
-	}
+    /**
+     * 将NOT_EXISTS语句添加到WHERE条件中
+     *
+     * @param value
+     * @return
+     */
+    public TSqlPlus NOT_EXISTS(String value) {
+        handerExists(value, true);
+        return this;
+    }
 
-	/**
-	 * 将NOT_EXISTS语句添加到WHERE条件中
-	 *
-	 * @param value
-	 * @return
-	 */
-	public TSqlPlus NOT_EXISTS(String value) {
-		handerExists(value, true);
-		return this;
-	}
+    /**
+     * 处理IN操作
+     *
+     * @param column 字段名称
+     * @param value  集合List
+     * @param isNot  是否为NOT IN操作
+     */
+    private void handerIn(String column, List<?> value, boolean isNot) {
+        if (StringUtils.isNotEmpty(column) && CollectionUtil.isNotEmpty(value)) {
+            StringBuilder inSql = new StringBuilder();
+            inSql.append(column);
+            if (isNot) {
+                inSql.append(" NOT");
+            }
+            inSql.append(" IN (");
+            int _size = value.size();
+            for (int i = 0; i < _size; i++) {
+                String tempVal = StringUtils.quotaMark(value.get(i));
+                if (i + 1 == _size) {
+                    inSql.append(tempVal);
+                } else {
+                    inSql.append(tempVal);
+                    inSql.append(",");
+                }
+            }
+            inSql.append(")");
+            WHERE(inSql.toString());
+        }
+    }
 
-	/**
-	 * 处理IN操作
-	 *
-	 * @param column 字段名称
-	 * @param value  集合List
-	 * @param isNot  是否为NOT IN操作
-	 */
-	private void handerIn(String column, List<?> value, boolean isNot) {
-		if (StringUtils.isNotEmpty(column) && CollectionUtil.isNotEmpty(value)) {
-			StringBuilder inSql = new StringBuilder();
-			inSql.append(column);
-			if (isNot) {
-				inSql.append(" NOT");
-			}
-			inSql.append(" IN (");
-			int _size = value.size();
-			for (int i = 0; i < _size; i++) {
-				String tempVal = StringUtils.quotaMark(value.get(i));
-				if (i + 1 == _size) {
-					inSql.append(tempVal);
-				} else {
-					inSql.append(tempVal);
-					inSql.append(",");
-				}
-			}
-			inSql.append(")");
-			WHERE(inSql.toString());
-		}
-	}
+    /**
+     * 处理IN操作
+     *
+     * @param column 字段名称
+     * @param value  逗号拼接的字符串
+     * @param isNot  是否为NOT IN操作
+     */
+    private void handerIn(String column, String value, boolean isNot) {
+        if (StringUtils.isNotEmpty(column) && StringUtils.isNotEmpty(value)) {
+            StringBuilder inSql = new StringBuilder();
+            inSql.append(column);
+            if (isNot) {
+                inSql.append(" NOT");
+            }
+            inSql.append(" IN (").append(value).append(")");
+            WHERE(inSql.toString());
+        }
+    }
 
-	/**
-	 * 处理IN操作
-	 *
-	 * @param column 字段名称
-	 * @param value  逗号拼接的字符串
-	 * @param isNot  是否为NOT IN操作
-	 */
-	private void handerIn(String column, String value, boolean isNot) {
-		if (StringUtils.isNotEmpty(column) && StringUtils.isNotEmpty(value)) {
-			StringBuilder inSql = new StringBuilder();
-			inSql.append(column);
-			if (isNot) {
-				inSql.append(" NOT");
-			}
-			inSql.append(" IN (").append(value).append(")");
-			WHERE(inSql.toString());
-		}
-	}
+    /**
+     * 处理BETWEEN_AND操作
+     *
+     * @param column 字段名称
+     * @param val1
+     * @param val2
+     */
+    public TSqlPlus BETWEEN_AND(String column, String val1, String val2) {
+        if (StringUtils.isNotEmpty(column) && StringUtils.isNotEmpty(val1) && StringUtils.isNotEmpty(val2)) {
+            StringBuilder betweenSql = new StringBuilder();
+            betweenSql.append(column);
+            betweenSql.append(MessageFormat.format(SQL_BETWEEN_AND, val1, val2));
+            WHERE(betweenSql.toString());
+        }
+        return this;
+    }
 
-	/**
-	 * 以相同的方式处理null和notnull
-	 *
-	 * @param columns
-	 *            以逗号分隔的字段名称
-	 * @param sqlPart
-	 *            SQL部分
-	 */
-	private void handerNull(String columns, String sqlPart) {
-		if (StringUtils.isNotEmpty(columns)) {
-			String[] cols = columns.split(",");
-			for (String col : cols) {
-				if (StringUtils.isNotEmpty(col.trim())) {
-					WHERE(col + sqlPart);
-				}
-			}
-		}
-	}
+    /**
+     * 以相同的方式处理null和notnull
+     *
+     * @param columns 以逗号分隔的字段名称
+     * @param sqlPart SQL部分
+     */
+    private void handerNull(String columns, String sqlPart) {
+        if (StringUtils.isNotEmpty(columns)) {
+            String[] cols = columns.split(",");
+            for (String col : cols) {
+                if (StringUtils.isNotEmpty(col.trim())) {
+                    WHERE(col + sqlPart);
+                }
+            }
+        }
+    }
 
 }

+ 203 - 193
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/EntityWrapperTest.java

@@ -34,203 +34,213 @@ import java.util.List;
  */
 public class EntityWrapperTest {
 
-    /*
-     * User 查询包装器
-     */
-    private EntityWrapper<User> ew = new EntityWrapper<User>();
-
-    // 初始化
-    static {
-        TableInfoHelper.initTableInfo(User.class);
-    }
-
-    @Test
-    public void test() {
-        /*
-         * 无条件测试
+	/*
+	 * User 查询包装器
+	 */
+	private EntityWrapper<User> ew = new EntityWrapper<User>();
+
+	// 初始化
+	static {
+		TableInfoHelper.initTableInfo(User.class);
+	}
+
+	@Test
+	public void test() {
+		/*
+		 * 无条件测试
 		 */
-        Assert.assertNull(ew.getSqlSegment());
-    }
-
-    @Test
-    public void test11() {
-        /*
-         * 实体带where   ifneed
-         */
-        ew.setEntity(new User(1));
-        ew.where("name={0}", "'123'").addFilterIfNeed(false, "id=12");
-        String sqlSegment = ew.getSqlSegment();
-        System.err.println("test11 = " + sqlSegment);
-        Assert.assertEquals("AND (name='123')", sqlSegment);
-    }
-
-    @Test
-    public void test12() {
-        /*
-         * 实体带where orderby
-         */
-        ew.setEntity(new User(1));
-        ew.where("name={0}", "'123'").orderBy("id", false);
-        String sqlSegment = ew.getSqlSegment();
-        System.err.println("test12 = " + sqlSegment);
-        Assert.assertEquals("AND (name='123')\nORDER BY id DESC", sqlSegment);
-    }
-
-    @Test
-    public void test13() {
-        /*
-         * 实体排序
+		Assert.assertNull(ew.getSqlSegment());
+	}
+
+	@Test
+	public void test11() {
+		/*
+		 * 实体带where ifneed
+		 */
+		ew.setEntity(new User(1));
+		ew.where("name={0}", "'123'").addFilterIfNeed(false, "id=12");
+		String sqlSegment = ew.getSqlSegment();
+		System.err.println("test11 = " + sqlSegment);
+		Assert.assertEquals("AND (name='123')", sqlSegment);
+	}
+
+	@Test
+	public void test12() {
+		/*
+		 * 实体带where orderby
+		 */
+		ew.setEntity(new User(1));
+		ew.where("name={0}", "'123'").orderBy("id", false);
+		String sqlSegment = ew.getSqlSegment();
+		System.err.println("test12 = " + sqlSegment);
+		Assert.assertEquals("AND (name='123')\nORDER BY id DESC", sqlSegment);
+	}
+
+	@Test
+	public void test13() {
+		/*
+		 * 实体排序
+		 */
+		ew.setEntity(new User(1));
+		ew.orderBy("id", false);
+		String sqlSegment = ew.getSqlSegment();
+		System.err.println("test13 = " + sqlSegment);
+		Assert.assertEquals("ORDER BY id DESC", sqlSegment);
+	}
+
+	@Test
+	public void test21() {
+		/*
+		 * 无实体 where ifneed orderby
+		 */
+		ew.where("name={0}", "'123'").addFilterIfNeed(false, "id=1").orderBy("id");
+		String sqlSegment = ew.getSqlSegment();
+		System.err.println("test21 = " + sqlSegment);
+		Assert.assertEquals("WHERE (name='123')\nORDER BY id", sqlSegment);
+	}
+
+	@Test
+	public void test22() {
+		ew.where("name={0}", "'123'").orderBy("id", false);
+		String sqlSegment = ew.getSqlSegment();
+		System.err.println("test22 = " + sqlSegment);
+		Assert.assertEquals("WHERE (name='123')\nORDER BY id DESC", sqlSegment);
+	}
+
+	@Test
+	public void test23() {
+		/*
+		 * 无实体查询,只排序
 		 */
-        ew.setEntity(new User(1));
-        ew.orderBy("id", false);
-        String sqlSegment = ew.getSqlSegment();
-        System.err.println("test13 = " + sqlSegment);
-        Assert.assertEquals("ORDER BY id DESC", sqlSegment);
-    }
-
-    @Test
-    public void test21() {
-        /*
-         * 无实体 where ifneed orderby
-         */
-        ew.where("name={0}", "'123'").addFilterIfNeed(false, "id=1").orderBy("id");
-        String sqlSegment = ew.getSqlSegment();
-        System.err.println("test21 = " + sqlSegment);
-        Assert.assertEquals("WHERE (name='123')\nORDER BY id", sqlSegment);
-    }
-
-    @Test
-    public void test22() {
-        ew.where("name={0}", "'123'").orderBy("id", false);
-        String sqlSegment = ew.getSqlSegment();
-        System.err.println("test22 = " + sqlSegment);
-        Assert.assertEquals("WHERE (name='123')\nORDER BY id DESC", sqlSegment);
-    }
-
-    @Test
-    public void test23() {
-        /*
-         * 无实体查询,只排序
+		ew.orderBy("id", false);
+		String sqlSegment = ew.getSqlSegment();
+		System.err.println("test23 = " + sqlSegment);
+		Assert.assertEquals("ORDER BY id DESC", sqlSegment);
+	}
+
+	@Test
+	public void testNoTSQL() {
+		/*
+		 * 实体 filter orderby
 		 */
-        ew.orderBy("id", false);
-        String sqlSegment = ew.getSqlSegment();
-        System.err.println("test23 = " + sqlSegment);
-        Assert.assertEquals("ORDER BY id DESC", sqlSegment);
-    }
-
-    @Test
-    public void testNoTSQL() {
-        /*
-         * 实体 filter orderby
+		ew.setEntity(new User(1));
+		ew.addFilter("name={0}", "'123'").orderBy("id,name");
+		String sqlSegment = ew.getSqlSegment();
+		System.err.println("testNoTSQL = " + sqlSegment);
+		Assert.assertEquals("AND (name='123')\nORDER BY id,name", sqlSegment);
+	}
+
+	@Test
+	public void testNoTSQL1() {
+		/*
+		 * 非 T-SQL 无实体查询
 		 */
-        ew.setEntity(new User(1));
-        ew.addFilter("name={0}", "'123'").orderBy("id,name");
-        String sqlSegment = ew.getSqlSegment();
-        System.err.println("testNoTSQL = " + sqlSegment);
-        Assert.assertEquals("AND (name='123')\nORDER BY id,name", sqlSegment);
-    }
-
-    @Test
-    public void testNoTSQL1() {
-        /*
-         * 非 T-SQL 无实体查询
+		ew.addFilter("name={0}", "'123'").addFilterIfNeed(false, "status={1}", "1");
+		String sqlSegment = ew.getSqlSegment();
+		System.err.println("testNoTSQL1 = " + sqlSegment);
+		Assert.assertEquals("WHERE (name='123')", sqlSegment);
+	}
+
+	@Test
+	public void testTSQL11() {
+		/*
+		 * 实体带查询使用方法 输出看结果
 		 */
-        ew.addFilter("name={0}", "'123'").addFilterIfNeed(false, "status={1}", "1");
-        String sqlSegment = ew.getSqlSegment();
-        System.err.println("testNoTSQL1 = " + sqlSegment);
-        Assert.assertEquals("WHERE (name='123')", sqlSegment);
-    }
-
-    @Test
-    public void testTSQL11() {
-        /*
-         * 实体带查询使用方法  输出看结果
-         */
-        ew.setEntity(new User(1));
-        ew.where("name={0}", "'zhangsan'").and("id=1")
-                .orNew("status={0}", "0").or("status=1")
-                .notLike("nlike", "notvalue")
-                .andNew("new=xx").like("hhh", "ddd")
-                .andNew("pwd=11").isNotNull("n1,n2").isNull("n3")
-                .groupBy("x1").groupBy("x2,x3")
-                .having("x1=11").having("x3=433")
-                .orderBy("dd").orderBy("d1,d2");
-        System.out.println(ew.getSqlSegment());
-    }
-
-    @Test
-    public void testNull() {
-        ew.orderBy(null);
-        String sqlPart = ew.getSqlSegment();
-        Assert.assertNull(sqlPart);
-    }
-
-    @Test
-    public void testNull2() {
-        ew.like(null, null).where("aa={0}", "'bb'").orderBy(null);
-        String sqlPart = ew.getSqlSegment();
-        Assert.assertEquals("WHERE (aa='bb')", sqlPart);
-    }
-
-    /**
-     * 测试带单引号的值是否不会再次添加单引号
-     */
-    @Test
-    public void testNul14() {
-        ew.where("id={0}", "'11'").and("name={0}", 22);
-        String sqlPart = ew.getSqlSegment();
-        System.out.println("sql ==> " + sqlPart);
-        Assert.assertEquals("WHERE (id='11' AND name=22)", sqlPart);
-    }
-
-    /**
-     * 测试带不带单引号的值是否会自动添加单引号
-     */
-    @Test
-    public void testNul15() {
-        ew.where("id={0}", "11").and("name={0}", 222222222);
-        String sqlPart = ew.getSqlSegment();
-        System.out.println("sql ==> " + sqlPart);
-        Assert.assertEquals("WHERE (id='11' AND name=222222222)", sqlPart);
-    }
-
-    /**
-     * 测试EXISTS
-     */
-    @Test
-    public void testNul16() {
-        ew.notExists("(select * from user)");
-        String sqlPart = ew.getSqlSegment();
-        System.out.println("sql ==> " + sqlPart);
-        Assert.assertEquals("WHERE ( NOT EXISTS ((select * from user)))", sqlPart);
-    }
-    /**
-     * 测试NOT IN
-     */
-    @Test
-    public void testNul17() {
-        List<String> list = new ArrayList<String>();
-        list.add("'1'");
-        list.add("'2'");
-        list.add("'3'");
-        ew.notIn("test_type",list);
-        String sqlPart = ew.getSqlSegment();
-        System.out.println("sql ==> " + sqlPart);
-        Assert.assertEquals("WHERE (test_type NOT IN ('1','2','3'))", sqlPart);
-    }
-    /**
-     * 测试IN
-     */
-    @Test
-    public void testNul18() {
-        List<Long> list = new ArrayList<Long>();
-        list.add(111111111L);
-        list.add(222222222L);
-        list.add(333333333L);
-        ew.in("test_type",list);
-        String sqlPart = ew.getSqlSegment();
-        System.out.println("sql ==> " + sqlPart);
-        Assert.assertEquals("WHERE (test_type IN (111111111,222222222,333333333))", sqlPart);
-    }
+		ew.setEntity(new User(1));
+		ew.where("name={0}", "'zhangsan'").and("id=1").orNew("status={0}", "0").or("status=1").notLike("nlike", "notvalue")
+				.andNew("new=xx").like("hhh", "ddd").andNew("pwd=11").isNotNull("n1,n2").isNull("n3").groupBy("x1")
+				.groupBy("x2,x3").having("x1=11").having("x3=433").orderBy("dd").orderBy("d1,d2");
+		System.out.println(ew.getSqlSegment());
+	}
+
+	@Test
+	public void testNull() {
+		ew.orderBy(null);
+		String sqlPart = ew.getSqlSegment();
+		Assert.assertNull(sqlPart);
+	}
+
+	@Test
+	public void testNull2() {
+		ew.like(null, null).where("aa={0}", "'bb'").orderBy(null);
+		String sqlPart = ew.getSqlSegment();
+		Assert.assertEquals("WHERE (aa='bb')", sqlPart);
+	}
+
+	/**
+	 * 测试带单引号的值是否不会再次添加单引号
+	 */
+	@Test
+	public void testNul14() {
+		ew.where("id={0}", "'11'").and("name={0}", 22);
+		String sqlPart = ew.getSqlSegment();
+		System.out.println("sql ==> " + sqlPart);
+		Assert.assertEquals("WHERE (id='11' AND name=22)", sqlPart);
+	}
+
+	/**
+	 * 测试带不带单引号的值是否会自动添加单引号
+	 */
+	@Test
+	public void testNul15() {
+		ew.where("id={0}", "11").and("name={0}", 222222222);
+		String sqlPart = ew.getSqlSegment();
+		System.out.println("sql ==> " + sqlPart);
+		Assert.assertEquals("WHERE (id='11' AND name=222222222)", sqlPart);
+	}
+
+	/**
+	 * 测试EXISTS
+	 */
+	@Test
+	public void testNul16() {
+		ew.notExists("(select * from user)");
+		String sqlPart = ew.getSqlSegment();
+		System.out.println("sql ==> " + sqlPart);
+		Assert.assertEquals("WHERE ( NOT EXISTS ((select * from user)))", sqlPart);
+	}
+
+	/**
+	 * 测试NOT IN
+	 */
+	@Test
+	public void testNul17() {
+		List<String> list = new ArrayList<String>();
+		list.add("'1'");
+		list.add("'2'");
+		list.add("'3'");
+		ew.notIn("test_type", list);
+		String sqlPart = ew.getSqlSegment();
+		System.out.println("sql ==> " + sqlPart);
+		Assert.assertEquals("WHERE (test_type NOT IN ('1','2','3'))", sqlPart);
+	}
+
+	/**
+	 * 测试IN
+	 */
+	@Test
+	public void testNul18() {
+		List<Long> list = new ArrayList<Long>();
+		list.add(111111111L);
+		list.add(222222222L);
+		list.add(333333333L);
+		ew.in("test_type", list);
+		String sqlPart = ew.getSqlSegment();
+		System.out.println("sql ==> " + sqlPart);
+		Assert.assertEquals("WHERE (test_type BETWEEN 11 AND 33)", sqlPart);
+	}
+
+	/**
+	 * 测试BETWEEN AND
+	 */
+	@Test
+	public void testNul19() {
+		String val1 = "11";
+		String val2 = "33";
+		ew.between("test_type", val1, val2);
+		String sqlPart = ew.getSqlSegment();
+		System.out.println("sql ==> " + sqlPart);
+		Assert.assertEquals("WHERE (test_type BETWEEN 11 AND 33)", sqlPart);
+	}
 
 }