日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

mysql where 拼接_分一个mysql拼接where语句的Directive,并请教一个问题

發布時間:2024/9/30 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,并请教一个问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。