我的需求是这样子的,打算用Beetl开发一个SQL模板(不直接用BeetlSQl是因为我打算给jSqlBox用的,它本身是一个DAO工具,可以说是BeetlSQL的竞争对手,另外如果用户使用的是纯JDBC、DbUtils、jdbcTemplate等工具,也可能会遇到这样一个寻找SQl模板的需求):
在不修改Beetl源码的前提下,有没有办法直接利用配置Beetl模板实现这样一个功能:
Java方法: templateQuery("select * from u where u.name=#{u.name} and u.addr='${u.addr}'", bind("u", userBean));
在内部经过Beetl转换后,等效于: normalQuery('select * from u where u.name=? and u.addr='Beijin'", new Object[]{"张三"});
其它的beetl函数可以一个都不要(如果支持的话也无所谓,无非jar包尺寸大一点而已),但是以下几个关键字及函数必须支持: for, in, if , notNull(), notEmpty(),不要其它Beetl函数的出发点是减少学习时间,而且SQl往往可以利用Java本身的函数、语法动态拼接出来。
这个可以做到,现在beetlsql就是这样,beetl3.0以后支持2种定界符,因此可以解释#{} 和 ${},你自己参考 SQLTemplateEngine,他使用SQLGrammarCreator扩展了不通的解释
public class SQLGrammarCreator extends GrammarCreator {
public PlaceholderST createTextOutputSt(Expression exp, FormatExpression format) {
check("TextOutputSt");
return new SQLPlaceholderST(exp, format, null);
}
public PlaceholderST createTextOutputSt2(Expression exp, FormatExpression format) {
return new PlaceholderST(exp, format, null);
}
}
createTextOutputSt2 对应 ${},他原样调用了beetl的输出,相当于模板输出,但是,createTextOutputSt,对应#{},他使用了SQLPlaceholderST,这个只输出"?",并记录当时的值
所以我觉得你的需求没有问题,可以实现,beetlsql也是这么实现的
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
谢谢!以前只是觉得在不修改源码的前题下,实现不了这个功能,也没时间去翻BeetlSQL是怎么实现的,为了这个功能,把BeetlSQL整体搬过去当成一个SQL模板来用,只用它的SQL模板这个功能,这显然是非常不合适的。与其去研究源码,不如直接请教开源作者了,果然收获不小,双定界符这个功能才了解到。
下一个版本jSqlBox更新将加入以Beetl3.0作为可选SQL模板这个功能。
感谢大赋的指导,在jSqlBox3.0.0的demo/beetl目录下,利用Beetl的双占位符功能,我作了一个使用Beetl作为SQl模板的例子,这证明了在任何JDBC/DAO场合,beetl可以用作为SQL模板来使用。因为考虑到Beetl依赖太大,所以只是作了演示,没有整合到jSqlBox中一并发布,需要这个功能的同学需要手工把源码拷到项目里。
登录 后才可以发表评论