代码生成器调研分析以及HTCG计划

本文探讨了Java开发中代码生成的相关开源项目,重点分析了若依代码生成器的工作逻辑、原理和主要界面。同时,对比了SpringBootCodeGenerator、pig和人人开源等项目。文章提出了终极目标——类似于django的模型驱动开发,并预告了一个名为HTCG的项目,旨在创建一个符合特定规范的代码生成框架,以提升开发效率。
摘要由CSDN通过智能技术生成

目的

介绍目前Java开发生态中,关于代码生成相关的开源项目,以及后续的HTCG规划。

若依代码生成器分析

简介

若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。

  • 前端采用Vue、Element UI。
  • 后端采用Spring Boot、Spring Security、Redis & Jwt。
  • 权限认证使用Jwt,支持多终端认证系统。
  • 支持加载动态权限菜单,多方式轻松权限控制。
  • 高效率开发,使用代码生成器可以一键生成前后端代码。

我们比较关注的是,若依的代码生成模块。

使用逻辑

1、修改代码生成配置
单应用编辑resources目录下的application.yml
多模块编辑ruoyi-generator中的resources目录下的generator.yml
author: # 开发者姓名,生成到类注释上
packageName: # 默认生成包路径
autoRemovePre: # 是否自动去除表前缀
tablePrefix: # 表前缀

2、新建数据库表结构(单表)

drop table if exists sys_student;
create table sys_student (
  student_id           int(11)         auto_increment    comment '编号',
  student_name         varchar(30)     default ''        comment '学生名称',
  student_age          int(3)          default null      comment '年龄',
  student_hobby        varchar(30)     default ''        comment '爱好(0代码 1音乐 2电影)',
  student_sex          char(1)         default '0'       comment '性别(0男 1女 2未知)',
  student_status       char(1)         default '0'       comment '状态(0正常 1停用)',
  student_birthday     datetime                          comment '生日',
  primary key (student_id)
) engine=innodb auto_increment=1 comment = '学生信息表';

2、新建数据库表结构(树表)

drop table if exists sys_product;
create table sys_product (
  product_id        bigint(20)      not null auto_increment    comment '产品id',
  parent_id         bigint(20)      default 0                  comment '父产品id',
  product_name      varchar(30)     default ''                 comment '产品名称',
  order_num         int(4)          default 0                  comment '显示顺序',
  status            char(1)         default '0'                comment '产品状态(0正常 1停用)',
  primary key (product_id)
) engine=innodb auto_increment=1 comment = '产品表';

2、新建数据库表结构(主子表)

-- ----------------------------
-- 客户表
-- ----------------------------
drop table if exists sys_customer;
create table sys_customer (
  customer_id           bigint(20)      not null auto_increment    comment '客户id',
  customer_name         varchar(30)     default ''                 comment '客户姓名',
  phonenumber           varchar(11)     default ''                 comment '手机号码',
  sex                   varchar(20)     default null               comment '客户性别',
  birthday              datetime                                   comment '客户生日',
  remark                varchar(500)    default null               comment '客户描述',
  primary key (customer_id)
) engine=innodb auto_increment=1 comment = '客户表';


-- ----------------------------
-- 商品表
-- ----------------------------
drop table if exists sys_goods;
create table sys_goods (
  goods_id           bigint(20)      not null auto_increment    comment '商品id',
  customer_id        bigint(20)      not null                   comment '客户id',
  name               varchar(30)     default ''                 comment '商品名称',
  weight             int(5)          default null               comment '商品重量',
  price              decimal(6,2)    default null               comment '商品价格',
  date               datetime                                   comment '商品时间',
  type               char(1)         default null               comment '商品种类',
  primary key (goods_id)
) engine=innodb auto_increment=1 comment = '商品表';

3、登录系统(系统工具 -> 代码生成 -> 导入对应表)

4、代码生成列表中找到需要表(可预览、修改、删除生成配置)

5、点击生成代码会得到一个ruoyi.zip执行sql文件,按照包内目录结构复制到自己的项目中即可

多模块所有代码生成的相关业务逻辑代码在ruoyi-generator模块,可以自行调整或剔除

主要界面

代码生成主页面
在这里插入图片描述

基本信息
在这里插入图片描述

可以编辑字段信息

导入表

在这里插入图片描述

预览图

在这里插入图片描述

生成结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码生成原理

实际的生成原理并没有多么高端和复杂,主要就是在【Velocity模板】的基础上根据数据模型进行替换。

Apache Velocity是一个基于Java模板引擎,它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目,旨在确保Web应用程序在表示层和业务逻辑层之间的隔离(即MVC设计模式)。

  • Web应用程序网页设计者创建HTML页面,并为动态信息预留占位符。页面再由VelocityViewServlet或任何支持Velocity的框架处理。
  • 源代码生成:Velocity可基于模板生成Java、SQLPostScript源代码。大量的开源和商业软件包的开发就是这样利用Velocity。[1]
  • 电子邮件自动生成:许多应用程序为了账户注册、密码提醒或自动寄送报表之需自动生成电子邮件。利用Velocity,电子邮件模板可以存储在一个文本文件,而不是直接嵌入到电子邮件生成器的Java代码中。
  • 转化:Velocity提供一个Ant任务——Anakia。Anakia读取XML文件,利用Velocity模板转换成所需的文档格式。常见的应用是将某种格式的文档转换成的一个带样式的HTML文档。

详细信息可以参考https://cloud.tencent.com/developer/article/1184329

源码分析

导入

导入并持久化

/**
 * 导入表结构(保存)
 */
@PreAuthorize("@ss.hasPermi('tool:gen:import')")
@Log(title = "代码生成", businessType = BusinessType.IMPORT)
@PostMapping("/importTable")
public AjaxResult importTableSave(String tables)
{
   
    String[] tableNames = Convert.toStrArray(tables);
    // 查询表信息
    List<GenTable> tableList = genTableService.selectDbTableListByNames(tableNames);
    genTableService.importGenTable(tableList);
    return AjaxResult.success();
}
@Override
@Transactional
public void importGenTable(List<GenTable> tableList)
{
   
    String operName = SecurityUtils.getUsername();
    try
    {
   
        for (GenTable table : tableList)
        {
   
            String tableName = table.getTableName();
            GenUtils.initTable(table, operName);
            int row = genTableMapper.insertGenTable(table);
            if (row > 0)
            {
   
                // 保存列信息
                List<GenTableColumn> genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
                for (GenTableColumn column : genTableColumns)
                {
   
                    GenUtils.initColumnField(column, table);
                    genTableColumnMapper.insertGenTableColumn(column);
                }
            }
        }
    }
    catch (Exception e)
    {
   
        throw new CustomException("导入失败:" + e.getMessage());
    }
}

数据模型

package com.ruoyi.generator.domain;

import javax.validation.constraints.NotBlank;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.utils.StringUtils;

/**
 * 代码生成业务字段表 gen_table_column
 * 
 * @author ruoyi
 */
public class GenTableColumn extends BaseEntity
{
   
    private static final long serialVersionUID = 1L;

    /** 编号 */
    private Long columnId;

    /** 归属表编号 */
    private Long tableId;

    /** 列名称 */
    private String columnName;

    /** 列描述 */
    private String columnComment;

    /** 列类型 */
    private String columnType;

    /** JAVA类型 */
    private String javaType;

    /** JAVA字段名 */
    @NotBlank(message = "Java属性不能为空")
    private String javaField;

    /** 是否主键(1是) */
    private String isPk;

    /** 是否自增(1是) */
    private String isIncrement;

    /** 是否必填(1是) */
    private String isRequired;

    /** 是否为插入字段(1是) */
    private String isInsert;

    /** 是否编辑字段(1是) */
    private String isEdit;

    /** 是否列表字段(1是) */
    private String isList;

    /** 是否查询字段(1是) */
    private String isQuery;

    /** 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) */
    private String queryType;

    /** 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) */
    private String htmlType;

    /** 字典类型 */
    private String dictType;

    /** 排序 */
    private Integer sort;
     /** getter&setter */

    public boolean isSuperColumn()
    {
   
        return isSuperColumn(this.javaField);
    }

    public static boolean isSuperColumn(String javaField)
    {
   
        return StringUtils.equalsAnyIgnoreCase(javaField,
                // BaseEntity
                "createBy", "createTime", "updateBy", "updateTime", "remark",
                // TreeEntity
                "parentName", "parentId", "orderNum", "ancestors");
    }

    public boolean isUsableColumn()
    {
   
        return isUsableColumn(javaField);
    }

    public static boolean isUsableColumn(String javaField)
    {
   
        // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单
        return StringUtils.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值