参照SQL模板的动态生成如下:
#sql("find")
select * from girl
#for(x : cond)
#(for.first ? "where": "and") #(x.key) #para(x.value)
#end
#endKv cond = Kv.by("age > ", 16).set("sex = ", "femal");
SqlPara sp = Db.getSqlPara("find", Kv.by("cond", cond));
Db.find(sp);当前端传递age为空的时候生成语句
select * from girl where age > '' and sex = 'femal'
--------------------------------------------------------------------
想要达到的目的,当筛选参数值为空时不拼接条件,改造如下
#sql("find")
select * from girl
#for(x : cond)
#if(x.value??)
#(for.first ? "where": "and")
#(x.key) #para(x.value)
#end
#end
#end测试结果当age为空并且sex为空时动态生成语句
select * from girl
当age非空,sex为空时动态生成语句
select * from girl where age > 16
我尝试了前端通过Kv封装传递名称为a、b、c的参数,任意给一个参数赋值,
通过for指令对参数循环,进入循环的第一次必定是有值的参数。
也就是说#(for.first)判断生成where或and完全不会出错。
而使用HashMap则不是这样,翻阅了下Kv的源码,没有发现有排序处理的地方。
项目:JFinal