因为在项目实践中有的时候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") #end
customer.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());