看完本文,你一定会有所收获
一、介绍
我记得最早刚步入互联网行业的时候,当时按照 MVC 的思想和模型,每次开发新功能,会依次编写 dao、service、controller相关服务类,包括对应的 dto、entity、vo 等等实体类,如果有多张单表,也会重复的编写相似的代码。
实际上,当仔细的总结一下,对于任何一张单表的操作,基本都是围绕增(Create )、删(Delete )、改(Update )、查(Retrieve )四个方向进行数据操作,简称 CRUD!
他们除了表名和存储空间不一样,基本的 CRUD 思路基本都是一样的。
为了解决这些重复劳动的痛点,业界逐渐开源了一批代码生成器,目的也很简单,就是为了减少手工操作的繁琐,集中精力在业务开发上,提升开发效率。
而今天,我们所要介绍的也是代码生成器,很多初学者可能觉得代码生成器很高深。代码生成器其实是一个很简单的东西,一点都不高深,当你看完本文的时候,你会完全掌握代码生成器的逻辑,甚至可以根据自己的项目情况,进行深度定制。
二、实现思路
下面我们就以SpringBoot项目为例,数据持久化操作采用Mybatis,数据库采用Mysql,编写一个自动生成增、删、改、查等基础功能的代码生成器,内容包括controller、service、dao、entity、dto、vo等信息。
实现思路如下:
- 第一步:获取表字段名称、类型、表注释等信息
- 第二步:基于 freemarker 模板引擎,编写相应的模板
- 第三步:根据对应的模板,生成相应的 java 代码
2.1、获取表结构
首先我们创建一张test_db表,脚本如下:
1 | |
表创建完成之后,基于test_db表,我们查询对应的表结果字段名称、类型、备注信息,这些信息收集将用于后续进行代码生成器所使用!
1 | |

同时,获取对应表注释,用于生成备注信息!
1 | |

2.2、编写模板
- 编写
mapper模板,涵盖新增、修改、删除、查询等信息
1 | |
- 编写
dao数据访问模板
1 | |
- 编写
service服务接口模板
1 | |
- 编写
serviceImpl服务实现类模板
1 | |
- 编写
controller控制层模板
1 | |
- 编写
entity实体类模板
1 | |
- 编写
dto实体类模板
1 | |
- 编写
vo视图实体类模板
1 | |
可能细心的网友已经看到了,在模板中我们用到了BaseMapper、BaseService、BaseServiceImpl等等服务类。
之所以有这三个类,是因为在模板中,我们有大量的相同的方法名包括逻辑也相似,除了所在实体类不一样意以外,其他都一样,因此我们可以借助泛型类来将这些服务抽成公共的部分。
BaseMapper,主要负责将dao层的公共方法抽出来
1 | |
BaseService,主要负责将service层的公共方法抽出来
1 | |
BaseServiceImpl,service层的公共方法具体实现类
1 | |
在此,还封装来其他的类,例如 dto 公共类BaseDTO,分页类Pager,还有 id 请求类IdRequest。
BaseDTO公共类
1 | |
Pager分页类
1 | |
IdRequest公共请求类
1 | |
2.3、编写代码生成器
前两部分主要介绍的是如何获取对应的表结构,以及代码器运行之前的准备工作。
其实代码生成器,很简单,其实就是一个main方法,没有想象中的那么复杂。
处理思路也很简单,过程如下:
- 1、定义基本变量,例如包名路径、模块名、表名、转换后的实体类、以及数据库连接配置,我们可以将其写入配置文件
- 2、读取配置文件,封装对应的模板中定义的变量
- 3、根据对应的模板文件和变量,生成对应的java文件
2.3.1、创建配置文件,定义变量
小编我用的是application.properties配置文件来定义变量,这个没啥规定,你也可以自定义文件名,内容如下:
1 | |
2.3.2、根据模板生成对应的java代码
- 首先,读取配置文件变量
1 | |
- 然后,封装对应的模板中定义的变量
1 | |
- 接着,获取模板文件,并生成相应的模板文件
1 | |
- 最后,我们编写一个
main方法,看看运行之后的效果
1 | |
结果如下:

- 生成的 Controller 层代码如下
1 | |
至此,一张单表的90%的基础工作量全部开发完毕!
三、总结
代码生成器,在实际的项目开发中应用非常的广,本文主要以freemaker模板引擎为基础,开发的一套全自动代码生成器,一张单表的CRUD,只需要5秒钟就可以完成!
最后多说一句,如果你是项目负责人,那么代码生成器会是一个比较好的提升项目开发效率的工具,希望能帮到各位!