生成jFinal的动态条件查询语句的工具类

因为有时候需要根据前台的多个条件来过滤数据!因此需要根据是否有值以及当前值是以什么方式来过滤。这样我们不可能一个一个值来判断吧!这样代码就有些难看了!而jFinal也没有提供这样的方法,而网上的一些解决方法感觉不太好用麻烦而且不够灵活!基于这个考虑我就自己写了一个工具类!目前来说用着还挺方便的!如果有什么不对或者改进的地方请指正,大家共同进步!

/**
 * 用于生成JFinal的SQL查询语句<br>

 * 类名称:Conditions<br>
 * 创建人:yangxp<br>
 * 创建时间:2014-1-19 上午11:22:26<br>
 * 
 * @version v1.0.9
 * 
 */
public class Conditions {
    static Logger log = Logger.getLogger(Conditions.class);
    public static final String EQUAL = "EQUAL"; // 相等
    public static final String NOT_EQUAL = "NOT_EQUAL"; // 不相等
    public static final String LESS_THEN = "LESS_THEN"; // 小于
    public static final String LESS_EQUAL = "LESS_EQUAL"; // 小于等于
    public static final String GREATER_EQUAL = "GREATER_EQUAL"; // 大于等于
    public static final String GREATER_THEN = "GREATER_THEN"; // 大于
    public static final String FUZZY = "FUZZY"; // 模糊匹配 %xxx%
    public static final String FUZZY_LEFT = "FUZZY_LEFT"; // 左模糊 %xxx
    public static final String FUZZY_RIGHT = "FUZZY_RIGHT"; // 右模糊 xxx%
    public static final String NOT_EMPTY = "NOT_EMPTY"; // 不为空值的情况
    public static final String EMPTY = "EMPTY"; // 空值的情况
    // 用于接收SQL语句
    private ThreadLocal<String> sql = new ThreadLocal<String>();
    // 用于接收参数数组
    private ThreadLocal<List<Object>> paramList = new ThreadLocal<List<Object>>();
    // 用于存放设置的条件
    private ThreadLocal<Map<String, Object[]>> conditionMap = new ThreadLocal<Map<String, Object[]>>();
    // 用于存放需要排除的字段
    private ThreadLocal<Map<String, String>> excludeFieldMap = new ThreadLocal<Map<String, String>>();
    // 构造方法(表示没有设置查询类型的字段全部按照等于来处理)
    public Conditions() {
        conditionMap.set(new HashMap<String, Object[]>());
        excludeFieldMap.set(new HashMap<String, String>());
    }
    // 构造方法(设置后表示字段所有的查询方式按照设置类型来处理,除非后面针对字段的重新设置)
    public Conditions(String type) {
        Map<String, Object[]> map = new HashMap<String, Object[]>();
        map.put("GLOBALTYPE", new String[] { type });
        conditionMap.set(map);
        excludeFieldMap.set(new HashMap<String, String>());
    }
    /***************************************************************************
     * 设置字段的查询类型
     * 
     * @param QueryType
     *            查询类型
     * @param fieldName
     *            字段名称数组
     */
    public void setFiledQuery(String QueryType, String... filedName) {
        if (StringUtils.isNotBlank(QueryType) && !Common.isNullOrEmpty(filedName)) {
            Map<String, Object[]> map = conditionMap.get();
            map.put(QueryType, filedName);
            conditionMap.set(map);
        }
    }
    /***************************************************************************
     * 设置需要排除的字段
     * 
     * setexcludeField<br>
     * 
     * @param 参数说明
     * @return 返回对象
     * @Exception 异常对象
     * 
     */
    public void setExcludeField(String... filedName) {
        if (!Common.isNullOrEmpty(filedName)) {
            Map<String, String> map = excludeFieldMap.get();
            for (String str : filedName) {
                map.put(str, str);
            }
            excludeFieldMap.set(map);
        }
    }
    /***************************************************************************
     * 查询空值或者不为空值的情况 setNullFieldQuery
     * 
     * @param 参数说明
     * @return 返回对象
     * @Exception 异常对象
     */
    public void setNullOrNotNullFieldQuery(String QueryType, String... filedName) {
        if (StringUtils.isNotBlank(QueryType) && !Common.isNullOrEmpty(filedName)) {
            if (!NOT_EMPTY.equals(QueryType) && !EMPTY.equals(QueryType)) {
                log.error("空值或者非空查询的类型只能为:EMPTY、NOT_EMPTY");
                throw new RuntimeException("空值或者非空查询的类型只能为:EMPTY、NOT_EMPTY");
            }
            Map<String, Object[]> map = conditionMap.get();
            map.put(QueryType, filedName);
            conditionMap.set(map);
        }
    }
    /***************************************************************************
     * 传值查询
     * 
     * @param QueryType
     *            查询类型
     * @param fieldName
     *            字段名称
     * @param filedValue
     *            字段值
     */
    public void setValueQuery(String QueryType, String fieldName, Object filedValue) {
        if (StringUtils.isNotBlank(QueryType) && StringUtils.isNotBlank(fieldName) && Common.isNullOrEmpty(filedValue)) {
            Object[] param = new Object[2];
            param[0] = fieldName; // 字段名
            param[1] = filedValue;// 字段值
            Map<String, Object[]> map = conditionMap.get();
            map.put(QueryType + "#" + fieldName, param);// 避免类型重复被覆盖掉就加上字段名
            conditionMap.set(map);
        }
    }
    /***************************************************************************
     * 用于生成SQL条件语句不带别名
     * 
     * @param modelClass
     *            必须继承于Model
     */
    public void modelToCondition(Model<?> modelClass) {
        modelToCondition(modelClass, null);
    }
    /***************************************************************************
     * 用于生成SQL条件语句不带别名
     * 
     * @param RecordClass
     *            必须是一个Record类
     */
    public void recordToCondition(Record recordClass) {
        recordToCondition(recordClass, null);
    }
    /***************************************************************************
     * 用于生成SQL条件语句带别名
     * 
     * @param modelClass
     *            必须继承于Model
     * @param alias
     *            别名
     */
    public void modelToCondition(Model<?> modelClass, String alias) {
        alias = StringUtils.isNotBlank(alias) ? alias + "." : "";
        if (modelClass != null) {
            // 所有的字段
            String[] fieldNames = modelClass.getAttrNames();
            // 字段名和值的map集合
            Map<String, Object> valueMap = Common.modelToMap(modelClass);
            // 构建查询条件
            buildCondition(alias, fieldNames, valueMap);
        } else {
            if (!conditionMap.get().isEmpty()) {
                buildCondition(alias, new String[] {}, new HashMap<String, Object>());
            } else {
                sql.set("");
                paramList.set(new ArrayList<Object>());
            }
        }
    }
    /***************************************************************************
     * 用于生成SQL条件语句不带别名
     * 
     * @param RecordClass
     *            必须是一个Record类
     * @param alias
     *            别名
     */
    public void recordToCondition(Record recordClass, String alias) {
        // 别名
        alias = StringUtils.isNotBlank(alias) ? alias + "." : "";
        if (recordClass != null) {
            // 所有的字段
            String[] fieldNames = recordClass.getColumnNames();
            // 字段名和值的map集合
            Map<String, Object> valueMap = Common.recordToMap(recordClass);
            // 构建查询条件
            buildCondition(alias, fieldNames, valueMap);
        } else {
            if (!conditionMap.get().isEmpty()) {
                buildCondition(alias, new String[] {}, new HashMap<String, Object>());
            } else {
                sql.set("");
                paramList.set(new ArrayList<Object>());
            }
        }
    }
    /***************************************************************************
     * 构建条件语句
     * 
     * @param resultMap
     *            用于返回结果的map
     * @param alias
     *            别名
     * @param fieldNames
     *            所有查询的字段名称
     * @param valueMap
     *            所有的值的map
     */
    private void buildCondition(String alias, String[] fieldNames, Map<String, Object> valueMap) {
        try {
            // 构建条件前先清空变量
            sql.set("");
            paramList.set(new ArrayList<Object>());
            // 用于存放参数列表
            ArrayList<Object> paramArrayList = new ArrayList<Object>();
            StringBuilder sb = new StringBuilder();
            // 所有的字段名称
            Map<String, String> usedFieldMap = new HashMap<String, String>();
            if (!conditionMap.get().isEmpty()) {
                for (Entry<String, Object[]> map : conditionMap.get().entrySet()) {
                    String queryType = map.getKey();
                    Object[] array = map.getValue();
                    if (queryType.indexOf("#") > 0) {// 传值查询
                        String fieldQueryType = queryType.split("#")[0];
                        String fieldName = array[0] != null ? array[0].toString() : "";
                        Object fieldValue = array[1];
                        // 将设置过的字段保存到数组中
                        usedFieldMap.put(fieldName, fieldName);
                        // 构建SQL语句
                        buildSQL(sb, fieldQueryType, fieldName, fieldValue, alias, paramArrayList);
                    } else {// 字段查询
                        for (Object field : array) {
                            String filedName = field != null ? field.toString() : "";
                            if (!excludeFieldMap.get().containsKey(filedName)) {
                                Object fieldValue = valueMap.get(filedName);
                                // 将设置过的字段保存到数组中
                                usedFieldMap.put(filedName, filedName);
                                // 构建查询语句
                                buildSQL(sb, queryType, filedName, fieldValue, alias, paramArrayList);
                            }
                        }
                    }
                }
            }
            // 对没有设置条件的字段进行查询类型设置
            String queryType = EQUAL;
            if (conditionMap.get().containsKey("GLOBALTYPE")) {
                String[] typeArray = (String[]) conditionMap.get().get("QueryType");
                queryType = typeArray[0];
            }
            // 对未使用过的字段进行build
            for (String field : fieldNames) {
                if (!usedFieldMap.containsKey(field)) {
                    Object fieldValue = valueMap.get(field);
                    // 构建查询语句
                    buildSQL(sb, queryType, field, fieldValue, alias, paramArrayList);
                }
            }
            // 合并传入的参数到参数对象中
            sql.set(sb.toString());
            paramList.set(paramArrayList);
            conditionMap.set(new HashMap<String, Object[]>());// 清空本次的条件map
            excludeFieldMap.set(new HashMap<String, String>());// 清空本次的排除字段
        } catch (Exception e) {
            log.error("Conditions构建SQL语句出现错误,请仔细检查!");
            e.printStackTrace();
        }
    }
    /***************************************************************************
     * 构建SQL语句
     * 
     * @param sb
     *            用于拼接SQL语句
     * @param queryType
     *            查询类型
     * @param fieldName
     *            字段名称
     * @param fieldValue
     *            字段值
     * @param alias
     *            别名
     * @return
     */
    private void buildSQL(StringBuilder sb, String queryType, String fieldName, Object fieldValue, String alias, ArrayList<Object> params) {
        // 非空的时候进行设置
        if (!Common.isNullOrEmpty(fieldValue) && !Common.isNullOrEmpty(fieldName)) {
            if (EQUAL.equals(queryType)) {
                sb.append(" and " + alias + fieldName + " = ? ");
                params.add(fieldValue);
            } else if (NOT_EQUAL.equals(queryType)) {
                sb.append(" and " + alias + fieldName + " <> ? ");
                params.add(fieldValue);
            } else if (LESS_THEN.equals(queryType)) {
                sb.append(" and " + alias + fieldName + " < ? ");
                params.add(fieldValue);
            } else if (LESS_EQUAL.equals(queryType)) {
                sb.append(" and " + alias + fieldName + " <= ? ");
                params.add(fieldValue);
            } else if (GREATER_THEN.equals(queryType)) {
                sb.append(" and " + alias + fieldName + " > ? ");
                params.add(fieldValue);
            } else if (GREATER_EQUAL.equals(queryType)) {
                sb.append(" and " + alias + fieldName + " >= ? ");
                params.add(fieldValue);
            } else if (FUZZY.equals(queryType)) {
                sb.append(" and " + alias + fieldName + " like ? ");
                params.add("%" + fieldValue + "%");
            } else if (FUZZY_LEFT.equals(queryType)) {
                sb.append(" and " + alias + fieldName + " like ? ");
                params.add("%" + fieldValue);
            } else if (FUZZY_RIGHT.equals(queryType)) {
                sb.append(" and " + alias + fieldName + " like ? ");
                params.add(fieldValue + "%");
            }
        } else {
            if (EMPTY.equals(queryType)) {
                sb.append(" and " + alias + fieldName + " is null ");
            } else if (NOT_EMPTY.equals(queryType)) {
                sb.append(" and " + alias + fieldName + " is not null ");
            }
        }
    }
    public String getSql() {
        return sql.get();
    }
    public List<Object> getParamList() {
        return paramList.get();
    }
}

生成jFinal的动态条件查询语句的工具类,布布扣,bubuko.com

时间: 2024-10-24 14:58:13

生成jFinal的动态条件查询语句的工具类的相关文章

【Oracle】曾经的Oracle学习笔记(4-7)多表联合查询,子查询,动态条件查询

一.多表联合查询 二.子查询 三.动态条件查询 LESSON 4 Displaying Data from Multiple Tables-------------------------------------------------------- 查询s_emp表中最大的工资数,并且显示出这个最大工资数的员工名字 select last_name,max(salary)from s_emp; 多表查询 查询多张表的时候会产生笛卡尔积 为了防止笛卡尔积的产生,我们需要使用某些条件把两张表或多张

EF 拉姆达 动态拼接查询语句

EF 动态拼接查询语句 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Security.Cryptography; using System.Text; namespace Aliexpress.Common.CommonHelper { //public static class Pre

Jfinal用拼接sql用的Conditions工具类

package cn.jiayi.framework.kit.sql; import cn.jiayi.web.kit.commons.StringKit; import com.jfinal.log.Logger; import com.jfinal.plugin.activerecord.Model; import com.jfinal.plugin.activerecord.Record; import java.util.ArrayList; import java.util.HashM

spring-data-jpa动态条件查询

//获取动态条件的集合List<Long> list = new ArrayList<Long>(); Long sysUserId = currentUser.getSysUserId(); if (sysUserId != null) { SysUser sysUser = sysUserRepository.findOne(sysUserId); if (sysUser != null) { String groupItemIds = sysUser.groupItemIds

mysql查询语句优化工具

把这个profiling功能打开,可以查看sql查询语句的整个过程中各种资源的消耗情况. mysql> show profiles;+----------+------------+---------------------------------+| Query_ID | Duration   | Query                           |+----------+------------+---------------------------------+|      

Java并发:线程间同步-条件队列和同步工具类

转载请注明出处: jiq?钦's technical Blog - 季义钦 线程之间的同步,除了互斥(前面介绍的互斥锁)之外,还存在协作关系,下面我们就介绍一下java线程间常见的一些协作方式. 一.内置条件队列 正如每个Java对象都可以作为一个内置锁,每个对象也可以作为一个条件队列,称为内置条件队列,Object.wait().notify()/notifyAll()构成了内置条件队列的API. 需要注意的是,调用任何对象X的内置条件队列的API都必须要先获得该对象X的内置锁. 1.API介

java动态条件查询sql语句

select*fromtablewhere1=1<if test="tUserId!=null and tUserId!=''">and t_user_id=#{tUserId}</if><if test="toolCode!=null and toolCode!=''">and .tool_code=#{toolCode}</if><if test="workCode!=null and workCo

获取动态SQL查询语句返回值(sp_executesql)

在写存储过程时经常会遇到需要拼接SQL语句的情况,一般情况下仅仅是为了执行拼接后的语句使用exec(@sql)即可. 而今天的一个存储过程却需要获取动态SQL的查询结果. 需求描述:在某表中根据Id值查询Cost值(表名不确定但表结构确定,如下面的Product表) 如果不考虑获取返回值,我们这样写即可: declare @tableName varchar(50) declare @id varchar(10) declare @cost numeric(18,2) declare @sql

[C#] Linq 动态条件查询

应用背景:以货品为例,在基础数据中配置货品的判断规则,要根据这个规则筛选出符合条件的集合. 创建货品类 public class Product { public string Name { get; set; } public string Code { get; set; } public string Unit { get; set; } } 主要实现方法 public void GetProducts() { #region 创建List 实际应用从数据库中取值 var products