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