最近,脚手架和代码生成器比较火。mybatis-plus,mybatis-generator,gun,码云上也有很多项目有这个功能.

最近我根据公司的编程习惯以及微服务框架,为我们公司定制化了一个代码生成器,采用的是velocity模板引擎(当然模板引擎有多种,如freemarker等,可以按需选择哈)。

       下面总结一下velocity的常用语法:

比如有一个JSONObject  parameter,它的值为:

{
    "a": true,
    "b": "test",
    "c": 123,
    "d": {
        "e": ["试一下", "test", "demo"],
        "f": "哈哈哈"
    }
}

1、${变量名} 或 $变量名,有赋值时输出对应的值,没赋值则输出“${变量名} ”或 “$变量名” 。

${parameter.d.f}的输出结果就是:"哈哈哈";

${parameter.d.g}的输出结果就是:"${parameter.d.g}",为什么呢,因为没有这个属性哈。

2、$!{变量名}

没有这个属性就输出为空,$!{parameter.d.g}的输出结果就是:""。

3、#[[${变量名}]]#

原生代码中刚好有一个${parameter.a}与模板变量冲突了怎么办?这时候就将代码中的${parameter.a}写成#[[${parameter.a}]]#,这样无论怎样最终输出的结果都是:${parameter.a}。

这种方法还能解决前端语法和 velocity语法的冲突。

4、逻辑判断(温馨提示:注意闭环

#if(logic expression)  
…(content)
#else if(logic expression)
…(content)
#else
…(content)
#end

逻辑表达式中支持常用的&&,||,!,(),==  等。

5、循环(温馨提示:注意闭环

#foreach(logic expression)

    …(content)

#end

当前循环到第几个:$foreach.count(网上也有说用${velocityCount}),从1开始不是从0开始。

集合大小:${parameter.d.e.size()}

获取集合中的某个值:${parameter.d.e.get(2) 

 ps:这个我试了一下,好像只对List类型有效,set类型只能老老实实循环(当然你要是找到了它的获取方法,可以留言告诉我哈)

6、#set

定义中间变量     比如在某种情况下,你需要取出某个循环的下标,#set($i = ${foreach.count} - 1)

温馨提示:上面的表达式“-1“减后前后都得有空格(这个真心比较恶心哈,但也木有办法)。

 

示例:Model.java.vm  (至于对象cfg的数据结构就不贴了哈)

package ${cfg.filePath.modelPackagePath};

#foreach( $javaImport in ${cfg.tableInfo.javaImport})
import $javaImport;
#end
import java.io.Serializable;
#if(${cfg.lombok})
import lombok.Data;
#end

/**
#if(${cfg.tableInfo.tableComment}!="")
 * <p>
 *  ${cfg.tableInfo.tableComment}
 * </p>
#end
 * @author ${cfg.author}
 * @since ${cfg.date}
 */
#if(${cfg.lombok})
@Data
@ToString
#end
public class ${cfg.tableInfo.className} implements Serializable {
    private static final long serialVersionUID=1L;
#foreach( $columnInfo in ${cfg.tableInfo.columnInfoList})
    #if($columnInfo.columnComment&&$columnInfo.columnComment!="")
    /**
    * $columnInfo.columnComment
    */
    #end
    private  $columnInfo.javaType  $columnInfo.javaName;
#end

#if(!${cfg.lombok})
    #foreach( $columnInfo in ${cfg.tableInfo.columnInfoList})
    public void set${columnInfo.javaName1}($columnInfo.javaType $columnInfo.javaName){
        this.${columnInfo.javaName}=$columnInfo.javaName;
    }
    public $columnInfo.javaType get${columnInfo.javaName1}(){
        return $columnInfo.javaName;
    }

    #end
#end

#if(!${cfg.lombok})
    @Override
    public String toString() {
        return "${cfg.tableInfo.className}{" +
            #foreach( $columnInfo in ${cfg.tableInfo.columnInfoList})
                #if($foreach.count==1)
                    #if(${columnInfo.javaType}=="byte[]")
            "${columnInfo.javaName}=" + Arrays.toString(${columnInfo.javaName}) +
                    #else
            "${columnInfo.javaName}=" + ${columnInfo.javaName} +
                    #end
                #else
                    #if(${columnInfo.javaType}=="byte[]")
            ",${columnInfo.javaName}=" + Arrays.toString(${columnInfo.javaName}) +
                    #else
            ",${columnInfo.javaName}=" + ${columnInfo.javaName} +
                    #end
                #end
            #end
            "}";
    }
#end
}

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐