首先说明下我为什么要开发自己的代码生成工具,因为现有的代码生成工具不是很满足我的需求。我有如下的需求:
-
我想自动帮我生成数据库中的枚举(需要字段的描述信息给到足够的信息)
-
我想针对某些jsonb类型自动生成对象和TypeHandler
-
我可能会调整自动为我生成的枚举(我可能会增加一些备注信息),但是我希望我第二次生成的时候不要覆盖我的变化
-
我可能会修改自动为jsonb类型生成的类的名称,字段、描述信息,但是我不想我第二次生成的时候覆盖掉这些变化
-
我一定会进行二次生成,但数据库中发生了变化,我希望通过二次生成将这些变化体现到我的代码中,而不是通过自己手动填写,这样会让我的代码和数据库中的代码失去同步
经过技术评估,我发现3、4、5点实现难度非常高,有两种方案可选:一是解析java文件,解析java文件的方案要求用户高度遵守规则,这个有点难以实现;二是使用动态编译和动态加载的方案,但是这个方案存在诸多技术上的问题,而且研究这些技术的成本实在是太高,而且应用面狭窄。我最终放弃了这两个方案。
我最终的方案是开发一个Web应用,全面接管代码生成工作,确保Entity、Enum的生成过程完全是由我自己控制的。如果需要进行修改,也需要通过Web应用完成,从而实现代码永远都是支持二次生成的。
这个Web应用会记录用户的所有修改,当数据库中的数据发生变化时,会进行数据的对比,确保用户的修改能在二次生成中保留。这个应用不会保留任何用户在源码上进行的修改,它会直接覆盖掉这些源码(运行在本地)。
这么Web设计支持的功能如下:
- 解析数据库中的表,收集枚举需求、对象需求
- 支持用户对枚举的配置,配置项包括:枚举名称、枚举备注、枚举项(支持添加数据库中不存在的项)
- 支持用户对对象的配置,配置项包括:对象名称、对象备注、对象字段、对象字段备注
- 支持将生成的java类直接写到目标文件夹(仅本地运行支持)
- 支持下载所有生成的java类(优先级非常低,暂时不实现)