自制代码生成器原因:
•Mybatis自带的自动生成代码,不能自定义,各种命名没法改,不能生成controller、service、jsp等页面
如何写代码生成器—模板引擎velocity
Velocity-1.7.jar : 模板引擎
commons的2个jar包 :模板引擎依赖的类
Guava-27.1-jre.jar :实现对字段名的转换,比如good_name字段,在java类的属性叫goodName,当setGoodName时又变成首字母都大写:GoodName,这个jar可以方便转换
代码生成器原理:
•
(
1
)编写一个模板,比如要生成
XXXService.java
,
service
里面所有代码讲模块部分全部用占位符
/
变量名代替。比如
MenuService
改成
${
modelClass
}Service
•
(
2
)使用模板引擎,向模板中传递需要的占位符数据,比如
${
modelClass
}
,这次要生成
Menu
,就传
Menu
,下次要建G
ood
,就传
Good
,就可以生成出来不同的模块,但代码只写了模板里面的这一遍
•
(
3
)通过模板引擎,将替换好的占位符的模板输出为具体的
MenuService.java
、
MenuController.java
甚至是
menu
.
jsp
开发过程:
•
引入
jar
包。
•
新建类
com.xx.code.CodeBuilder
,要有
main
方法,需要单独运行生成代码文件。不走
spring
框架;
•
编写模板引擎调用代码
•
写
service.vm
模板
•
com.xx.code.CodeBuilder
生成
MenuService
完整
代码
package com.xx.code;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Properties;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
public class CodeBuilder {
public static void main(String[] args) {
//new一下他的模板
VelocityEngine ve = new VelocityEngine();
//设置模板和输出的代码文件的编码方式
Properties p = new Properties();
p.setProperty(Velocity.ENCODING_DEFAULT, "UTF-8");
p.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
p.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
//引擎初始化
ve.init(p);
//引入一个模板,通过模板路径
Template serviceVm = ve.getTemplate("/WebContent/WEB-INF/vm/service.vm");
//定义占位符变量,给个值
String modelClass = "Menu";
String modelName = "menu";
//生成的代码放置的目录==项目目录
String rootPath = "F:/企业/shop/";
//变量放到上下文对象里
VelocityContext ctx = new VelocityContext();
ctx.put("modelClass", modelClass);
ctx.put("modelName", modelName);
//将占位符数据和模板合并,输出代码文件
CodeBuilder.merge(serviceVm, ctx, rootPath + "src/com/xx/service/" + modelClass + "Service.java");
Template serviceVmImpl = ve.getTemplate("/WebContent/WEB-INF/vm/serviceImpl.vm");
CodeBuilder.merge(serviceVmImpl, ctx, rootPath + "src/com/xx/service/" + modelClass + "ServiceImpl.java");
Template daoVm = ve.getTemplate("/WebContent/WEB-INF/vm/dao.vm");
CodeBuilder.merge(daoVm, ctx, rootPath + "src/com/xx/dao/" + modelClass + "Dao.java");
}
private static void merge(Template template,VelocityContext ctx,String path){
PrintWriter writer = null;
try {
writer = new PrintWriter(path);
template.merge(ctx, writer);
writer.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally{
writer.close();
}
}
}
•
其他的模板类似,我们写一下:serviceImpl.vm service.vm dao.vm