开源一款Java实现的代码生成引擎

概述

        生成代码是快速项目开发和交付的关键,但是代码生成器在网上扒拉又找不到合适的,所以,痛定思痛自己撸了一套代码生成器。这套代码生成器,在我自己的平台中得到了应用,效果还可。将这款代码生成器开源的目的,一方面有利于技术交流,集思广益使其更加完善,功能更加强大;另一方面,也避免了重复造轮子,使代码复用。这套代码生成器采用了类似于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>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值