sqlCondition where条件生成器 主要用于表格筛选

本文介绍了一个用于生成SQL WHERE条件的工具类,它支持模糊匹配(如%xxx%、%xxx、xxx%等)并能根据查询类型调整匹配方式。通过实例演示如何将键值对映射转化为SQL语句,实现灵活的数据筛选。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.yiyikefu.sqlconditionkit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * 
 * Title: SqlCondition.java<br />
 * Description: sqlWhere条件生成器<br />
 * Company: www.yiyikefu.com<br />
 * 
 * @author xsy 906726786@qq.com
 * @date 2015年11月27日 下午10:10:36
 * @version 1.0 <br>
 */
public class SqlCondition {
	public static final int FUZZY_FULL = 1 << 0; // 1:为模糊匹配 %xxx%
	public static final int FUZZY_LEFT = 1 << 1; // 2:为左模糊 %xxx
	public static final int FUZZY_RIGHT = 1 << 2;// 4:为右模糊 xxx%
	public static final int FUZZY_NO = 1 << 3; // 8:为不模糊 xxx
	private List<Object> values = null;// sql中?(变量)代表的值
	public List<Object> getValues() {
		return values;
	}
	/**
	 * 
	 * TODO 查询条件 xsy
	 * 
	 * @param rec
	 *            键值对:键是字段名,值是相应的值
	 * @param sqlMap
	 *            键值对:键代表字段名,值是相应的语句和查询类型
	 * @return
	 */
	public StringBuilder buildSqlWhere(Map<String, Object> rec, Map<String, Pair> sqlMap) {
		StringBuilder sql_where = new StringBuilder();// 初始化sql语句where部分
		if (rec != null) {
			Set<String> attrNameSet = rec.keySet();
			String[] names = attrNameSet.toArray(new String[attrNameSet.size()]);
			List<Object> values = new ArrayList<Object>();// 初始化,代表的值列表
			for (int i = 0; i < names.length; i++) {
				String name = names[i];
				Object _value = rec.get(name);// 获取字段名所代表的值
				if (null == _value || "" == _value.toString()) {
					continue;// 如果为null,退出本次循环。
				}
				Pair pair = sqlMap.get(name);// 获取key对应的value值
				if (pair == null) {// 值不存在,则抛异常
					throw new NullPointerException("输入的字段对应的value不存在:" + name);
				}
				String sql = pair.sql;
				if (sql == null) {
					throw new NullPointerException("conditions条件中sql语句未传入:" + name);
				}
				if (i == 0 && sql.toLowerCase().indexOf("where") == -1 && sql.toLowerCase().indexOf("and") != -1) {
					sql = sql.toLowerCase().replaceFirst("and", "WHERE");
				}
				int queryType = pair.queryType;// 模糊类型
				if (queryType == FUZZY_NO) {
					sql_where.append(" " + sql + "  ");
					values.add(_value);
				} else {
					sql_where.append(" " + sql + "  ");
					values.add(setQueryType(_value, queryType));
				}
			}
			this.values = values;
		}
		return sql_where;
	}
	/**
	 * 
	 * TODO 根据查询类型加参数值
	 *
	 * xsy
	 * 
	 * @param queryType
	 *            查询类型
	 * @param value
	 *            参数值
	 */
	public static String setQueryType(Object value, int queryType) {
		if (FUZZY_FULL == queryType) {
			return "%" + value + "%";
		} else if (FUZZY_LEFT == queryType) {
			return "%" + value;
		} else if (FUZZY_RIGHT == queryType) {
			return value + "%";
		} else {
			return value.toString();
		}
	}
	public static class Pair {
		public String sql = null;
		public int queryType = FUZZY_NO;
		public Pair(String sql) {
			this.sql = sql;
		}
		public Pair(String sql, int queryType) {
			this.sql = sql;
			this.queryType = queryType;
		}
	}
	/**
	 * 
	 * xsy<br />
	 * Description:SqlCondition测试 <br />
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// 筛选条件 放进null 或者"" 该条件不起作用
		Map<String, Object> rec = new HashMap<>();
		rec.put("hobby", null);// 该条件不起作用 不管男女
		rec.put("grade", "");// 该条件不起作用 不管成绩
		rec.put("name", "张三");// 筛选名字叫张三
		rec.put("sex", 0);// 同时筛选性别为男的
		List<Object> values = new ArrayList<Object>();
		SqlCondition conditions = new SqlCondition();
		Map<String, Pair> sqlMap = new HashMap<String, Pair>();
		sqlMap.put("sex", new Pair("AND hosp_id like ?"));// 测试成功
		sqlMap.put("hcheck_code", new Pair("AND hcheck_code like ?", SqlCondition.FUZZY_RIGHT));// 模糊筛选
		StringBuilder sqlWhere = conditions.buildSqlWhere(rec, sqlMap);
		values = conditions.getValues();
		System.out.println(sqlWhere);
		System.out.println(values);
		// values.toArray() 变量值的数组
		// 使用的时候记得 sql_select + sql_from+sql_where , values.toArray();
	}
}



转载于:https://my.oschina.net/u/2477353/blog/536657

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值