看完本文,你一定会有所收获
一、介绍
我记得最早刚步入互联网行业的时候,当时按照 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秒钟就可以完成!
最后多说一句,如果你是项目负责人,那么代码生成器会是一个比较好的提升项目开发效率的工具,希望能帮到各位!