98 Star 569 Fork 123

闲.大赋(李家智) / Beetl

 / 详情

能不能在不修改Beetl源码的前提下,将Beetl配置成SQL模板?

待办的
创建于  
2019-06-11 05:27

我的需求是这样子的,打算用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本身的函数、语法动态拼接出来。

评论 (3)

drinkjava2 创建了任务

这个可以做到,现在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中一并发布,需要这个功能的同学需要手工把源码拷到项目里。

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
29 xiandafu 1678706040 920504 drinkjava2 1578935955
Java
1
https://gitee.com/xiandafu/beetl.git
git@gitee.com:xiandafu/beetl.git
xiandafu
beetl
Beetl

搜索帮助