sqlCondition where條件生成器 主要用於表格篩選

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();
	}
}
相關文章
相關標籤/搜索