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
* Description: sqlWhere条件生成器
* Company: www.yiyikefu.com
*
* @author xsy 906726786@qq.com
* @date 2015年11月27日 下午10:10:36
* @version 1.0
*/
public class SqlCondition {
public static final int FUZZY_FULL = 1 <
public static final int FUZZY_LEFT = 1 <
public static final int FUZZY_RIGHT = 1 <
public static final int FUZZY_NO = 1 <
private List values = null;// sql中?(变量)代表的值
public List getValues() {
return values;
}
/**
*
* TODO 查询条件 xsy
*
* @param rec
* 键值对:键是字段名,值是相应的值
* @param sqlMap
* 键值对:键代表字段名,值是相应的语句和查询类型
* @return
*/
public StringBuilder buildSqlWhere(Map rec, Map sqlMap) {
StringBuilder sql_where = new StringBuilder();// 初始化sql语句where部分
if (rec != null) {
Set attrNameSet = rec.keySet();
String[] names = attrNameSet.toArray(new String[attrNameSet.size()]);
List values = new ArrayList();// 初始化,代表的值列表
for (int i = 0; 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
* Description:SqlCondition测试
*
* @param args
*/
public static void main(String[] args) {
// 筛选条件 放进null 或者"" 该条件不起作用
Map rec = new HashMap<>();
rec.put("hobby", null);// 该条件不起作用 不管男女
rec.put("grade", "");// 该条件不起作用 不管成绩
rec.put("name", "张三");// 筛选名字叫张三
rec.put("sex", 0);// 同时筛选性别为男的
List values = new ArrayList();
SqlCondition conditions = new SqlCondition();
Map sqlMap = new HashMap();
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();
}
}