背景:公司的一个新项目,DDD+JPA Restful风格的微服务系统。
做了一个功能后,就想着能不能做个插件,提高功效。
下面记录的是思考到实现的过程。
思考1 – ORMapping
不管是 JPA 方式还是 MyBatis ,都会有一个Table列到 Java 对象属性的映射,如图一所示。
如果Table有很多列,如图二所示,要写映射到Java对象属性很麻烦。
思考2 – 调用链过程
SpringBoot的调用链过程套路基本一样。从ViewController –> Service –> DAO
如图三所示, 微服务 多一层Application Service,整合Feign的调用。
思考3 – 基础功能
基础功能雷同,大都包含以下操作
- 新增
- 修改
- 删除(批量删除)
- 详情
- 分页查询
思考4 – 请求风格统一
- 新增 – PUT **/
- 修改 – POST **/
- 删除 – DELETE **/{id}
- 批量删除 – DELETE **/ batch Delete
- 详情 – GET **/{id}
- 分页查询 – GET **/page/{pageNo}/{pageSize}
基于上面的思考,是不是能做成自动化的代码?
Table转Java对象,可以通过元数据
调用过程,基础功能, Restful 可以通过模板
Postgres表元数据
要实现上面的自动化功能,需要自动获取的数据如下
- 表的名称
- 表的备注
- 列的名称
- 列的数据类型
- 列是否主键
- 列是否非空
- 列的备注
通过系统表可以得到
- pg_class
- pg_attribute
- pg_namespac
- pg_type
- pg_constraint
这里有个约定,表的 ddl 采用西班牙命名,用下划线分隔。这样转Java对象的时候,属性名称可以方便的转驼峰,生成的Java代码比较友好。
模板文件
做一个功能,实现ViewController,Domain Service,Repo,Entity, DTO ,DO
其中对象转换采用的是MapStruct。然后把功能相关的都用变量替换。如图四
这样模板文件也有了
然后外面再套一层,做成批量的。这样一整个库的表,瞬间就可以生成Java代码。
再进一步,能不能做成 IDEA 的插件,同事都可以用上,自动化生成代码呢
如何做成插件
开发环境
IDEA社区版 + IntelliJ Platform SDK + Gradle
需要的技能
- 了解 Gradle
需要引入Jdbc驱动包, Freemarker 模板
- 基础 Swing
插件需要配置界面,通过Swing画
开发步骤
- 创建工程:选 Intellij Platform Plugin
- Plugin.xml:填写在IDEA Plugin显示的信息
- 新建Action:确定插件入口在菜单的位置
- 开发配置界面
- 事件调用业务代码
大功告成!!