项目中常常用到代码生成器生成代码,下面介绍velocity代码生成原理,及如何编写代码生成器。
Velocity介绍
Velocity是一个基于Java的模板引擎,基于MVC模型实现,其提供了一个Context容器(相当于Spring的Model),在java代码里面我们可以往容器中存值,然后在vm文件中使用特定的语法获取(相当于Spring页面中取值如freemarker、thymeleaf)。
maven引入
<!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
velocity 基本语法
变量
设置变量 #set($foo =“hello”)
取值 $foo
访问对象属性 $user.name
${user.name}
使用vari获取变量时,如果变量不存在,Velocity引擎会将其原样输出,通过使用vari获取变量时,如果变量不存在,Velocity引擎会将其原样输出,通过使用vari获取变量时,如果变量不存在,Velocity引擎会将其原样输出,通过使用!{}的形式可以将不存在的变量变成空白输出. 见示例 ${notExist}
$!{notExistEmpty}
velocity中大小写敏感。
循环
#foreach($i in $list)
$i
#end
velocity 只会替换变量,所以velocity的语句一般顶行写,以保持文件格式
如上 $i前的空格将会原样输出
条件
#if(condition)
...dosonmething...
#elseif(condition)
...dosomething...
#else
...dosomething...
#end
hello world generator
-
初始化了
VelocityEngine
这个模板引擎,对其设置参数进行初始化,指定使用ClasspathResourceLoader来加载vm文件。 -
在
VelocityContext
这个Velocity容器中存放对象了。 -
在
.vm
文件中我们可以取出这些变量, -
Template
模板输出 template.merge(ctx,sw)
public class HelloWorldVelocity {
public static void main(String[] args) {
// 初始化模板引擎
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
velocityEngine.init();
// 获取模板文件
Template template = velocityEngine.getTemplate("helloVelocity.vm");
// 设置变量
VelocityContext ctx = new VelocityContext();
ctx.put("name", "Velocity");
User user = new User();
user.setName("zhang san");
user.setPhone("18612345678");
ctx.put("user", user);
List list = new ArrayList();
list.add("1");
list.add("2");
ctx.put("list", list);
// 输出
StringWriter sw = new StringWriter();
template.merge(ctx,sw);
System.out.println(sw.toString());
}
resouces目录下的模板文件helloVelocity.vm
#set($foo = 'hello')
$foo $name
${notExist}
$!{notExistEmpty}
$user.name
${user.name}
#foreach($i in $list)
$i
#end
mybatis-plus-generator
generator使用
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl模板引擎
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
参照官网修改的生成代码类
-
配置信息写在了main方法的开头,项目路径、包名、要生成的表、表前缀
-
配置数据源 mysql 引入依赖
mysql-connector-java
-
cfg.setFileCreate 文件生成策略,return true 会生成文件,覆盖原有文件。
-
开启swagger
gc.setSwagger2(true);
代码使用时需引入swagger依赖
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>
代码生成类
public class CodeGenerator {
pub