在使用JPA做项目的过程中,除了定义Entity实体类外,还需要定义很多相关的类,如DTO对象、数据库操作类、DTO与实体类转换器、操作服务接口、操作服务接口实现等。每次我们新创建一个实体类,都需要重复这个过程。一般情况下,我们可以预先定义好各个基础类或者接口,当需要创建一个新的实体类时,再基于这些基础类与接口一个个去创建所需要的类与接口,实际上代码量也不会很大,但这个过程很烦人,很多重复机械的步骤需要执行。作为一个码农,实在忍受不了这种重复性的动作,于是下定决心一定要让自己逃离这种状况。

之前使用过JHipster,通过这个工具,可以简化这个过程,我们可以只需要定义一个配置文件,然后执行JHipster的命令就可以完成所有相关类的创建,但个人对于这个东西不是很感冒,于是想是否可以通过IDEA的插件来自动生成这些代码?找了一圈没有发现比较好用的插件,于是只好自己研究写了一个插件。

这个插件使用在Spring Boot的项目中,要求项目中引入了JPA与Map Struct等依赖。先来看下它的使用与效果:

首先,需要定义一个Entity类,这个插件要求Entity类上一定要有Entity注解,否则不会有任何效果,定义如下图所示:




idea windicss typescript提示插件 idea自动提示插件_idea创建类自动生成注释


然后,打开这个Entity类,确保这个类在编辑器中是当前正在编辑的类,选择Windows -> Entity Code Generator菜单(或者也可以为其指定快捷键),此时会看到在包中生成了多个包及相关类:


idea windicss typescript提示插件 idea自动提示插件_idea jpa方法 自动提示_02


生成的这些类中包含有一些基本的功能,如基本的增删改查等。生成后,如果需要更加复杂的功能,就可以在生成的这些类中继续编写代码去实现了。

是不是很简单?只需要定义好Entity然后再按一个快捷键,所有需要的类都会自动创建完成。而且最棒的是,生成的DTO对象会默认包含有所有Entity对象的属性,并且自动添加非空及长度校验!

更加关键的时,如果项目里面已经定义好了一些基础的类,那么插件将会自动去查找这些基础类,然后新定义的类将会继承自这些基础类。关于这点,目前有一个较大的限制就是,这些基础类的类名是写死的类名,如果类名与预期的不一样,将不会使用到。关键的基础类包括BaseRepository/EntityService/AbstractBaseEntityService/AbstractBaseDTO等。我们可以在这些基础类里面去扩展不同实体类均可使用的通用功能,如扩展一个高级查询方法等。

来看下他生成的类:
*Repository: 数据库操作类;
生成目录:../repository
生成说明:如果项目中包含有BaseRepository类,那么新创建的Repository对象将会继承自该对象,否则,会自动生成一个BaseRepository并继承自该类;其中 BaseRepository继承了JpaRepository与JpaSpecificationExecutor两个接口
*DTO:数据传输对象;
生成目录:../../service/dto
生成说明:根据Entity中的属性自动生成DTO的属性及其Getter与Setter方法,如果Entity中某个属性中包含有Column注解,并且注解中包含有Not Null或者Varchar(255)等限制, 则生成的DTO对象会自动添加NotBlank、NotNull、Length等校验注解。另外,如果项目中包含有AbstractBaseDTO类,那么生成的DTO对象将会继承自该类,否则不会继承任何类;
*Mapper: DTO与Entity转换类
生成目录:../../service/mapper
生成说明:如果项目中包含有EntityMapper类,那么新创建的转换类将继承自该类,否则创建一个EntityMapper类并继承它来生成新的转换类;
*Service: 实体类操作接口
生成目录:../../service
生成说明:如果项目中没有则生成EntityService接口,新创建的实体类操作接口将继承原本存在或者新创建的EntityService接口;生成的接口中包含有save/delete/findAll/ findOne等常用接口
*ServiceImpl: 实体类操作接口实现类
生成目录:../../service/impl

生成说明:如果项目中有AbstractBaseEntityService,那么新创建的实体类将会继承自该类,否则不会继承该类。

当然这个插件还有很多需要优化的地方,如自动添加相关注释、自动创建控制器类等。后续有时间再继续完善吧,感兴趣的可以试用下,如果觉得有用的话,反馈一下给我我也会有更多的动力去完善它了,当然这个插件也就花了几个小时完成的,如果存在什么问题或者不合理的地方也请不吝赐教。