mysql where 拼接_分一个mysql拼接where语句的Directive,并请教一个问题
/**
*
* 拼接Where的指令,較簡單的where組裝,如果復雜的請在模版直接寫where 語句
* @author xianyl
* @since 2018年1月26日-下午8:57:02
*/
public class WhereDirective extends Directive {
//運算符號集合、邏輯符號集合、between條件集合,字段名
public static final String KV_SIGNS = "kv_signs";
public static final String KV_LOGICS = "kv_logics";
public static final String KV_BETWEEN = "kv_between";
public void exec(Env env, Scope scope, Writer writer) {
SqlPara sqlPara = (SqlPara)scope.get("_SQL_PARA_");//SqlKit.SQL_PARA_KEY 需要跟它一致
if (sqlPara == null) {
throw new TemplateException("#where directive invoked by getSqlPara(...) method only", location);
}
//獲取參數
Map data = null;
Kv signs = null, logics = null, between = null;
try {
Record record = (Record)exprList.eval(scope);
data = record.getColumns();
signs = (Kv) data.remove(KV_SIGNS);
logics = (Kv) data.remove(KV_LOGICS);
between = (Kv) data.remove(KV_BETWEEN);
} catch (Exception e) {
}
//判斷參數不能為null 并且只能是Record
if(MapUtils.isEmpty(data)) return;
StringBuilder sb = new StringBuilder();
//循環拼接參數
Object logic;
Object sign;
for(Entry d : data.entrySet()){
Object _end = null;
//判斷邏輯符號
if(logics == null){
logic = LogicsSymbol.And;//沒有邏輯符號集合,這是and
}else{
logic = logics.get(d.getKey());
if(logic == null){
logic = LogicsSymbol.And;//沒有對應字段的邏輯符號,這是and
}
}
//判斷運算符號
if(signs == null){
sign = SignsSymbol.Eq;//沒有運算符號集合,這是eq
}else{
sign = signs.get(d.getKey());
if(sign == null){
//沒有對應字段的運算符號,這是eq
sign = SignsSymbol.Eq;
}
if(sign == SignsSymbol.Between){
//如果是between運算符號,需要檢查between里面的field_end的數據取出
_end = between == null ? null : between.get(d.getKey() + "_end");
}
}
//拼接條件
this.join(sb,sqlPara,d.getKey(),d.getValue(),logic,sign,_end);
}
//寫where
write(writer, sb.toString());
}
/**
* 拼接其中一個條件語句
* @param sb
* @param sqlPara
* @param key? 字段名
* @param value 字段值
* @param logic 邏輯符號
* @param sign 運算符號
* @param _end between時字段的第二個值
*/
private void join(StringBuilder sb, SqlPara sqlPara, String key, Object value, Object logic, Object sign, Object _end) {
//第一時間判斷_end 是否為null, 如果是 SignsSymbol.Between 轉成 SignsSymbol.Gte
if(sign == SignsSymbol.Between && _end == null){
sign = SignsSymbol.Gte;
}
//拼接邏輯符號
if(sb.length() == 0){
if(logic == LogicsSymbol.And){
sb.append(" where ");
}else{
sb.append(" where 1=1 ").append(logic);
}
}else{
sb.append(" ").append(logic);
}
//拼接參數
sb.append(" ").append(key).append(" ").append(sign).append(" ").append("?");
sqlPara.addPara(sign == SignsSymbol.Like ? "%"+value+"%" :value);
if(sign == SignsSymbol.Between){
//如果between
sb.append(" and ").append("?");
sqlPara.addPara(_end);
}
}
}模版?:
#namespace("user")
#sql("list")
select?*?from?user?#where(data)
#end
#end
java調用方法:
/**
*?根據模板動態生成?sql?跟參數
*?@param?key??模板名?namespace.sql
*?@param?record?查詢條件?鍵值對
*?@param?signs?運算符號集合??{"field":SignsSymbol.Gt}?,?如果沒有,則為Eq
*?@param?logics?邏輯符號集合?{"field":LogicsSymbol.And},?如果沒有,則為Or
*?@param?between?between條件集合?{"field_end":value},?signs為between時檢查這個,如果沒有指定的field_end,則轉為Gte運算符號
*?@return
*/
public?SqlPara?getSqlPara(String?key,?Record?data,?Kv?signs,?Kv?logics,?Kv?between){
//這幾個字段名需要跟WhereDirective里面的對應起來
data.set(WhereDirective.KV_SIGNS,?signs);
data.set(WhereDirective.KV_LOGICS,?logics);
data.set(WhereDirective.KV_BETWEEN,?between);
//data跟sql模版的參數對應起來
return?Db.getSqlPara(key,?Kv.by("data",?data));
}
總結
以上是生活随笔為你收集整理的mysql where 拼接_分一个mysql拼接where语句的Directive,并请教一个问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据中文乱码_win10 系统
- 下一篇: centos6 mysql 导出sql_