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(); } }