概述
生成代码是快速项目开发和交付的关键,但是代码生成器在网上扒拉又找不到合适的,所以,痛定思痛自己撸了一套代码生成器。这套代码生成器,在我自己的平台中得到了应用,效果还可。将这款代码生成器开源的目的,一方面有利于技术交流,集思广益使其更加完善,功能更加强大;另一方面,也避免了重复造轮子,使代码复用。这套代码生成器采用了类似于vue以及AngularJs前端框架那样双向绑定式的编程模式,所以编写模板时基本上懂点前端就能立刻上手,学习成本低。
应用场景
1. 基于该代码生成器可开发类似于mybatis那样的sql构建框架。在一些不方便引入mybatis但一时又找不到替代品情况下,使用该代码生成器实现一个轻量的sql构建器。
2. 该代码生成器可用来生成一些样板式代码,减少开发成本的投入,降本增效。
3. 该代码生成器也可生成一些常见文档。例如,一些接口说明文档、需求文档等。
源码托管地址
https://gitee.com/beiding/myrender
快速上手
1. 声明一个模板
<tp gi="">
<!--# 如果是a #-->
<bk if="__a" gi="">
<bk as="r">
select * from <bk if="_rdjc">table_a</bk><bk if="_orc">TABLE_A</bk>
where
<bk if="_rdjc" gi=""> age between <rd>f</rd> and <rd>t</rd></bk>
<bk if="_orc" gi=""> age between (<rd>f</rd>,<rd>t</rd>)</bk>
<bk if="names" gi="">
and name in (<bk for="i in names" join=",">'<rd>names[i]</rd>'</bk>)
</bk>
</bk>
<rd>stringPlugin.format(r)</rd>
</bk>
</tp>
2. 声明一个关联类关联该模板
package com.beiding.demo.templatedemo;
/**
* 任何 CpTemplate 的子类都会被创建为模板,并自动挂载模板文件以及插件
*/
public class TestSql extends SqlTemplate {
@Override
public String name() {
return "sql.test";
}
}
3. 利用模板对象渲染得到代码
package com.beiding.demo;
import com.beiding.cprender.F;
import com.beiding.demo.templatedemo.TestSql;
import com.beiding.render.Data;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
//获取声明的模板对象
TestSql test = F.get(TestSql.class);
//利用模板对象渲染出sql语句
System.out.println(test.sql("a",
Data.newSet() //配置渲染时所需参数
.set("f", 100)
.set("t", 200)
.set("names", Arrays.asList("丁", "王"))
));
}
}
代码模板中的更多语法
<tp>
<!--# 这是一条注释,这是在模板中加注释的唯一格式 #-->
<!--# 下面是一个模板区块,模板区块是进行代码片段渲染的基本单位 #-->
<bk>
这是一个区块
</bk>
<!--# for指令,for指令可以遍历可遍历的java或js对象,也可以定义自增对象,用法和js用法一致 #-->
<bk for="i=0;i<3;i++">
这是一个被输出三次的代码
</bk>
<!--# rd 标签可将其内部的文本作为js脚本执行,并将最后一行代码的结果用来渲染 #-->
<bk for="i in names">
遍历java对象并渲染人名 <rd>names[i]</rd>
</bk>
<!--# gi 是一个格式化的指令,他接收两个参数,参数1表示行间距,参数2表示缩进单元格树,两个参数都不是必须的(视为0) #-->
<bk for="i=0;i<3;i++" gi="">
我是被格式化后的文本,并且我被打印三次;
</bk>
<!--# switch/case/default 可以用来分支判断 #-->
<bk for="i=0;i<3;i++" switch="i" gi="1">
<bk case="0">
i的值为0
</bk>
<bk case="1.0">
i的值为1
</bk>
<bk default="">
这是以上两种情况都不满足的情形
</bk>
</bk>
<!--# if/elif/else 也可用于分支判断 #-->
<bk if="1>0" gi="">
这是 1>0 条件满足的情形
</bk>
<bk elif="2>3" gi="">
这是一个不会渲染的文本
</bk>
<bk else="4>3" gi="">
这也不会被渲染,虽然条件正确
</bk>
<!--# 使用as指令可将渲染的结果放置在一个变量中,而在其他位置使用 #-->
<bk as="z" gi="">
我是被渲染的内容,我将作为z变量在其他位置使用
</bk>
<bk>
z变量的值: <rd>z</rd>
</bk>
<!--# 使用join指令可以辅助for指令将渲染的结果使用给定的文本分割 #-->
<bk>
使用逗号分割后的所有人名: <bk for="i in names" join=",">'<rd>names[i]</rd>'</bk>
</bk>
<!--# 使用values指令可以一些缺省变量,即变量不存在时的默认值 #-->
<bk values="msg:'这是一个被临时定义的局部变量'">
缺省消息: <rd>msg</rd>
</bk>
<!--# 可以使用tp指令将一个区块声明为内部模板,从而在其他位置使用call指令进行调用,调用内部模板需要在前面加 '$' 符号 #-->
<bk tp="tp1" gi="">
这是一个被调用的模板,并且name参数传递为: <rd>name</rd>
</bk>
<bk for="i in names">
<bk call="$tp1" :name="names[i]"> </bk>
</bk>
</tp>