JtnTpCodeGenerator,天鸟技术平台代码生成器,侧重从Dao到Controller上下游的CRUD。
代码生成器的核心价值:根据1个数据库表,生成通用的代码。
常见的类有:Mybatis的Mapper,偶尔用到的Manage,常用的Service,Web代码Controller,数据库模型类Model。
常见的方法:增删改查CRUD,一些定制化模版方法。
一、简单举例
生成常见的数据库表对应的实体类Model
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.Version;
import com.jiutianniao.common.kit.JtnKit;
import lombok.Data;
@Data
public class #(modelName) implements Serializable{
private static final long serialVersionUID = 1L;
#for(columnPair : columnPairList)
private #(columnPair.typeName) #(columnPair.fieldName);
#end
@Override
public String toString() {
return JtnKit.toString(this);
}
}
|
上面的是Model模版文件。
上下文变量有:模型名称 #(modelName) 比如“Post”。
字段列表List<ColumnPair > columnPairList;
把模版文件里的变量渲染(替换、for执行)下,就得到了1个新的具体的实体类文件。
比如:
@Data
public class Postimplements Serializable{
private static final long serialVersionUID = 1L;
private Integer id;
private String title;
private String content;
@Override
public String toString() {
return JtnKit.toString(this);
}
}
|
这里,用到了Lombok组件的 @Data注解,动态生成 getter和setter方法。
为了简化代码复杂度,至少看起来是的。
代码生成器,实际上就干了这么一件事。
二、代码生成器,核心流程
1、初始化配置
读取配置文件里的属性,放到实体类中
#源代码放在哪个目录
#windows grammar must be "\", because spring-config,must be "\\"
codeOutputPath = C:\\Code
#代码模版的目录
#the template path D:\GitRepos\CodeGenerator
templatePath=D:/GitRepos/CodeGenerator/src/main/resources/template
# 为哪些表生成代码
#all,some,one
generatorPolicy = one
|
2、根据配置生成代码
2.1 获得数据库连接
2.2 得到所有表名
2.3 循环生成每个表对应的代码-真正干活的1步
1).根据数据库连接和数据库表名,构造模版的数据模型
2).将Java模型转换成Map格式
3).生成文件
读取模版,根据Map,渲染,保存
3、打开源代码所在目录
方便copy代码
三、重点讲下干活的1步:生成1个表对应的代码
// 只生成1个的时候,需要表名
public void generateOne(String tableName) throws SQLException {
Connection connection = GeneratorUtil.getConnection();
generateOne(connection, tableName);
connection.close();
}
|
以上:根据数据库连接,查询这个表名的元数据,然后生成代码。
1、元数据
@Data
public class DbModel {
// 表名
private String tableName;
// 字段集合
private List<String> columnList;
// 字段类型集合
private List<String> typeList;
// 字段评论集合
private List<String> commentList;
|
2、怎么获得元数据
//构造1个表的元数据,数据库模型
public static DbModel buildDbModel(Connection connection, String tableName) throws SQLException {
List<String> columnList = new ArrayList<String>();
List<String> typeList = new ArrayList<String>();
List<String> commentList = new ArrayList<String>();
String prefix = "show full fields from ";
PreparedStatement statement = connection.prepareStatement(prefix + tableName);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
columnList.add(resultSet.getString("FIELD"));
typeList.add(resultSet.getString("TYPE"));
commentList.add(resultSet.getString("COMMENT"));
}
DbModel dbModel = new DbModel(tableName, columnList, typeList, commentList);
return dbModel;
}
|
3、转换成模版渲染需要的上下文变量,统一放在map里
dataMap.put("tableName", tableName);
dataMap.put("commentList", commentList);
dataMap.put("typeList", typeList);
//默认第1个字段为主键
String pkType =GeneratorUtil.processType(typeList.get(0));
dataMap.put("pkType", pkType);
dataMap.put("memberPkType",Config.MEMBER_PK_TYPE);
//包变量
dataMap.put("modelPackage", Config.MODEL_PACKAGE);
dataMap.put("beanPackage", Config.BEAN_PACKAGE);
dataMap.put("mapperJavaPackage", Config.MAPPER_JAVA_PACKAGE);
dataMap.put("mapperXmlPackage", Config.MAPPER_XML_PACKAGE);
|
4、渲染模版
TpEnjoyTemplateCombo.combo(generatorModel);
模版因人而异,风格不同,可以分别渲染。
以下是“天鸟技术平台”涉及到一些标准代码模版,列了3项。
public static void combo(GeneratorModel generatorModel) {
GeneratorTool.defaultByModelName(generatorModel, TemplateEnum.tpModelHtml);
GeneratorTool.defaultByModelName(generatorModel, TemplateEnum.tpManagerHtml);
GeneratorTool.defaultByModelName(generatorModel, TemplateEnum.tpMapperJavaHtml);
}
|
JFinal enjoy模版引擎,渲染模版,存储代码到文件系统。
输入参数:模版、数据map、代码存储文件目录。
// jfinal enjoy模版
public static void enjoy(GeneratorModel generatorModel, TemplateEnum templateEnum) {
try {
String templateName = Config.TEMPLATE_PATH_ENJOY + templateEnum.getName();
String filePath = buildOutputFilePath(generatorModel, templateEnum);
Map<String, Object> dataMap = generatorModel.getDataMap();
TemplateKit.renderToFile(templateName, dataMap, filePath);
} catch (Exception e) {
e.printStackTrace();
}
}
|
代码结构
