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 Post implements 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(); } } |
代码结构