最近遇到一个需求, 框架需要执行用户给定的
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...