Selaa lähdekoodia

优化sql where条件。支持or和条件嵌套。

周浩 9 vuotta sitten
vanhempi
commit
c43ef96b93

+ 3 - 0
hsweb-web-bean/src/main/java/org/hsweb/web/bean/common/QueryParam.java

@@ -35,6 +35,9 @@ public class QueryParam extends SqlParam<QueryParam> implements Serializable {
      */
     private String sortOrder = "asc";
 
+    public QueryParam select(String... fields) {
+        return this.includes(fields);
+    }
 
     public QueryParam orderBy(String sortField) {
         this.sortField.add(sortField);

+ 55 - 44
hsweb-web-bean/src/main/java/org/hsweb/web/bean/common/SqlParam.java

@@ -1,5 +1,6 @@
 package org.hsweb.web.bean.common;
 
+import com.alibaba.fastjson.JSON;
 import org.webbuilder.utils.common.MapUtils;
 import org.webbuilder.utils.common.StringUtils;
 
@@ -9,10 +10,11 @@ import java.util.*;
  * Created by zhouhao on 16-4-19.
  */
 public class SqlParam<R extends SqlParam> {
+
     /**
-     * 执行条件
+     * 条件
      */
-    protected Map<String, Object> term = new HashMap<>();
+    protected List<Term> terms = new LinkedList<>();
 
     /**
      * 指定要处理的字段
@@ -24,6 +26,33 @@ public class SqlParam<R extends SqlParam> {
      */
     protected Set<String> excludes = new LinkedHashSet<>();
 
+    public R or(String termString, Object value) {
+        Term term = new Term();
+        term.setField(termString);
+        term.setValue(value);
+        term.setType(Term.Type.or);
+        terms.add(term);
+        return (R) this;
+    }
+
+    public R and(String termString, Object value) {
+        Term term = new Term();
+        term.setField(termString);
+        term.setValue(value);
+        term.setType(Term.Type.and);
+        terms.add(term);
+        return (R) this;
+    }
+
+    public Term nest(String termString, Object value) {
+        Term term = new Term();
+        term.setField(termString);
+        term.setValue(value);
+        term.setType(Term.Type.and);
+        terms.add(term);
+        return term;
+    }
+
     public R includes(String... fields) {
         includes.addAll(Arrays.asList(fields));
         return (R) this;
@@ -36,22 +65,15 @@ public class SqlParam<R extends SqlParam> {
     }
 
     public R where(String key, Object value) {
-        this.term.put(key, changeTermValue(key, value));
+        and(key, value);
         return (R) this;
     }
 
     public R where(Map<String, Object> conditions) {
-        changeTerm(conditions);
-        this.term.putAll(conditions);
+        initTermByMap(conditions);
         return (R) this;
     }
 
-    public Map<String, Object> getTerm() {
-        this.term = MapUtils.removeEmptyValue(term);
-        changeTerm(this.term);
-        return term;
-    }
-
     public Set<String> getIncludes() {
         return includes;
     }
@@ -68,43 +90,32 @@ public class SqlParam<R extends SqlParam> {
         this.excludes = excludes;
     }
 
-    public R setTerm(Map<String, Object> term) {
-        this.term = term;
-        return (R) this;
+    public List<Term> getTerms() {
+        return terms;
     }
 
-    protected void changeTerm(Map<String, Object> term) {
-        if (term != null) {
-            term.entrySet().forEach((e) -> e.setValue(changeTermValue(e.getKey(), e.getValue())));
-        }
+    public void setTerms(List<Term> terms) {
+        this.terms = terms;
     }
 
-    public Object changeTermValue(String key, Object value) {
-        //将IN条件的值转换为Iterable
-        if (key.endsWith("$IN")) {
-            if (value == null) return new ArrayList<>();
-            if (!(value instanceof Iterable)) {
-                if (value instanceof String) {
-                    String[] arr = ((String) value).split("[, ;]");
-                    Object[] objArr = new Object[arr.length];
-                    for (int i = 0; i < arr.length; i++) {
-                        String str = arr[i];
-                        Object val = str;
-                        if (StringUtils.isInt(str))
-                            val = StringUtils.toInt(str);
-                        else if (StringUtils.isDouble(str))
-                            val = StringUtils.toDouble(str);
-                        objArr[i] = val;
-                    }
-                    return Arrays.asList(objArr);
-                } else if (value.getClass().isArray()) {
-                    return Arrays.asList(((Object[]) value));
-                } else {
-                    return Arrays.asList(value);
-                }
-            }
-        }
-        return value;
+    @Override
+    public String toString() {
+        return JSON.toJSONString(this);
     }
 
+    protected void initTermByMap(Map<String, Object> param) {
+        param.forEach((k, v) -> {
+            String field = String.valueOf(param.get("field"));
+            Object value = param.get("value");
+            if (StringUtils.isNullOrEmpty(field) || StringUtils.isNullOrEmpty(value)) return;
+            String type = String.valueOf(param.get("type"));
+            String queryType = String.valueOf(param.get("queryType"));
+            Term nest = new Term();
+            nest.setField(field);
+            nest.setValue(value);
+            nest.setType(Term.Type.valueOf(type));
+            nest.setTermType(TermType.valueOf(queryType));
+            terms.add(nest);
+        });
+    }
 }

+ 128 - 0
hsweb-web-bean/src/main/java/org/hsweb/web/bean/common/Term.java

@@ -0,0 +1,128 @@
+package org.hsweb.web.bean.common;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 执行条件
+ * Created by zhouhao on 16-5-9.
+ */
+public class Term {
+
+    /**
+     * 字段
+     */
+    private String field;
+
+    /**
+     * 值
+     */
+    private Object value;
+
+    /**
+     * 链接类型
+     */
+    private Type type = Type.and;
+
+    /**
+     * 条件类型
+     */
+    private TermType termType = TermType.eq;
+
+    /**
+     * 嵌套的条件
+     */
+    private List<Term> terms = new LinkedList<>();
+
+    public Term or(String term, Object value) {
+        Term queryTerm = new Term();
+        queryTerm.setField(term);
+        queryTerm.setValue(value);
+        queryTerm.setType(Type.or);
+        terms.add(queryTerm);
+        return this;
+    }
+
+    public Term and(String term, Object value) {
+        Term queryTerm = new Term();
+        queryTerm.setField(term);
+        queryTerm.setValue(value);
+        queryTerm.setType(Type.and);
+        terms.add(queryTerm);
+        return this;
+    }
+
+    public Term nest(String term, Object value) {
+        Term queryTerm = new Term();
+        queryTerm.setField(term);
+        queryTerm.setValue(value);
+        queryTerm.setType(Type.and);
+        terms.add(queryTerm);
+        return queryTerm;
+    }
+
+    public Term nestOr(String term, Object value) {
+        Term queryTerm = new Term();
+        queryTerm.setField(term);
+        queryTerm.setValue(value);
+        queryTerm.setType(Type.or);
+        terms.add(queryTerm);
+        return queryTerm;
+    }
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        setTermType(TermType.fromString(field));
+        if (field.contains("$")) {
+            field = field.split("[\\$]")[0];
+        }
+        this.field = field;
+    }
+
+    public Object getValue() {
+        return value;
+    }
+
+    public void setValue(Object value) {
+        this.value = value;
+    }
+
+    public Type getType() {
+        return type;
+    }
+
+    public void setType(Type type) {
+        this.type = type;
+    }
+
+    public TermType getTermType() {
+        return termType;
+    }
+
+    public void setTermType(TermType termType) {
+        this.termType = termType;
+    }
+
+    public List<Term> getTerms() {
+        return terms;
+    }
+
+    public void setTerms(List<Term> terms) {
+        this.terms = terms;
+    }
+
+    public enum Type {
+        or, and;
+
+        public static Type fromString(String str) {
+            try {
+                return Type.valueOf(str.toLowerCase());
+            } catch (Exception e) {
+                return and;
+            }
+        }
+    }
+}

+ 56 - 0
hsweb-web-bean/src/main/java/org/hsweb/web/bean/common/TermType.java

@@ -0,0 +1,56 @@
+package org.hsweb.web.bean.common;
+
+/**
+ *
+ * Created by zhouhao on 16-5-9.
+ */
+public enum TermType {
+    /**
+     * ==
+     */
+    eq,
+    /**
+     * !=
+     */
+    not,
+    /**
+     * like
+     */
+    like,
+    /**
+     * >
+     */
+    gt,
+    /**
+     * <
+     */
+    lt,
+    /**
+     * in
+     */
+    in,
+    /**
+     * notin
+     */
+    notin,
+    /**
+     * is null
+     */
+    isnull,
+    /**
+     * not null
+     */
+    notnull;
+
+    public static TermType fromString(String str) {
+        if (!str.contains("$")) {
+            return eq;
+        } else {
+            try {
+                return valueOf(str.split("[\\$]")[1].toLowerCase());
+            } catch (Exception e) {
+                return eq;
+            }
+        }
+    }
+}

+ 187 - 0
hsweb-web-dao-impl-mybatis/src/main/java/org/hsweb/web/mybatis/builder/DefaultSqlParamBuilder.java

@@ -0,0 +1,187 @@
+package org.hsweb.web.mybatis.builder;
+
+import org.hsweb.web.bean.common.Term;
+import org.hsweb.web.bean.common.TermType;
+import org.hsweb.web.mybatis.utils.SqlAppender;
+import org.webbuilder.utils.common.DateTimeUtils;
+import org.webbuilder.utils.common.StringUtils;
+
+import java.sql.JDBCType;
+import java.util.*;
+
+/**
+ * Created by zhouhao on 16-5-9.
+ */
+public class DefaultSqlParamBuilder {
+
+    protected Map<TermType, KeyWordMapper> mapperMap = new HashMap<>();
+
+    private static DefaultSqlParamBuilder instance = new DefaultSqlParamBuilder();
+
+    public DefaultSqlParamBuilder() {
+        mapperMap.put(TermType.eq, (paramKey, field, jdbcType) ->
+                        new SqlAppender().add(field.getField(), " = ", "#{", paramKey, "}").toString()
+        );
+        mapperMap.put(TermType.not, (paramKey, field, jdbcType) ->
+                        new SqlAppender().add(field.getField(), " != ", "#{", paramKey, "}").toString()
+        );
+        mapperMap.put(TermType.like, (paramKey, field, jdbcType) ->
+                        new SqlAppender().add(field.getField(), " like ", "#{", paramKey, "}").toString()
+        );
+
+        mapperMap.put(TermType.notnull, (paramKey, field, jdbcType) ->
+                        new SqlAppender().add(field.getField(), " not null").toString()
+        );
+        mapperMap.put(TermType.isnull, (paramKey, field, jdbcType) ->
+                        new SqlAppender().add(field.getField(), " is null").toString()
+        );
+
+        mapperMap.put(TermType.gt, (paramKey, field, jdbcType) -> {
+            SqlAppender sqlAppender = new SqlAppender();
+            if (Arrays.<JDBCType>asList(JDBCType.DATE, JDBCType.TIME, JDBCType.TIMESTAMP).contains(jdbcType)) {
+                if (!(field.getValue() instanceof Date)) {
+                    String strValue = String.valueOf(field.getValue());
+                    Date date = DateTimeUtils.formatUnknownString2Date(strValue);
+                    if (date != null) field.setValue(date);
+                }
+            }
+            sqlAppender.add(field.getField(), " >= #{", paramKey, "}");
+            return sqlAppender.toString();
+        });
+
+        mapperMap.put(TermType.lt, (paramKey, field, jdbcType) -> {
+            SqlAppender sqlAppender = new SqlAppender();
+            if (Arrays.<JDBCType>asList(JDBCType.DATE, JDBCType.TIME, JDBCType.TIMESTAMP).contains(jdbcType)) {
+                if (!(field.getValue() instanceof Date)) {
+                    String strValue = String.valueOf(field.getValue());
+                    Date date = DateTimeUtils.formatUnknownString2Date(strValue);
+                    if (date != null) field.setValue(date);
+                }
+            }
+            sqlAppender.add(field.getField(), " <= #{", paramKey, "}");
+            return sqlAppender.toString();
+        });
+
+        mapperMap.put(TermType.in, (paramKey, field, jdbcType) -> {
+            List<Object> values = param2list(field.getValue());
+            field.setValue(values);
+            SqlAppender appender = new SqlAppender();
+            appender.addSpc(field.getField(), "in(");
+            for (int i = 0; i < values.size(); i++) {
+                appender.add("#{", paramKey, "[", i, "]}", ",");
+            }
+            appender.removeLast();
+            appender.add(")");
+            return appender.toString();
+        });
+
+        mapperMap.put(TermType.notin, (paramKey, field, jdbcType) -> {
+            List<Object> values = param2list(field.getValue());
+            field.setValue(values);
+            SqlAppender appender = new SqlAppender();
+            appender.addSpc(field.getField(), "not in(");
+            for (int i = 0; i < values.size(); i++) {
+                appender.add("#{", paramKey, "[", i, "]}", ",");
+            }
+            appender.removeLast();
+            appender.add(")");
+            return appender.toString();
+        });
+
+    }
+
+    public static DefaultSqlParamBuilder instance() {
+        return instance;
+    }
+
+    public KeyWordMapper getKeyWordMapper(TermType type) {
+        return mapperMap.get(type);
+    }
+
+    public String buildWhere(Map<String, Object> fieldConfig, List<Term> terms) {
+        String sql = buildWhere(fieldConfig, "", terms);
+        return sql;
+    }
+
+    public JDBCType getFieldJDBCType(String field, Map<String, Object> fieldConfig) {
+        Object conf = fieldConfig.get(field);
+        if (conf instanceof Map) {
+            try {
+                return JDBCType.valueOf(String.valueOf(((Map) conf).get("jdbcType")));
+            } catch (Exception e) {
+            }
+        }
+        return JDBCType.VARCHAR;
+    }
+
+    public String buildWhere(Map<String, Object> fieldConfig, String prefix, List<Term> terms) {
+        if (terms == null || terms.isEmpty()) return "";
+        SqlAppender appender = new SqlAppender();
+        int index = 0;
+        String prefixTmp = StringUtils.concat(prefix, StringUtils.isNullOrEmpty(prefix) ? "" : ".");
+        for (Term term : terms) {
+            if (!fieldConfig.containsKey(term.getField())) continue;
+            prefix = StringUtils.concat(prefixTmp, "terms[", index++, "]");
+            JDBCType jdbcType = getFieldJDBCType(term.getField(), fieldConfig);
+            term.setValue(transformationValue(jdbcType, term.getValue()));
+            appender.addSpc(" " + term.getType().toString());
+            if (term.getTerms() != null && !term.getTerms().isEmpty()) {
+                appender.add("(", mapperMap.get(term.getTermType()).fieldMapper(prefix + ".value", term, jdbcType));
+                appender.addSpc("", term.getType().toString())
+                        .add(buildWhere(fieldConfig, prefix, term.getTerms()), ")");
+            } else {
+                appender.add(mapperMap.get(term.getTermType()).fieldMapper("" + prefix + ".value", term, jdbcType));
+            }
+        }
+        appender.removeFirst();
+        return appender.toString();
+    }
+
+    protected Object transformationValue(JDBCType type, Object value) {
+        switch (type) {
+            case NUMERIC:
+                if (StringUtils.isInt(type)) return StringUtils.toInt(value);
+                if (StringUtils.isDouble(type)) return StringUtils.toDouble(value);
+                break;
+            case TIMESTAMP:
+            case TIME:
+            case DATE:
+                if (!(value instanceof Date)) {
+                    String strValue = String.valueOf(value);
+                    Date date = DateTimeUtils.formatUnknownString2Date(strValue);
+                    if (date != null) return date;
+                }
+                break;
+        }
+        return value;
+    }
+
+    protected List<Object> param2list(Object value) {
+        if (value == null) return new ArrayList<>();
+        if (!(value instanceof Iterable)) {
+            if (value instanceof String) {
+                String[] arr = ((String) value).split("[, ;]");
+                Object[] objArr = new Object[arr.length];
+                for (int i = 0; i < arr.length; i++) {
+                    String str = arr[i];
+                    Object val = str;
+                    if (StringUtils.isInt(str))
+                        val = StringUtils.toInt(str);
+                    else if (StringUtils.isDouble(str))
+                        val = StringUtils.toDouble(str);
+                    objArr[i] = val;
+                }
+                return Arrays.asList(objArr);
+            } else if (value.getClass().isArray()) {
+                return Arrays.asList(((Object[]) value));
+            } else {
+                return Arrays.asList(value);
+            }
+        }
+        return new ArrayList<>();
+    }
+
+    public interface KeyWordMapper {
+        String fieldMapper(String paramKey, Term term, JDBCType jdbcType);
+    }
+}

+ 16 - 0
hsweb-web-dao-impl-mybatis/src/main/java/org/hsweb/web/mybatis/builder/MysqlParamBuilder.java

@@ -0,0 +1,16 @@
+package org.hsweb.web.mybatis.builder;
+
+/**
+ * Created by zhouhao on 16-5-9.
+ */
+public class MysqlParamBuilder extends DefaultSqlParamBuilder {
+    private static MysqlParamBuilder instance = new MysqlParamBuilder();
+
+    public MysqlParamBuilder() {
+    }
+
+
+    public static MysqlParamBuilder instance() {
+        return instance;
+    }
+}

+ 47 - 0
hsweb-web-dao-impl-mybatis/src/main/java/org/hsweb/web/mybatis/utils/SqlAppender.java

@@ -0,0 +1,47 @@
+package org.hsweb.web.mybatis.utils;
+
+import java.util.LinkedList;
+
+/**
+ * Created by zhouhao on 16-5-9.
+ */
+public class SqlAppender extends LinkedList<String> {
+
+
+    public SqlAppender add(Object... str) {
+        for (Object s : str) {
+            this.add(String.valueOf(s));
+        }
+        return this;
+    }
+
+    public SqlAppender addEdSpc(String... str) {
+        for (String s : str) {
+            this.add(s);
+        }
+        this.add(" ");
+        return this;
+    }
+
+    /**
+     * 接入sql语句,并自动加入空格
+     *
+     * @param str
+     * @return
+     */
+    public SqlAppender addSpc(String... str) {
+        for (String s : str) {
+            this.add(s);
+            this.add(" ");
+        }
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        this.forEach(builder::append);
+        return builder.toString();
+    }
+
+}

+ 48 - 41
hsweb-web-dao-impl-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/mysql/basic/BasicMapper.xml

@@ -3,47 +3,51 @@
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://www.mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="BasicMapper">
+    <sql id="buildWhereV2">
+        ${@org.hsweb.web.mybatis.builder.DefaultSqlParamBuilder@instance().buildWhere($fieldsInfo,#this['_parameter'].terms)}
+    </sql>
     <!--通用查询条件-->
     <sql id="buildWhere">
+        <include refid="BasicMapper.buildWhereV2"/>
         <!--动态生成查询条件-->
-        <foreach item="item" index="index" collection="$fields">
-            <if test="#this['term.'+item]!=null">
-                AND `${$tableName}`.`${item}`=#{term.${item}}
-            </if>
-            <if test="#this['term.'+item+'$NOT']!=null">
-                AND `${$tableName}`.`${item}`!=#{term.${item+'$NOT'}}
-            </if>
-            <if test="#this['term.'+item+'$LIKE']!=null">
-                AND ${$tableName}.${item} like #{term.${item+'$LIKE'}}
-            </if>
-            <if test="#this['term.'+item+'$NOTLIKE']!=null">
-                AND  ${$tableName}.${item} not like #{term.${item+'$LIKE'}}
-            </if>
-            <if test="#this['term.'+item+'$IN']!=null">
-                AND `${$tableName}`.`${item}` IN
-                <foreach item="it" index="i" collection="#this['term.'+item+'$IN']" open="(" separator="," close=")">
-                    #{it}
-                </foreach>
-            </if>
-            <if test="#this['term.'+item+'$NOTIN']!=null">
-                AND `${$tableName}`.`${item}` NOT IN
-                <foreach item="it" index="i" collection="#this['term.'+item+'$NOTIN']" open="(" separator="," close=")">
-                    #{it}
-                </foreach>
-            </if>
-            <if test="#this['term.'+item+'$ISNULL']!=null">
-                AND `${$tableName}`.`${item}` IS NULL
-            </if>
-            <if test="#this['term.'+item+'$NOTNULL']!=null">
-                AND `${$tableName}`.`${item}` IS NOT NULL
-            </if>
-            <if test="#this['term.'+item+'$GT']!=null">
-                AND `${$tableName}`.`${item}` &gt;=#{term.${item+'$GT'}}
-            </if>
-            <if test="#this['term.'+item+'$LT']!=null">
-                AND `${$tableName}`.`${item}` &lt;=#{term.${item+'$LT'}}
-            </if>
-        </foreach>
+        <!--<foreach item="item" index="index" collection="$fields">-->
+            <!--<if test="#this['term.'+item]!=null">-->
+                <!--AND `${$tableName}`.`${item}`=#{term.${item}}-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$NOT']!=null">-->
+                <!--AND `${$tableName}`.`${item}`!=#{term.${item+'$NOT'}}-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$LIKE']!=null">-->
+                <!--AND ${$tableName}.${item} like #{term.${item+'$LIKE'}}-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$NOTLIKE']!=null">-->
+                <!--AND  ${$tableName}.${item} not like #{term.${item+'$LIKE'}}-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$IN']!=null">-->
+                <!--AND `${$tableName}`.`${item}` IN-->
+                <!--<foreach item="it" index="i" collection="#this['term.'+item+'$IN']" open="(" separator="," close=")">-->
+                    <!--#{it}-->
+                <!--</foreach>-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$NOTIN']!=null">-->
+                <!--AND `${$tableName}`.`${item}` NOT IN-->
+                <!--<foreach item="it" index="i" collection="#this['term.'+item+'$NOTIN']" open="(" separator="," close=")">-->
+                    <!--#{it}-->
+                <!--</foreach>-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$ISNULL']!=null">-->
+                <!--AND `${$tableName}`.`${item}` IS NULL-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$NOTNULL']!=null">-->
+                <!--AND `${$tableName}`.`${item}` IS NOT NULL-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$GT']!=null">-->
+                <!--AND `${$tableName}`.`${item}` &gt;=#{term.${item+'$GT'}}-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$LT']!=null">-->
+                <!--AND `${$tableName}`.`${item}` &lt;=#{term.${item+'$LT'}}-->
+            <!--</if>-->
+        <!--</foreach>-->
         <!--动态生成查询条件结束-->
     </sql>
     <!--生成查询字段-->
@@ -172,7 +176,8 @@
         <include refid="BasicMapper.buildSelectField"/>
         from ${$tableName}
         <where>
-            <include refid="BasicMapper.buildWhere"/>
+            <include refid="BasicMapper.buildWhereV2"/>
+            <!--<include refid="BasicMapper.buildWhere"/>-->
         </where>
         <include refid="BasicMapper.buildSortField"/>
     </sql>
@@ -190,7 +195,8 @@
         update ${$tableName}
         <include refid="BasicMapper.buildUpdateField"/>
         <where>
-            <include refid="BasicMapper.buildWhere"/>
+            <include refid="BasicMapper.buildWhereV2"/>
+            <!--<include refid="BasicMapper.buildWhere"/>-->
             <if test="term.size()==0">
                 u_id=#{data.u_id}
             </if>
@@ -201,7 +207,8 @@
     <sql id="buildTotalSql">
         select count(0) as "total" from ${$tableName}
         <where>
-            <include refid="BasicMapper.buildWhere"/>
+            <include refid="BasicMapper.buildWhereV2"/>
+            <!--<include refid="BasicMapper.buildWhere"/>-->
         </where>
     </sql>
 </mapper>

+ 76 - 68
hsweb-web-dao-impl-mybatis/src/main/resources/org/hsweb/web/dao/impl/mybatis/mapper/oracle/basic/BasicMapper.xml

@@ -3,73 +3,78 @@
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://www.mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="BasicMapper">
+    <sql id="buildWhereV2">
+        ${@org.hsweb.web.mybatis.builder.DefaultSqlParamBuilder@instance().buildWhere($fieldsInfo,#this['_parameter'].terms)}
+    </sql>
+
     <!--通用查询条件-->
     <sql id="buildWhere">
+        <include refid="BasicMapper.buildWhereV2"/>
         <!--动态生成查询条件-->
-        <foreach item="item" index="index" collection="$fields">
-            <if test="#this['term.'+item]!=null">
-                <choose>
-                    <when test="$fieldsInfo[item]['javaType'] == 'date' ">
-                        AND ${$tableName}.${item}=to_date(#{term.${item}},'YYYY-MM-DD HH24:MI:SS')
-                    </when>
-                    <otherwise>AND ${$tableName}.${item}=#{term.${item}}</otherwise>
-                </choose>
-            </if>
-            <if test="#this['term.'+item+'$NOT']!=null">
-                <choose>
-                    <when test="$fieldsInfo[item]['javaType'] == 'date' ">
-                        AND ${$tableName}.${item}!=to_date(#{term.${item+'$NOT'}},'YYYY-MM-DD HH24:MI:SS')
-                    </when>
-                    <otherwise>AND ${$tableName}.${item}!=#{term.${item+'$NOT'}}</otherwise>
-                </choose>
-            </if>
-            <if test="#this['term.'+item+'$LIKE']!=null">
-                AND ${$tableName}.${item} like #{term.${item+'$LIKE'}}
-            </if>
-            <if test="#this['term.'+item+'$NOTLIKE']!=null">
-                AND ${$tableName}.${item} not like #{term.${item+'$LIKE'}}
-            </if>
-            <if test="#this['term.'+item+'$IN']!=null">
-                AND ${$tableName}.${item} IN
-                <foreach item="it" index="i" collection="#this['term.'+item+'$IN']" open="(" separator="," close=")">
-                    #{it}
-                </foreach>
-            </if>
-            <if test="#this['term.'+item+'$NOTIN']!=null">
-                AND ${$tableName}.${item} NOT IN
-                <foreach item="it" index="i" collection="#this['term.'+item+'$NOTIN']" open="(" separator="," close=")">
-                    #{it}
-                </foreach>
-            </if>
-            <if test="#this['term.'+item+'$ISNULL']!=null">
-                AND ${$tableName}.${item} IS NULL
-            </if>
-            <if test="#this['term.'+item+'$NOTNULL']!=null">
-                AND ${$tableName}.${item} IS NOT NULL
-            </if>
-            <if test="#this['term.'+item+'$GT']!=null">
-                <choose>
-                    <when test="$fieldsInfo[item]['javaType'] == 'date' ">
-                        AND ${$tableName}.${item} &gt;=to_date(#{term.${item+'$GT'}},'YYYY-MM-DD HH24:MI:SS')
-                    </when>
-                    <when test="$fieldsInfo[item]['javaType'] == 'number' ">
-                        AND ${$tableName}.${item} &gt;=#{term.${item+'$GT'}}
-                    </when>
-                    <otherwise></otherwise>
-                </choose>
-            </if>
-            <if test="#this['term.'+item+'$LT']!=null">
-                <choose>
-                    <when test="$fieldsInfo[item]['javaType'] == 'date' ">
-                        AND ${$tableName}.${item} &lt;=to_date(#{term.${item+'$LT'}},'YYYY-MM-DD HH24:MI:SS')
-                    </when>
-                    <when test="$fieldsInfo[item]['javaType'] == 'number' ">
-                        AND ${$tableName}.${item} &lt;=#{term.${item+'$LT'}}
-                    </when>
-                    <otherwise></otherwise>
-                </choose>
-            </if>
-        </foreach>
+        <!--<foreach item="item" index="index" collection="$fields">-->
+            <!--<if test="#this['term.'+item]!=null">-->
+                <!--<choose>-->
+                    <!--<when test="$fieldsInfo[item]['javaType'] == 'date' ">-->
+                        <!--AND ${$tableName}.${item}=to_date(#{term.${item}},'YYYY-MM-DD HH24:MI:SS')-->
+                    <!--</when>-->
+                    <!--<otherwise>AND ${$tableName}.${item}=#{term.${item}}</otherwise>-->
+                <!--</choose>-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$NOT']!=null">-->
+                <!--<choose>-->
+                    <!--<when test="$fieldsInfo[item]['javaType'] == 'date' ">-->
+                        <!--AND ${$tableName}.${item}!=to_date(#{term.${item+'$NOT'}},'YYYY-MM-DD HH24:MI:SS')-->
+                    <!--</when>-->
+                    <!--<otherwise>AND ${$tableName}.${item}!=#{term.${item+'$NOT'}}</otherwise>-->
+                <!--</choose>-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$LIKE']!=null">-->
+                <!--AND ${$tableName}.${item} like #{term.${item+'$LIKE'}}-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$NOTLIKE']!=null">-->
+                <!--AND ${$tableName}.${item} not like #{term.${item+'$LIKE'}}-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$IN']!=null">-->
+                <!--AND ${$tableName}.${item} IN-->
+                <!--<foreach item="it" index="i" collection="#this['term.'+item+'$IN']" open="(" separator="," close=")">-->
+                    <!--#{it}-->
+                <!--</foreach>-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$NOTIN']!=null">-->
+                <!--AND ${$tableName}.${item} NOT IN-->
+                <!--<foreach item="it" index="i" collection="#this['term.'+item+'$NOTIN']" open="(" separator="," close=")">-->
+                    <!--#{it}-->
+                <!--</foreach>-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$ISNULL']!=null">-->
+                <!--AND ${$tableName}.${item} IS NULL-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$NOTNULL']!=null">-->
+                <!--AND ${$tableName}.${item} IS NOT NULL-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$GT']!=null">-->
+                <!--<choose>-->
+                    <!--<when test="$fieldsInfo[item]['javaType'] == 'date' ">-->
+                        <!--AND ${$tableName}.${item} &gt;=to_date(#{term.${item+'$GT'}},'YYYY-MM-DD HH24:MI:SS')-->
+                    <!--</when>-->
+                    <!--<when test="$fieldsInfo[item]['javaType'] == 'number' ">-->
+                        <!--AND ${$tableName}.${item} &gt;=#{term.${item+'$GT'}}-->
+                    <!--</when>-->
+                    <!--<otherwise></otherwise>-->
+                <!--</choose>-->
+            <!--</if>-->
+            <!--<if test="#this['term.'+item+'$LT']!=null">-->
+                <!--<choose>-->
+                    <!--<when test="$fieldsInfo[item]['javaType'] == 'date' ">-->
+                        <!--AND ${$tableName}.${item} &lt;=to_date(#{term.${item+'$LT'}},'YYYY-MM-DD HH24:MI:SS')-->
+                    <!--</when>-->
+                    <!--<when test="$fieldsInfo[item]['javaType'] == 'number' ">-->
+                        <!--AND ${$tableName}.${item} &lt;=#{term.${item+'$LT'}}-->
+                    <!--</when>-->
+                    <!--<otherwise></otherwise>-->
+                <!--</choose>-->
+            <!--</if>-->
+        <!--</foreach>-->
         <!--动态生成查询条件结束-->
     </sql>
     <!--生成查询字段-->
@@ -199,7 +204,8 @@
         <include refid="BasicMapper.buildSelectField"/>
         from ${$tableName}
         <where>
-            <include refid="BasicMapper.buildWhere"/>
+            <include refid="BasicMapper.buildWhereV2"/>
+            <!--<include refid="BasicMapper.buildWhere"/>-->
         </where>
         <include refid="BasicMapper.buildSortField"/>
     </sql>
@@ -217,8 +223,9 @@
         update ${$tableName}
         <include refid="BasicMapper.buildUpdateField"/>
         <where>
-            <include refid="BasicMapper.buildWhere"/>
-            <if test="term.size()==0">
+            <include refid="BasicMapper.buildWhereV2"/>
+            <!--<include refid="BasicMapper.buildWhere"/>-->
+            <if test="terms.size()==0">
                 u_id=#{data.u_id}
             </if>
         </where>
@@ -228,7 +235,8 @@
     <sql id="buildTotalSql">
         select count(0) as "total" from ${$tableName}
         <where>
-            <include refid="BasicMapper.buildWhere"/>
+            <include refid="BasicMapper.buildWhereV2"/>
+            <!--<include refid="BasicMapper.buildWhere"/>-->
         </where>
     </sql>
 </mapper>