上一篇,我们使用了Mybatis的插件,这一篇,我们自己做一个代码生成器。
为什么自己做个代码生成器?
Mybatis自带的自动生成代码,不能自定义,比如各种命名没法改,比如不能生成controller、service、jsp。
代码生成器的原理:
(1)编写一个模板,比如要生成XXXService.java,service里面所有代码讲模块部分全部用占位符/变量名代替。比如MenuService改成${modelClass}Service。
(2)使用模板引擎,向模板中传递需要的占位符数据,比如${modelClass},这次要生成Menu,就传Menu,下次要建good,就传Good,就可以生成出来不同的模块,但代码只写了模板里面的这一遍。
(3)通过模板引擎,将替换好的占位符的模板输出为具体的MenuService.java、MenuController.java甚至是menu.jsp.
开发过程:
1.引入jar包
Velocity-1.7.jar : 模板引擎。
commons的2个jar包 :是模板引擎依赖了人家的类。
Guava-27.1-jre.jar :是对字段名的转换,比如good_name字段,在java类的属性叫goodName,当setGoodName时又变成首字母都大写:GoodName,这个jar可以方便转换。
2.新建类com.zq.code.CodeBuilder,要有main方法,需要单独运行生成代码文件。不走spring框架
(a)编写模板引擎调用代码
//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);//引擎初始化
(b)编写引擎代码
//引入一个模版,通过模版路径
Template serviceVm = ve.getTemplate("/WebContent/WEB-INF/vm/service.vm");
(c)引入模版
在WEB-INF下建立一个文件夹vm,在vm文件夹下建立一个文件service.vm。
import java.util.List;
import com.github.pagehelper.PageInfo;
import com.zq.model.${modelClass};
public interface ${modelClass}Service {
/**
* 带有分页的列表查询
* @param pageNum
* @param pageSize
* @param ${modelClass}
* @return
*/
public PageInfo<${modelClass}> list(Integer pageNum,Integer pageSize,${modelClass} ${modelName});
/**
* 没有分也得列表查询
* @param pageNum
* @param pageSize
* @param ${modelClass}
* @return
*/
public List<${modelClass}> list(${modelClass} ${modelName});
public void create(${modelClass} ${modelName});
public void update(${modelClass} ${modelName});
public void delete(Integer id);
public ${modelClass} findById(Integer id);
}
(d)继续完成CodeBuilder.java
完整的代码:
package com.zq.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 = "C:/Users/Administrator/Desktop/shop/";//项目所在目录,按情况更改
//变量放到上下文对象里
VelocityContext ctx = new VelocityContext();
ctx.put("modelClass", modelClass);
ctx.put("modelName", modelName);
//将占位符数据和模版合并,输出代码文件
merge(serviceVm,ctx,rootPath + "src/com/zq/service/" + modelClass + "Service.java");
System.out.println("success");
}
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(Exception e){
e.printStackTrace();
}finally{
writer.close();
}
}
}
(e)在vm文件夹下新建一个serviceImpl.vm
package com.zq.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zq.dao.${modelClass}Dao;
import com.zq.model.${modelClass};
@Service
public class ${modelClass}ServiceImpl implements ${modelClass}Service {
@Autowired
private ${modelClass}Dao ${modelClass}Dao;
@Override
public PageInfo<${modelClass}> list(Integer pageNum,Integer pageSize,${modelClass} ${modelName}) {
PageHelper.startPage(pageNum, pageSize);
List<${modelClass}> list = ${modelClass}Dao.list(${modelClass});
PageInfo<${modelClass}> pageInfo = new PageInfo<${modelClass}>(list);
return pageInfo;
}
@Override
public List<${modelClass}> list(${modelClass} ${modelName}) {
List<${modelClass}> list = ${modelName}Dao.list(${modelClass});
return pageInfo;
}
@Override
public void create(${modelClass} ${modelName}) {
if(${modelName}.getId()!=null && ${modelName}.getId()!=0){
//修改
${modelName}Dao.update(${modelName});
}else{
//新增操作
${modelName}Dao.create(${modelName});
}
}
@Override
public void update(${modelClass} ${modelName}) {
${modelName}Dao.update(${modelName});
}
@Override
public void delete(Integer id) {
${modelName}Dao.delete(id);
}
@Override
public ${modelClass} findById(Integer id) {
return ${modelClass}Dao.findById(id);
}
}
(f)在CodeBuilder.java下,完成service实现类的代码
//service实现类的
Template serviceImplVm = ve.getTemplate("/WebContent/WEB-INF/vm/serviceImpl.vm");
merge(serviceImplVm,ctx,rootPath + "src/com/zq/service/" + modelClass + "ServiceImpl.java");
(g)完成dao.vm
package com.zq.dao;
import java.util.List;
import com.github.pagehelper.PageInfo;
import com.zq.model.${modelClass};
public interface ${modelClass}Dao {
/**
* 没有分也得列表查询
* @param pageNum
* @param pageSize
* @param ${modelClass}
* @return
*/
public List<${modelClass}> list(${modelClass} ${modelName});
public void create(${modelClass} ${modelName});
public void update(${modelClass} ${modelName});
public void delete(Integer id);
public ${modelClass} findById(Integer id);
}
(h)在CodeBuilder.java下,完成dao的代码
//dao的
Template daoVm = ve.getTemplate("/WebContent/WEB-INF/vm/dao.vm");
merge(daoVm,ctx,rootPath + "src/com/zq/dao/" + modelClass + "Dao.java");