相关文章推荐
勤奋的香槟  ·  ubuntu docker cannot ...·  1 年前    · 
闷骚的红薯  ·  mysql ...·  1 年前    · 
大力的电池  ·  2.7 ...·  2 年前    · 

最近遇到一个需求, 框架需要执行用户给定的 SQL 语句,该 SQL 语句内包含占位符, 占位符表示的内容存在于在框架中,比如下面的 sql

select * from xxx where id = ${xxid}

xxid 值存在于框架中,也就是说框架需要解析用户设置的 sql ,将占位符用框架内的值替换。

众所周知, Mybatis 能够解析占位符,执行 SQL 语句, 但是由于 sql 语句由用户传入,不是写在 xml Mybatis 的注解中,查阅了 Mybatis 文档,其并不支持直接执行 sql 语句, 所以必须考虑如何解析占位符的问题。

Freemarker 可以基于模板生成输出文本,并且其要求的 dataModel Object 类型,只要 sql 语句的占位符名字存在于 dataModel 中,就能够将占位符替换为具体的值。占位符需要使用 ${} 修饰。
注意点: 使用 Freemarker API ,上下文里占位符对应的值如果为 Null ,会抛出一个异常。

Configuration cfg = new Configuration(Configuration.VERSION_2_3_26);
cfg.setDefaultEncoding("UTF-8");
cfg.setNumberFormat("computer");
  • 设置编码格式
  • 设置 number 的格式,这一步比较重要,因为 Freemarker 解析出来的整数是每 3 位带逗号的,也就会导致 sql 执行失败。 computer 格式相当于 Freemarker 模板语法的 c ,即 someNumber?c ,这样解析出来的整数是不带逗号的。
Template template = new Template("tempTest", YourStr, cfg);
  • 获取模板,第一个参数为模板名,第二个参数为需要解析的字符串,第三个参数为配置
Writer out = new StringWriter();
template.process(dataModel, out);
out.toString();
  • dataModel 存在和占位符同名的变量
  • process() 方法进行解析,同时将结果写入 out ,最后执行 out.toString() 就可以获得解析后的字符串

第一次接触到 Freemarker ,感觉非常好用,尤其是它的 dataModel 是可以多层嵌套的,只要字符串内占位符对应的名称对应。

背景最近遇到一个需求, 框架需要执行用户给定的SQL语句,该SQL语句内包含占位符, 占位符表示的内容存在于在框架中,比如下面的sqlselect * from xxx where id = ${xxid}xxid值存在于框架中,也就是说框架需要解析用户设置的sql,将占位符用框架内的值替换。众所周知,Mybatis能够解析占位符,执行SQL语句, 但是由于sql语句由用户传入,不是写在xml或My
欢迎 使用 Markdown编辑器写博客本Markdown编辑器 使用 StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl
1、 freemarker 是什么,主要功能是什么? FreeMarker 是一款模板引擎,即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。这是官方的解释,我个人的理解是, freemarker 是一个模板引擎工具,我们先用特定语言定义好模板文本并预留好参数位置,然后动态传入参数。这样 freemarker 就能动态的根据输入的参数返回不同的文本数据。所以它的功能简单理解是根据模板和数据动态生成文本。 2、 freemarker 功能构成 freemarker
模版引擎 FreeMarker 生成 sql 脚本技术说明 使用 场景实现效果具体实现springboot引入依赖代码实现小结 FreeMarker 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件(主要应用于生成HTML, 使用 过springbo...
FreeMarker 的模板文件并不比HTML页面复杂多少, FreeMarker 模板文件主要由如下4个部分组成:1,文本:直接输出的部分2,注释:<#-- ... -->格式部分,不会输出3,插值:即${...}或#{...}格式的部分,将 使用 数据模型中的部分替代输出4,FTL指令: FreeMarker 指定,和HTML标记类似,名字前加#予以区分,不会输出 下面是一个 FreeMarker ...
<#import "cors-join-table.ftl" as joinSpace> <#import "cors-where-condition.ftl" as conditionSpace> <#import "cors-main-where-condition.ftl" as mainConditionSpace> sele...