因为在项目实践中有的时候SQL查询条件会有十几个甚至几十个的情况;如果只用正常的sql拼接方式的需要编写大量的if elseif 来判断查询条件是否为空,以及进行拼接。
运用jfinal的SQL模版文件方式后代码量降低了80%。
SQL模版文件使用#namesapce与#include 指令对其它模板文件进行统一管理。
业务层使用getSqlPara(String key, Object… paras)的方式,入参使用 Kv.by的方式。
以下是一个简单的代码实例:
业务层代码;
/**
* 描述:(获取用户列表接口)
* 作者:${xf}
* 参数: pageSize,startIndex,userType...可以是几十个参数
* 创建:${2017-05-03} ${13:00:00}
*/
@Override
public Ret listUser(Record param) {
int pageSize = Integer.parseInt(String.valueOf(param.get("pageSize")));
int pageNum = Integer.parseInt(String.valueOf(param.get("startIndex")));
param.remove("pageSize").remove("startIndex");
Map map = param.getColumns();
Kv queryParam = Kv.by("age>", ageOne).set("age<",ageTwo).set(map);
SqlPara sqlPara = Db.getSqlPara("customer.listUser",Kv.by("queryParam", queryParam));
Page<Record> page =Db.paginate(pageNum, pageSize, sqlPara);
return ReturnMessage.gsonPage(page);
}模版SQL
all_sqls文件统一管理所有sql文件:
#namespace("customer")
#include("customer.sql")
#endcustomer.sql文件:
#sql("listUser")
select userName,phone, userType from test_user
#for(param:queryParam)
#(for.index==0? "where" : "and" ) #field(param.key)#para(param.value)
#end
#end#field方式需要自己增加一个扩展指令处理模版SQL中的查询条件的 where a=1 and b<1
package com.sanqimei.www.common.kit;
import java.io.Writer;
import com.jfinal.template.Directive;
import com.jfinal.template.Env;
import com.jfinal.template.stat.CharTable;
import com.jfinal.template.stat.Scope;
public class FieldDirective extends Directive {
public void exec(Env env, Scope scope, Writer writer) {
String key = exprList.eval(scope).toString().trim();
write(writer, key);
if (CharTable.isLetterOrDigit(key.charAt(key.length() - 1))) {
write(writer, " = ");
}
}
}然后在config中引入arp.getEngine().addDirective("field", new FieldDirective());