自制代码生成器原因:
•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