代码生成器-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  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();

    }

}

 

 

代码结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值