欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用IDEA插件EasyCode实现数据库表反向生成实体类

程序员文章站 2022-07-14 08:38:34
...

前言

 一次偶然的机会发现了这个功能强大的idea插件,当时也就随手收藏了一下,没想到在后面的工作中给节省了很多时间。

介绍

EasyCode是基于IntelliJ IDEA Ultimate版开发的一个代码生成插件,主要通过自定义模板(基于velocity)来生成各种你想要的代码。通常用于生成Entity、Dao、Service、Controller。如果你动手能力强还可以用于生成HTML、JS、PHP等代码。理论上来说只要是与数据有关的代码都是可以生成的。

使用环境

IntelliJ IDEA Ultimate版(172+)

功能说明:

  • 支持多表同时操作
  • 支持同时生成多个模板
  • 支持自定义模板
  • 支持自定义类型映射(支持正则)
  • 支持自定义扩展属性
  • 支持对表属性进行手动配置
  • 所有配置项目支持分组模式,在不同项目(或选择不同数据库时),只需要切换对应的分组,所有配置统一变化。

安装和使用

具体的安装和使用参照该插件作者的博客 https://gitee.com/hbyufan/EasyCode

使用ORACLE注意事项

我们公司用的都是oracle数据库,因此我当时下载这个插件之后也是使用了oracle数据库生成代码的,当我兴致勃勃的选中一张表点击Generate Code的时候发现,报个未知的错误类型,一脸懵,心想这玩意不支持oracle的number类型啊,有点灰心,然后又仔细的看了下作者的博客,发现原来类型是可以配置的,加上number的正则number(\(\*\))?,number(\(\d+\))?即可,其他缺少的类型只要加上对应的正则以及对应的javaType就可以了,配置如下

使用IDEA插件EasyCode实现数据库表反向生成实体类

生成包含注解的实体类

解决好类型错误之后,终于可以生成对应的实体类了,生成的效果如下

package com.chq.common.model.entity;

import java.util.Date;

/**
 * 城市管理表(XhsCityManage)表实体类
 *
 * @author chenhq
 * @since 2018-09-13 20:17:24
 */
public class XhsCityManage {
    //主键
    private String id;
    //城市代码
    private String cityCode;
    //城市名称
    private String cityName;
    //入驻状态:0-未入住,1-已入驻
    private String status;
    //城市简介
    private String cityIntro;
    //创建时间
    private Date createTime;
    
    private Date updateTime;
    //是否展示企业详情页下载舆情报告按钮,0:显示, 1:不显示
    private String showButton;


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getCityCode() {
        return cityCode;
    }

    public void setCityCode(String cityCode) {
        this.cityCode = cityCode;
    }

    public String getCityName() {
        return cityName;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getCityIntro() {
        return cityIntro;
    }

    public void setCityIntro(String cityIntro) {
        this.cityIntro = cityIntro;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    public String getShowButton() {
        return showButton;
    }

    public void setShowButton(String showButton) {
        this.showButton = showButton;
    }

}

生成的效果还是不错的,但是还没有得到我的预期,于是通过再次研究作者的文章发现这些都是也是可以配置的,使用velocit模板语言的语法去写的

使用IDEA插件EasyCode实现数据库表反向生成实体类

增加了一些空行,修改了注释的方式,增加了hibernate的注解,生成的效果如下,是不是清爽了许多,至此大功告成啦!除此之外,还可以生成dao、service、controller等等,都可以自己去配置,简直是太方便了~

package com.chq.common.model;

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Entity;
import org.hibernate.annotations.GenericGenerator;
import java.io.Serializable;

/**
 * @description 城市管理表(XHS_CITY_MANAGE)表实体类
 * @author chenhq
 * @date 2018-09-13 20:23:58
 */
@Entity
@Table(name = "XHS_CITY_MANAGE")
public class XhsCityManage implements Serializable {

    /**
     * 主键
     */
    private String id;

    /**
     * 城市代码
     */
    private String cityCode;

    /**
     * 城市名称
     */
    private String cityName;

    /**
     * 入驻状态:0-未入住,1-已入驻
     */
    private String status;

    /**
     * 城市简介
     */
    private String cityIntro;

    /**
     * 创建时间
     */
    private Date createTime;

    private Date updateTime;

    /**
     * 是否展示企业详情页下载舆情报告按钮,0:显示, 1:不显示
     */
    private String showButton;

    @Id
    @Column(name = "ID")
    @GenericGenerator(name = "system-uuid", strategy = "uuid.hex")
    @GeneratedValue(generator = "system-uuid")
    public String getId() {
        return id;
    }
    
    public void setId(String id) {
        this.id = id;
    }
        
    @Column(name = "CITY_CODE")
    public String getCityCode() {
        return cityCode;
    }
    
    public void setCityCode(String cityCode) {
        this.cityCode = cityCode;
    }
        
    @Column(name = "CITY_NAME")
    public String getCityName() {
        return cityName;
    }
    
    public void setCityName(String cityName) {
        this.cityName = cityName;
    }
        
    @Column(name = "STATUS")
    public String getStatus() {
        return status;
    }
    
    public void setStatus(String status) {
        this.status = status;
    }
        
    @Column(name = "CITY_INTRO")
    public String getCityIntro() {
        return cityIntro;
    }
    
    public void setCityIntro(String cityIntro) {
        this.cityIntro = cityIntro;
    }
        
    @Column(name = "CREATE_TIME")
    public Date getCreateTime() {
        return createTime;
    }
    
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
        
    @Column(name = "UPDATE_TIME")
    public Date getUpdateTime() {
        return updateTime;
    }
    
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
        
    @Column(name = "SHOW_BUTTON")
    public String getShowButton() {
        return showButton;
    }
    
    public void setShowButton(String showButton) {
        this.showButton = showButton;
    }
        
}

最后附上自己的entity配置

#*
说明文档:
属性
$packageName 选择的包名
$author 设置中的作者
$encode 设置的编码
$modulePath 选中的module路径
$projectPath 项目绝对路径
对象
$tableInfo 表对象
    obj 表原始对象
    name 表名(转换后的首字母大写)
    comment 表注释
    fullColumn 所有列
    pkColumn 主键列
    otherColumn 其他列
    savePackageName 保存的包名
    savePath 保存路径
    saveModelName 保存的model名称
columnInfo 列对象
    obj 列原始对象
    name 列名(首字母小写)
    comment 列注释
    type 列类型(类型全名)
    ext 附加字段(Map类型)
$tableInfoList 所有选中的表
$importList 所有需要导入的包集合
回调
&callback
    setFileName(String) 设置文件储存名字
    setSavePath(String) 设置文件储存路径,默认使用选中路径
工具
$tool
    firstUpperCase(String) 首字母大写方法
    firstLowerCase(String) 首字母小写方法
    getClsNameByFullName(String) 通过包全名获取类名
    getJavaName(String) 将下划线分割字符串转驼峰命名(属性名)
    getClassName(String) 将下划线分割字符串转驼峰命名(类名)
    append(... Object) 多个数据进行拼接
$time
    currTime(String) 获取当前时间,指定时间格式(默认:yyyy-MM-dd HH:mm:ss)
*#
##设置包路径

##设置回调
$!callback.setFileName($tool.append($tableInfo.name, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/"))
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}#{end};

#foreach($import in $importList)
import $!import;
#end
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Entity;
import org.hibernate.annotations.GenericGenerator;
import java.io.Serializable;

/**
 * @description $!{tableInfo.comment}($tableInfo.obj.getName())表实体类
 * @author $author
 * @date $!time.currTime()
 */
@Entity
@Table(name = "$tableInfo.obj.getName()")
public class $!{tableInfo.name} implements Serializable {
#foreach($column in $tableInfo.fullColumn)
#if(${velocityCount} ==  1)

#end
#if(${column.comment})
    /**
     * ${column.comment}
     */
#end
    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};

#end
#foreach($column in $tableInfo.fullColumn)
#if(${velocityCount} ==  1)
    @Id
    @Column(name = "$column.obj.getName()")
    @GenericGenerator(name = "system-uuid", strategy = "uuid.hex")
    @GeneratedValue(generator = "system-uuid")
#else
    @Column(name = "$column.obj.getName()")
#end
    public $!{tool.getClsNameByFullName($column.type)} get$!{tool.firstUpperCase($column.name)}() {
        return $!{column.name};
    }
    
    public void set$!{tool.firstUpperCase($column.name)}($!{tool.getClsNameByFullName($column.type)} $!{column.name}) {
        this.$!{column.name} = $!{column.name};
    }
        
#end
}