日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時間:2024/9/30 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql where 拼接_分一个mysql拼接where语句的Directive,并请教一个问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

/**

*

* 拼接Where的指令,較簡單的where組裝,如果復(fù)雜的請在模版直接寫where 語句

* @author xianyl

* @since 2018年1月26日-下午8:57:02

*/

public class WhereDirective extends Directive {

//運(yùn)算符號集合、邏輯符號集合、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);

}

//獲取參數(shù)

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) {

}

//判斷參數(shù)不能為null 并且只能是Record

if(MapUtils.isEmpty(data)) return;

StringBuilder sb = new StringBuilder();

//循環(huán)拼接參數(shù)

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;//沒有對應(yīng)字段的邏輯符號,這是and

}

}

//判斷運(yùn)算符號

if(signs == null){

sign = SignsSymbol.Eq;//沒有運(yùn)算符號集合,這是eq

}else{

sign = signs.get(d.getKey());

if(sign == null){

//沒有對應(yīng)字段的運(yùn)算符號,這是eq

sign = SignsSymbol.Eq;

}

if(sign == SignsSymbol.Between){

//如果是between運(yùn)算符號,需要檢查between里面的field_end的數(shù)據(jù)取出

_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 運(yùn)算符號

* @param _end between時字段的第二個值

*/

private void join(StringBuilder sb, SqlPara sqlPara, String key, Object value, Object logic, Object sign, Object _end) {

//第一時間判斷_end 是否為null, 如果是 SignsSymbol.Between 轉(zhuǎn)成 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);

}

//拼接參數(shù)

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調(diào)用方法:

/**

*?根據(jù)模板動態(tài)生成?sql?跟參數(shù)

*?@param?key??模板名?namespace.sql

*?@param?record?查詢條件?鍵值對

*?@param?signs?運(yùn)算符號集合??{"field":SignsSymbol.Gt}?,?如果沒有,則為Eq

*?@param?logics?邏輯符號集合?{"field":LogicsSymbol.And},?如果沒有,則為Or

*?@param?between?between條件集合?{"field_end":value},?signs為between時檢查這個,如果沒有指定的field_end,則轉(zhuǎn)為Gte運(yùn)算符號

*?@return

*/

public?SqlPara?getSqlPara(String?key,?Record?data,?Kv?signs,?Kv?logics,?Kv?between){

//這幾個字段名需要跟WhereDirective里面的對應(yīng)起來

data.set(WhereDirective.KV_SIGNS,?signs);

data.set(WhereDirective.KV_LOGICS,?logics);

data.set(WhereDirective.KV_BETWEEN,?between);

//data跟sql模版的參數(shù)對應(yīng)起來

return?Db.getSqlPara(key,?Kv.by("data",?data));

}

總結(jié)

以上是生活随笔為你收集整理的mysql where 拼接_分一个mysql拼接where语句的Directive,并请教一个问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。