初衷是因为sql文件有些重复代码导致文件太长、冗余太大、不雅观,一开始思路是用#define 指令定义函数来实现,不够优雅,就换成了自定义指令(仅适用于重用的sql中不包含#para指令的情况),实现如下:
1、自定义指令sqlKey代码:
public class SqlKeyDirective extends Directive {
private Expr key;
@Override
public void setExprList(ExprList exprList) {
int paraNum = exprList.length();
if (paraNum != 1) {
throw new ParseException("The parameter of #number directive can not be blank", location);
}
key = exprList.getExpr(0);
}
@Override
public void exec(Env env, Scope scope, Writer writer) {
write(writer, Db.getSql(key.eval(scope).toString()));
}
}2、configPlugin中添加注册Sqlkey自定义指令(注意不能加在configEngine中,因为configEngine在configPlugin之后):
arp.getEngine().addDirective("sqlKey", SqlKeyDirective.class);3、a.sql文件内容:
例如需要查询和统计表a的内容:
### 整理重用的字段,类似mybatis中的sql标签
#sql("baseCloumn")
id,name
#end
### 重用的sql
#sql("queryA")
select
#sqlKey("a.baseCloumn")
from a
#end
### 注意此方式要求重中的sql中不能包含#para指令
#sql("countA")
select count(id) as num from (
#sqlKey("a.queryA")
#if(id)
where id = #para(id)
#end
.....很长很长的sql语句...
) a
#end4、使用
查询a表的数据:Db.template("a.queryA").find()
统计a表的数据:Db.template("a.countA", Kv.by("id", "a")).findFirst()注意此方式因Db.getSql()不支持#para()指令,如重用的sql中用到#para指令需要用#define自定义函数实现。
后面 arp 中的 enjoy sql 我考将 sqlKey 更名为 sqlId,所以,建议享主将 #sqlKey(...) 指令改为 #sqlId(...),能省点代码量