代码生成器 - 使用教程

Collect from 千千科技

1. 概述

1.1 开发初衷

开发的时候很多CRUD是重复的工作,没有技术含量但是比较繁琐,这种事情做多了就是在无端地空耗生命。因此,自己就想写代码生成器解放双手,把精力放在核心业务处理上。与其他仅能生成持久层代码且格式固定的代码生成器不同,本代码生成器可根据实际项目定制化编写,将重复的代码抽取出来动态生成相关代码。目前支持MySQL,PostgreSQL和Oracle等众多数据库,持久层是MyBatis-Plus,可生成Controller层,model(DTO和VO)及其转化代码Convert,SpringCloud的Feign和Dubbo微服务的RPC,Swagger接口文档,逻辑删除数据操作,单表和多表级联及批量操作相关代码。更多的功能以后会在业务开发过程中,根据实际需求逐步完善,并同步到官网,文末附下载链接。

1.2 效果展示

项目cropscan的包下所有代码都是代码生成器生成,不用手写任何CRUD代码,运行了就可以调接口测试。这极大减轻了开发量,特别是重构项目,数据库好几十张表,就是复制粘贴修改,也得花大把时间,中间可能还会出bug,格式也不一定规范。使用代码生成器,按照一定的编程规范毫秒级帮你生成上万行代码。


2. 使用教程

2.1 项目说明

下载并打开CodeGenDemo项目,一个有3个maven子工程:

  • common: 存放通用工具类
  • codegen: 代码生成器
  • gendemo: 将代码生气器生成的代码粘贴到本demo项目,运行后可调接口测试

2.2 代码生成

打开codegen模块下的application.yml,需要设置好各代码的生成路径和数据库连接等配置信息。这里的3级目录cropscan是项目名称,通常与数据库名和微服务名称相同,一般只要把这个改成自己的名称就行。本教程项目和数据库名称都用cropscan,自己建一个名为cropscan的数据库,导入doc目录里面的sql文件,配置好数据库连接。

配置文件修改好后,运行CodeApplication即可生成相关代码。这里可以指定单张表,只生成该表的代码,如果不指定表,默认生成数据库所有表的代码。如果指定前缀了,生成类时会去除前缀,下划线自动转驼峰。

运行成功后会在cropscan目录下生成各模块的代码,将除xml外的文件复制到gendemo的java的同名目录下。xml里面的文件是mybatis写sql的文件,复制到gendemo的resources的mapper目录下。MyBatis-Plus条件构造器和注解很强大,不写很复杂sql的话,xml一般用的少,非必须文件。

2.3 效果测试

将代码生成器生成的代码复制到gendemo指定的目录后,配置好数据库连接,运行SpringBooApplication即可调接口查看效果,不用手写任何代码。

浏览器输入: http://localhost:8888/doc.html 查看Swagger接口文档并调用接口测试。


3. 注意事项

本项目完美支持MySQL,PostgreSQL和Oracle数据库,写好自测了才发布。SQL Server,达梦等数据库遵循同一套JDBC规范,也能生成代码,一些细节等以后接触相关数据库了再优化。

3.1 逻辑删除

codegen的application.yml文件中有逻辑删除字段"tableLogic",如果有值则设置为数据库对应字段,没有值则直接不填,不要用""(yml的""会读成引号,判断不为空)。 MyBatis-Plus(截至v3.5版本)的条件构造器不支持对已经逻辑删除的数据进行操作,得自己通过xml写sql语句,如果启用了逻辑删除字段,本代码生成器会在Mapper里面生成对逻辑删除数据的CRUD代码。

3.2 注释

在设计表的时候,尽量把字段的注释和表的注释写好,这样在生成代码的时候就自动生成各种注释了,既方便又规范。数据库需要设置主键,忘记设主键了生成的很多基于主键查询和删除的代码参数类型会为空。

3.3 domain转换

domain包含DTO,VO(BO)和POJO,在前端传参和后端返回参数的时候就需要相互转换。

  • DTO:前端传递给后端的参数接收类,只保留一些关键的接收字段,简化了参数量还能保证一些隐私数据不会被传参恶意篡改。添加,查询和更新都对应不同的DTO,参数量也不一样。
  • VO:后端返回给前端的数据,一些敏感数据不展示给前端,还有涉及多表查询的结果,都统一封装到VO返回。
  • POJO: 与数据库表对应的实体类。

格式转换使用了MapStruct,生成的代码在convert包下,它可以自定义实现各种类型转换,很灵活。

3.4 多表操作

像MyBatis-Plus官方的代码生成器也只能生成单表的代码,而自己写的代码生成器能生成多表操作的代码,前提是数据库得配置好外键。生成代码时,脚本会通过外键查询出表之间的关联关系,进而生成CRUD代码。如果数据库没有配置外键,查不到表的关联关系,只能生成单表的CRUD代码。 有时侯为了提升数据库效率,不使用外键,如果想使用本代码生成器,可以在开发初期先配置好外键,生成代码后取消外键。多表操作重点处理一对多和一对一的关系,多对多关系也可以通过中间表转成一对多关系。

多表查询

首先配置各外键,以订单表为例,就有如下图4个外键。如果外键对应另一个表的主键,则为一对一关系;如果对应另一个表的非主键,可能查询多条数据, 因此为一对多关系

配置好外键后,运行脚本,就可以生成级联查询业务代码,POJO和VO等。一对多关系,会生成专门的代码,需要根据说明剪切到指定的Mapper中去。一对一关系,直接调用Mybatis-Plus自带方法,不用自己写方法。

代码迁移成功后,运行demo项目,使用swagger调用接口就可以测试效果。可以看到,级联的表数据都查出来了。控制台打印sql语句时,只使用了一次数据库连接,有5条sql查询语句。如果不使用级联查询,5条sql语句一条一条查,需要5次数据库连接,当网络延迟大时查询性能就会大幅下降。因此,本代码生成器的级联查询,只需要配置外键,既不需要写代码,又可以提升查询效率。

级联更新和删除

只要配置好外键,级联的业务操作都可以处理。但是级联更新和删除的业务处理相对复杂,不确定因素多,还涉及事务。这两个操作的生成代码还没写,后面如果有频繁的业务需求,也会把这块生成代码写好。

3.5 Feign和RPC

本代码生成器生成了SpringCloud的Feign和Dubbo的RPC两个微服务代码,项目中只导入了相关依赖让代码不标红报错,服务注册和配置管理都没配置,因此没法测试。想测试效果可以生成代码了拷贝到自己的微服务项目中测试,看了生成的代码你会发现,它们本质上就是调用了service层的接口,本身没有业务逻辑。所以只要代码生成器把service层的代码生成并把逻辑跑通,微服务代码也就水到渠成了。

4. 下载

本代码生成器功能要比MyBatis-Plus官方代码生成器强大很多,可根据实际业务定制化编写,生成的代码复制粘贴到demo项目中就能跑,不用手写任何代码。更多实用的功能会在以后工作中不断优化更新,如果您有更宝贵的意见,建议或疑问,可发邮箱:kili@lqjai.com 或者博客上留言: https://blog.csdn.net/m0_70140421/article/details/124875301

4.1 下载链接

代码生成器下载地址:{{download.name}}

4.2 更新记录(近5条)

4.3 下载记录(近20条)

总下载量:{{download.total}}