开发的时候很多CRUD是重复的工作,没有技术含量但是比较繁琐,这种事情做多了就是在无端地空耗生命。因此,自己就想写代码生成器解放双手,把精力放在核心业务处理上。与其他仅能生成持久层代码且格式固定的代码生成器不同,本代码生成器可根据实际项目定制化编写,将重复的代码抽取出来动态生成相关代码。目前支持MySQL,PostgreSQL和Oracle等众多数据库,持久层是MyBatis-Plus,可生成Controller层,model(DTO和VO)及其转化代码Convert,SpringCloud的Feign和Dubbo微服务的RPC,Swagger接口文档,逻辑删除数据操作,单表和多表级联及批量操作相关代码。更多的功能以后会在业务开发过程中,根据实际需求逐步完善,并同步到官网,文末附下载链接。
项目cropscan的包下所有代码都是代码生成器生成,不用手写任何CRUD代码,运行了就可以调接口测试。这极大减轻了开发量,特别是重构项目,数据库好几十张表,就是复制粘贴修改,也得花大把时间,中间可能还会出bug,格式也不一定规范。使用代码生成器,按照一定的编程规范毫秒级帮你生成上万行代码。
{{i + 1}} / {{display.length}}
下载并打开CodeGenDemo项目,一个有3个maven子工程:
打开codegen模块下的application.yml,需要设置好各代码的生成路径和数据库连接等配置信息。这里的3级目录cropscan是项目名称,通常与数据库名和微服务名称相同,一般只要把这个改成自己的名称就行。本教程项目和数据库名称都用cropscan,自己建一个名为cropscan的数据库,导入doc目录里面的sql文件,配置好数据库连接。
配置文件修改好后,运行CodeApplication即可生成相关代码。这里可以指定单张表,只生成该表的代码,如果不指定表,默认生成数据库所有表的代码。如果指定前缀了,生成类时会去除前缀,下划线自动转驼峰。
运行成功后会在cropscan目录下生成各模块的代码,将除xml外的文件复制到gendemo的java的同名目录下。xml里面的文件是mybatis写sql的文件,复制到gendemo的resources的mapper目录下。MyBatis-Plus条件构造器和注解很强大,不写很复杂sql的话,xml一般用的少,非必须文件。
{{i + 1}} / {{copy.length}}
将代码生成器生成的代码复制到gendemo指定的目录后,配置好数据库连接,运行SpringBooApplication即可调接口查看效果,不用手写任何代码。
{{i + 1}} / {{demo.length}}
浏览器输入: http://localhost:8888/doc.html 查看Swagger接口文档并调用接口测试。
{{i + 1}} / {{swagger.length}}
本项目完美支持MySQL,PostgreSQL和Oracle数据库,写好自测了才发布。SQL Server,达梦等数据库遵循同一套JDBC规范,也能生成代码,一些细节等以后接触相关数据库了再优化。
codegen的application.yml文件中有逻辑删除字段"tableLogic",如果有值则设置为数据库对应字段,没有值则直接不填,不要用""(yml的""会读成引号,判断不为空)。 MyBatis-Plus(截至v3.5版本)的条件构造器不支持对已经逻辑删除的数据进行操作,得自己通过xml写sql语句,如果启用了逻辑删除字段,本代码生成器会在Mapper里面生成对逻辑删除数据的CRUD代码。
{{i + 1}} / {{logic.length}}
在设计表的时候,尽量把字段的注释和表的注释写好,这样在生成代码的时候就自动生成各种注释了,既方便又规范。
{{i + 1}} / {{anno.length}}
domain包含DTO,VO(BO)和POJO,在前端传参和后端返回参数的时候就需要相互转换。
格式转换使用了MapStruct,生成的代码在convert包下,它可以自定义实现各种类型转换,很灵活。
像MyBatis-Plus官方的代码生成器也只能生成单表的代码,而自己写的代码生成器能生成多表操作的代码,前提是数据库得配置好外键。生成代码时,脚本会通过外键查询出表之间的关联关系,进而生成CRUD代码。如果数据库没有配置外键,查不到表的关联关系,只能生成单表的CRUD代码。 有时侯为了提升数据库效率,不使用外键,如果想使用本代码生成器,可以在开发初期先配置好外键,生成代码后取消外键。多表操作重点处理一对多和一对一的关系,多对多关系也可以通过中间表转成一对多关系。
多表查询首先配置各外键,以订单表为例,就有如下图4个外键。如果外键对应另一个表的主键,则为一对一关系;如果对应另一个表的非主键,可能查询多条数据, 因此为一对多关系
配置好外键后,运行脚本,就可以生成级联查询业务代码,POJO和VO等。一对多关系,会生成专门的代码,需要根据说明剪切到指定的Mapper中去。一对一关系,直接调用Mybatis-Plus自带方法,不用自己写方法。
{{i + 1}} / {{gentabs.length}}
代码迁移成功后,运行demo项目,使用swagger调用接口就可以测试效果。可以看到,级联的表数据都查出来了。控制台打印sql语句时,只使用了一次数据库连接,有5条sql查询语句。如果不使用级联查询,5条sql语句一条一条查,需要5次数据库连接,当网络延迟大时查询性能就会大幅下降。因此,本代码生成器的级联查询,只需要配置外键,既不需要写代码,又可以提升查询效率。
{{i + 1}} / {{testtabs.length}}
只要配置好外键,级联的业务操作都可以处理。但是级联更新和删除的业务处理相对复杂,不确定因素多,还涉及事务。这两个操作的生成代码还没写,后面如果有频繁的业务需求,也会把这块生成代码写好。
本代码生成器生成了SpringCloud的Feign和Dubbo的RPC两个微服务代码,项目中只导入了相关依赖让代码不标红报错,服务注册和配置管理都没配置,因此没法测试。想测试效果可以生成代码了拷贝到自己的微服务项目中测试,看了生成的代码你会发现,它们本质上就是调用了service层的接口,本身没有业务逻辑。所以只要代码生成器把service层的代码生成并把逻辑跑通,微服务代码也就水到渠成了。
本代码生成器功能要比MyBatis-Plus官方代码生成器强大很多,可根据实际业务定制化编写,生成的代码复制粘贴到demo项目中就能跑,不用手写任何代码。更多实用的功能会在以后工作中不断优化更新,如果您有更宝贵的意见,建议或疑问,可发邮箱:
代码生成器下载地址:{{download.name}}
总下载量:{{download.total}}