0
点赞
收藏
分享

微信扫一扫

代码生成器-JtnTpCodeGenerator


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();
}
}

 

 

代码结构

代码生成器-JtnTpCodeGenerator_List

举报

相关推荐

0 条评论