非低代码,我写了一个比ChatGPT还牛的CRUD代码生成器 上

简介: 非低代码,我写了一个比ChatGPT还牛的CRUD代码生成器 上


缘起

大家好呀,我是架构师业余草。

最近在做一个项目,需要新建20多张表

相信大多数同学应该和我一样,都是比较讨厌创建新表这个工作的,因为每创建一张表,都要去创建实体类、创建增删改查的接口、编写增删改查的SQL代码等等,把这些事情做完,2个小时也就过去了

我就在思考啊,每一张表,就要耗费两个小时,20多张表,那就是40多个小时,一周的时间就这样过去了。

思考

这谁受得了呀,所以我打算写一个工具,把这些代码都自动生成出来!

代码都自动生成出来

在连续爆肝了5个晚上之后,我做出了这款自动生成业务代码的工具!

自动生成业务代码

我把它放在了我的工具站上,大家可以访问这个域名直接使用https://utilsbox.cn/?app=bizcode

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

使用演示

下面给大家演示一下

假设我们现在创建一个商品表

首先填写表名和表的中文名称

然后我们添加商品表对应的字段,这些操作和我们日常使用的数据库工具差不多

把字段填写好了之后,点击“一键生成代码”

完成表信息编辑

高潮的地方来了

DB层、业务层、甚至是controller层的代码,工具都帮我们自动生成了!

来看下代码,建表sql、增删改查sql、表对应的实体类、DB层的接口类、业务层的实体类、业务层的接口类、业务接口的实现类、业务层实体类和db层实体类的转换器,最后是controller层,这些代码全都帮我们生成好了。

代码全都帮我们生成好了

这是什么概念呢

现在我们只需要把这些代码拷贝到项目里,简单设置一下类的引用,增删改查这些基本功能,就已经可以直接给前端去调用了。

CRUD

很多同学可能会问,如果是现有的数据表,再来这里添加一次感觉太麻烦了

这个问题我也遇到了,所以我做了一个识别建表SQL的功能,常见的数据库工具对于已经创建好的表,都提供建表语句的复制功能,只需要把建表SQL粘贴到这个文本框里。

点击“识别”按钮,这个SQL的信息会自动识别过来,这时候只需要把表的中文名称填写上去,点击“一键生成代码”,就可以马上得到这个表的业务代码。

业务代码生成器

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

通用性的思考

不知道大家觉得怎么样哈,如果只是我自己用,我觉着已经非常好了,但既然是开放出来给大家用,通用性肯定还是不够的。

因为现在看到的这一套自动生成的代码,可能只是适合我,但不同的人、不同的公司,它们项目结构的分层、代码的细节,都是不一样的

所以,我还开发了代码模版配置的功能

点击“代码模版配置”按钮,在这个弹窗里,我们可以新增、删除代码的分类。同样的,也可以新增、删除和编辑具体的代码模版。

代码模版

代码生成的原理

在说代码模版具体怎么配置之前,先给大家讲一下代码自动生成的原理

它由代码模版和动态参数组成,核心就是匹配 - 替换

首先,工具提供了很多动态参数,这些动态参数,对应的是我们填写的表名、字段名等等这些信息的原始值,或者处理过后的值。

然后,代码模版由用户自行定义,在代码的关键位置,插入动态参数,即可形成一份代码模版。

最后,工具通过匹配和替换动态参数,最终生成了代码。

理论上,不论什么语言,你都可以配置专属于你自己的代码模版。

举个简单的栗子:

我们配置了一份这样的代码模版,如下:

/**
 * $table_desc$Model模型
 * Created by 创建人 on $current_time$.
 */
public class $table_name_hump_A$Model extends ToString{
}

可以看到,模版里分别使用了$table_desc$(表中文名)$current_time$(当前时间)$table_name_hump_A$(表名转首字母大写驼峰) 这三个动态参数。

当我们设置 表名 = goods_order、表中文名 = 商品订单 时,代码生成的结果如下所示:

/**
 * 商品订单Model模型
 * Created by 创建人 on 2023-02-05 17:12:32.
 */
public class GoodsOrderModel extends ToString{
}

动态参数部分,全部替换成了我们输入的表信息。

最后希望这个项目对大家有用,之后我会开发更多有意思的项目。

由于这个项目都是晚上加班肝出来的,可能会存在一些BUG,发现了我会尽快修复的,也请大家多多包涵。

代码模版参考

以下是当前工具里默认的代码模版,你可以通过参考这些模版,举一反三,配置出专属于你自己的代码模版。

工具提供了模版的导入和导出功能,如果你创建好了一份非常满意的模版,可以导出,然后发给你的同事直接使用,这样它就不用重复创建了,你也可以忽悠你的同事来创建,然后分享给你。

建表SQL模版

CREATE TABLE `$table_name$` (
  $create_table_field_list$
  PRIMARY KEY (`$primary_key$`)
) ENGINE=$db_engine$ DEFAULT CHARSET=$db_encoded$;

实体类模版

主体

/**
 * $table_desc$DTO模型
 * Created by 创建人 on $current_time$.
 */
public class $table_name_hump_A$DO {
    $member_param_list$
    $get_set_method_list$
}

成员代码块 成员变量列表(member_param_list)

/** $field_comment$ */
private $field_type_java$ $field_name_hump$;

成员代码块 GetSet方法列表(get_set_method_list)

public $field_type_java$ get$field_name_hump_A$() {
    return $field_name_hump$;
}
public void set$field_name_hump_A$($field_type_java$ $field_name_hump$) {
    this.$field_name_hump$ = $field_name_hump$;
}

接口类模版(DB层)

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
 * $table_desc$DB接口
 * Created by 创建人 on $current_time$
 */
@Mapper
public interface $table_name_hump_A$DAO {
    /**
     * 添加
     * @param data
     * return 影响行数
     */
    int insert($table_name_hump_A$DO data);
    /**
     * 修改
     * @param data
     * return 影响行数
     */
    int update($table_name_hump_A$DO data);
    /**
     * 分页查询
     * @param param
     * return 结果列表
     */
    List<$table_name_hump_A$DO> pageQuery(Map param);
    /**
     * 查询count
     * @param param
     * return count条数
     */
    Long pageQueryCount(Map param);
    /**
     * 根据ID查询
     * @param id
     * return 结果DO对象
     */
    $table_name_hump_A$DO queryById(@Param("$primary_key_hump$") $primary_key_type_java$ $primary_key_hump$);
    /**
     * 根据ID查询(带锁)
     * @param id
     * return 结果DO对象
     */
    $table_name_hump_A$DO queryByIdLock(@Param("$primary_key_hump$") $primary_key_type_java$ $primary_key_hump$);
}

CRUD SQL模版

<?xml version="1.0" encoding="UTF-8"?>
<!-- $table_name_hump_A$Mapper.xml -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.$table_name_hump_A$DAO">
    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO $table_name$($insert_field_name_list$)
        VALUES ($insert_field_value_list$);
    </insert>
    <update id="update">
        UPDATE $table_name$ SET
            $update_field_list$
        WHERE $primary_key$ = #{$primary_key_hump$};
    </update>
    <select id="pageQuery" resultType="com.xxx.$table_name_hump_A$DO">
        SELECT $select_field_list$ FROM $table_name$
        WHERE 1=1
        $while_field_list$
        ORDER BY $primary_key$ DESC
        <if test="pageIndex != null and pageSize != null">
            LIMIT #{offset},#{rows}
        </if>
    </select>
    <select id="pageQueryCount" resultType="java.lang.Long">
        SELECT COUNT(1) as total FROM $table_name$
        WHERE 1=1
        $while_field_list$
    </select>
    <select id="queryById" resultType="com.xxx.$table_name_hump_A$DO">
        SELECT $select_field_list$ FROM $table_name$
        WHERE $primary_key$ = #{$primary_key_hump$};
    </select>
    <select id="queryByIdLock" resultType="com.xxx.$table_name_hump_A$DO">
        SELECT $select_field_list$ FROM $table_name$
        WHERE $primary_key$ = #{$primary_key_hump$} FOR UPDATE;
    </select>
</mapper>

模型转换器模版

不同层级间,可能会有不同的实体类,那么它们相互之间的数据转换,也是一个重复且浪费时间的工作,所以也可以配置一个模版。

import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
 * $table_desc$模型转换器
 * Created by 创建人 on $current_time$
 */
public class $table_name_hump_A$Converter {
    /**
     * dto转do
     * @param source
     * return do模型
     */
    public static $table_name_hump_A$DO toDo($table_name_hump_A$DTO source){
        $table_name_hump_A$DO target = new $table_name_hump_A$DO();
        $converter_source_to_target_params_list$
        return target;
    }
    /**
     * do转dto
     * @param source
     * return dto模型
     */
    public static $table_name_hump_A$DTO toDto($table_name_hump_A$DO source){
        $table_name_hump_A$DTO target = new $table_name_hump_A$DTO();
        $converter_source_to_target_params_list$
        return target;
    }
    /**
     * do list 转 dto
     * @param data
     * return list dto模型
     */
    public static List<$table_name_hump_A$DTO> toDtoList(List<$table_name_hump_A$DO> data){
        if (CollectionUtils.isEmpty(data)){
            return null;
        }
        List<$table_name_hump_A$DTO> list = new ArrayList<>();
        for ($table_name_hump_A$DO item : data){
            list.add($table_name_hump_A$Converter.toDto(item));
        }
        return list;
    }
}

成员代码块 模型转换器参数列表(converter_source_to_target_params_list)

target.set$field_name_hump_A$(source.get$field_name_hump_A$());
相关文章
|
人工智能 自然语言处理 安全
【网安AIGC专题10.19】论文3代码生成:ChatGPT+自协作代码生成+角色扮演(分析员、程序员、测试员)+消融实验、用于MBPP+HumanEval数据集
【网安AIGC专题10.19】论文3代码生成:ChatGPT+自协作代码生成+角色扮演(分析员、程序员、测试员)+消融实验、用于MBPP+HumanEval数据集
405 0
|
机器学习/深度学习 人工智能 自然语言处理
ChatGPT发展到了什么程度?代码生成,程序员将被取代?
ChatGPT发展到了什么程度?代码生成,程序员将被取代?
225 0
|
人工智能 数据可视化 安全
科技 “新贵”ChatGPT 缘何 “昙花一现” ,仅低代码风靡至今
科技 “新贵”ChatGPT 缘何 “昙花一现” ,仅低代码风靡至今
234 1
|
运维 Cloud Native 数据可视化
低代码是行业毒瘤吗?ChatGPT这样回答
低代码是行业毒瘤吗?ChatGPT这样回答
146 0
|
人工智能 自然语言处理 数据可视化
|
存储 人工智能 移动开发
探索低代码的新形态(D2C、ChatGPT)
探索低代码的新形态(D2C、ChatGPT)
768 0
|
SQL Java
非低代码,我写了一个比ChatGPT还牛的CRUD代码生成器 下
非低代码,我写了一个比ChatGPT还牛的CRUD代码生成器 下
|
2月前
|
机器学习/深度学习 数据采集 人工智能
从ChatGPT到文心一言:AI为什么能“懂人话”?——大语言模型的底层逻辑揭秘
从ChatGPT到文心一言:AI为什么能“懂人话”?——大语言模型的底层逻辑揭秘
389 9
|
5月前
|
传感器 存储 人工智能
ChatGPT让AI展现‘智能’魅力,函数调用和RAG如何助力迈向AI Agent?
本文由AI产品专家三桥君探讨了AI从被动响应到主动决策的演进路径,重点分析了函数调用和RAG技术在构建AI Agent中的关键作用。文章梳理了大模型能力的迭代(原生能力与涌现能力),技术演进的三个阶段(提示工程→函数调用→RAG),并提出AI Agent需具备环境感知、推理决策和行动执行的核心要素。AI产品专家三桥君认为,未来AGI需突破跨领域学习、实时更新和安全性挑战,最终实现如"贾维斯"般的智能伙伴。
215 1
ChatGPT让AI展现‘智能’魅力,函数调用和RAG如何助力迈向AI Agent?
|
10月前
|
人工智能 Linux API
Omnitool:开发者桌面革命!开源神器一键整合ChatGPT+Stable Diffusion等主流AI平台,本地运行不联网
Omnitool 是一款开源的 AI 桌面环境,支持本地运行,提供统一交互界面,快速接入 OpenAI、Stable Diffusion、Hugging Face 等主流 AI 平台,具备高度扩展性。
1099 94
Omnitool:开发者桌面革命!开源神器一键整合ChatGPT+Stable Diffusion等主流AI平台,本地运行不联网

热门文章

最新文章