您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

手把手教你开发一套代码生成器,学不会的来怼我!

时间:2023-03-14 11:07:49  来源:微信公众号  作者: Java极客技术

​一、介绍

在实际的软件项目开发过程中,我可以很负责任的跟大家说,如果你真的实际写代码的时间超过5年,你对增删改查这类简单的功能需求开发,可以说已经完全写吐了,至少我就是这种类型的。

但是呢,不可否认,绝大多数的软件功能,向下追随到最基本的单元,也基本都是单表的增、删、改、查!

只是随着用户需求不断增多,原来可能一个张单表就可以搞定的事情,现在可能需要多张表,或者多个库才能搞定,代码层就像堆积木一样,越堆越复杂。

我记得早期做项目的时候,项目每新加一张单表,我都需要在代码层,按照MVC​框架的思想,重新编写一套CURD的代码,写完所有的基础的增删改查,至少需要20分钟,手快的情况下,最快也要10分钟。

假如某个新开发的功能,要新增10张表,按照这个时间计算,至少要100分钟,仔细想想,其实你会发现大部分的时间都浪费在这些简单而又重复的编程圈子中去了。

那有没有一个办法,将这些简单的CURD代码,全部都标准化、公共化呢?这样我们的可以省下很多时间来投入业务场景的开发。

答案是肯定的,有!

我记得早期我最先接触的是MyBatisGenertor​工具包,通过这个工具包,我们可以省去大部分的mybAIts中xml​文件的curd编写工作。

还有我们所熟悉的JPA​,里面有一套公共的持久层动态代理类,它可以自动根据名称生成SQL语句,能为开发省下不少的事情。

但是我这个人比较懒,我想搞一个工具,从controller、service、entity 、dao​层,全部的crud代码,包括单元测试类,通过工具自动生成好。

像这样的工具,现在网上也有不少,例如我们所熟悉的Mybatis-plus插件,它就可以做到这一点,也是非常好用。

但是有的公司就不喜欢它,原因也很简单,里面的很多公共方法封装的过于深入,而且很多crud的sql全部都是动态生成,你根本看不到。

总之啊就是一句,不在自己掌控之内的,很多程序员总是带着各种疑虑~~

当然,还有一个明显的疑虑,就是对微服务的开发,不能全面支持,比如你项目采用的是SpringBoot +Dubbo​组合来开发,这个时候生成的controller,完全没啥用处,而且还很鸡肋。

因此在这种情况下,你得基于当前的项目软件开发规则,自己开发一套代码生成器,以满足快速开发的需要。

下面我就简单的介绍一下,如何自行开发一套代码生成器,过程如下!

二、代码实践

其实开发一套代码生成器,真没大家想象中的那么复杂,其中用的最重要一项技术,就是利用模板来生成代码,例如我们经常使用的模板引擎freemarker,它就可以帮助我们实现这一点。

2.1、首先我们添加 freemarker 依赖包

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.23</version>
</dependency>

2.2、然后创建一个代码模版

下面我们以动态创建实体类为例,编写一个实体类的模板entity.JAVA.ftl​,其中${}里面定义的是动态变量。

package ${package};

import java.io.Serializable;

/**
 * <p>
 * ${tableComment}
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
public class ${entityClass} implements Serializable {

    private static final long serialVersionUID = 1L;
    
    <#--属性遍历-->
    <#list columns as pro>

    /**
     * ${pro.comment}
     */
    private ${pro.propertyType} ${pro.propertyName};
    </#list>

    <#--属性get||set方法-->
    <#list columns as pro>
    public ${pro.propertyType} get${pro.propertyName?cap_first}() {
        return this.${pro.propertyName};
    }

    public ${entityClass} set${pro.propertyName?cap_first}(${pro.propertyType} ${pro.propertyName}) {
        this.${pro.propertyName} = ${pro.propertyName};
        return this;
    }
    </#list>
}

2.3、最后生成目标代码

最后我们基于freemarker编写一个测试类!

public class CodeGeneratorDemo {

    public static void main(String[] args) throws IOException, TemplateException {
        Map<String, Object> objectMap = new HashMap<>();
        //定义包路径
        objectMap.put("package", "com.example.test");
        //定义实体类
        objectMap.put("entityClass", "Student");

        //定义实体类属性
        List<Map<String, Object>> columns = new ArrayList<>();
        //姓名字段
        Map<String, Object> column1 = new HashMap<>();
        column1.put("propertyType", "String");
        column1.put("propertyName", "name");
        column1.put("comment", "姓名");
        columns.add(column1);
        //年龄字段
        Map<String, Object> column2 = new HashMap<>();
        column2.put("propertyType", "Integer");
        column2.put("propertyName", "age");
        column2.put("comment", "年龄");
        columns.add(column2);

        //定义类的属性
        objectMap.put("columns", columns);
        //定义作者
        objectMap.put("author", "张三");
        //定义创建时间
        objectMap.put("date", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
        //定义类描述
        objectMap.put("tableComment", "学生信息");

        //生产目标代码
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
        configuration.setDefaultEncoding(Charset.forName("UTF-8").name());
        configuration.setClassForTemplateLoading(CodeGeneratorDemo.class, "/");
        Template template = configuration.getTemplate("/templates/entity.java.ftl");
        FileOutputStream fileOutputStream = new FileOutputStream(new File("../src/main/java/com/example/generator/Student.java"));
        template.process(objectMap, new OutputStreamWriter(fileOutputStream, Charset.forName("UTF-8").name()));
        fileOutputStream.close();
        System.out.println("文件创建成功");

    }
}

运行程序,输出的文件结果如下!

package com.example.test;

import java.io.Serializable;

/**
 * <p>
 * 学生信息
 * </p>
 *
 * @author 张三
 * @since 2021-08-22
 */
public class Student implements Serializable {

    private static final long serialVersionUID = 1L;
    

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

    public String getName() {
        return this.name;
    }

    public Student setName(String name) {
        this.name = name;
        return this;
    }
    public Integer getAge() {
        return this.age;
    }

    public Student setAge(Integer age) {
        this.age = age;
        return this;
    }
}

与预期的效果一致,成功生成!

以上就是生成代码最核心的部分,首先编写一套模板,把需要填充的信息全部定义成动态变量,然后在代码中,通过map数据格式,使用freemarker进行填充!

例如小编我就是采用这种方式,首先把要通过工具生成的代码,全部通过模板方式定义好。

图片

然后通过连接数据库的方式,把需要自动生成的表结构查询出来,封装成数据渲染参数,最后传入到freemarker​中去,非常简单、快速的生成与自己预期想要的代码,所有单表的crud全部一步到位!

下面这个就是小编,基于当前项目定制开发的一款代码生成器,项目采用SpringBoot + Dubbo​框架开发,没有Controller层,截图中所有的代码全部都是采用代码生成器生成的,直接通过单元测试就可以运行,开发的时候非常快!

图片

由于开发的代码生成器工具,代码有点过多,因此不便于通过文章分享给大家,有需要的朋友,可以访问如下链接获取:https://Github.com/justdojava/springboot-example-generator

三、小结

代码生成器,对于擅长以业务开发为主的程序员来说,绝对是一个巨大的福利,它能很明显的减轻开发人员的工作量,并且提升开发效率,能腾出更多的时间专注业务开发。

实际上,目前网上已经有很多的成熟、稳定的代码生成器,mybatis-plus​就是其中一个使用非常广泛的代码生成器,对于以单体web开发为主的项目,它完全满足要求。

当然,如果当下你没有合适的代码生成器,不妨自己试试开发一款属于自己的代码生成器,同样也可以加倍提升开发效率。

四、参考

1、MyBatis-Plus 文档



Tags:代码生成器   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
大型语言模型和人工智能代码生成器的兴起
译者 | 李睿本文作者Martin Heller是一名Web和Windows编程顾问,也是行业媒体InfoWorld的特约编辑和评论员。Heller表示,他在2021年11月撰写关于GitHub Copilot的文章时,Copilot...【详细内容】
2023-08-04  Search: 代码生成器  点击:(165)  评论:(0)  加入收藏
CSS 代码生成器TOP10
免费的在线代码生成器将允许您快速迭代和构建您的代码。这里有十个最喜欢的用于创建 CSS 代码的工具,可在此页面上免费使用。1、Animista地址:https://animista.net/对于使用...【详细内容】
2023-05-18  Search: 代码生成器  点击:(305)  评论:(0)  加入收藏
手把手教你开发一套代码生成器,学不会的来怼我!
​一、介绍在实际的软件项目开发过程中,我可以很负责任的跟大家说,如果你真的实际写代码的时间超过5年,你对增删改查这类简单的功能需求开发,可以说已经完全写吐了,至少我就是这...【详细内容】
2023-03-14  Search: 代码生成器  点击:(138)  评论:(0)  加入收藏
Hasty 一个功能强大的WordPress的代码生成器
Hasty是WordPress的代码生成器。你可以在浏览器中使用它,可以自定义帖子类型、边栏、菜单等生成你需要的的代码。Hasty有两个版本一个免费和高级版本。Hasty详细介绍:Hasty加...【详细内容】
2022-12-06  Search: 代码生成器  点击:(410)  评论:(0)  加入收藏
行走的代码生成器:chatGPT要让谷歌和程序员“下岗”了
就在本周,OpenAI 又发布了一个全新的聊天机器人模型 ChatGPT,作为 GPT-3.5 系列的主力模型之一。图源:源于网络图片来源:OpenAI了&mdash;&mdash;很快,网友们就被 ChatGPT 的能力...【详细内容】
2022-12-06  Search: 代码生成器  点击:(301)  评论:(0)  加入收藏
Mybatis代码生成器Mybatis-Generator使用详解
最近在做创业项目的时候因为有比较多的新需求,需要频繁基于DDL生成Mybatis适合的实体、Mapper接口和映射文件。其中,代码生成器是MyBatis Generator(MBG),用到了Mybatis-Genera...【详细内容】
2021-08-12  Search: 代码生成器  点击:(4998)  评论:(0)  加入收藏
SpringBoot代码生成器,让你释放双手,从此不用手撸代码
前言通常在开始开发项目的时候,首先会建立好数据库相关表,然后根据表结构生成 Controller、Service、DAO、Model以及一些前端页面。如果开发前没有强制的约束,而每个程序员都...【详细内容】
2020-05-22  Search: 代码生成器  点击:(352)  评论:(0)  加入收藏
四款强大的PHP代码生成器
一般来说,用PHP和MySQL编写一个数据库应用程序都会花费很多时间和精力 -你要设计HTML格式,编写查询,执行验证/错误处理,测试应用程序等大量工作。PHP代码生成器会自动生成所需的...【详细内容】
2019-12-13  Search: 代码生成器  点击:(578)  评论:(0)  加入收藏
php之"EXCEL导出"代码生成器的实现思路
在实际工作中经常会遇到将数据导出到excel这样的需求,对于php语言来说导出excel也不是什么难事,因为借助phpoffice之phpspreadsheet开源库可以轻松实现.有过导出EXCEL经验的...【详细内容】
2019-11-14  Search: 代码生成器  点击:(554)  评论:(0)  加入收藏
▌简易百科推荐
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(0)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(6)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
站内最新
站内热门
站内头条