1. 程式人生 > >使用IDEA外掛EasyCode實現資料庫表反向生成實體類

使用IDEA外掛EasyCode實現資料庫表反向生成實體類

前言

一次偶然的機會發現了這個功能強大的idea外掛,當時也就隨手收藏了一下,沒想到在後面的工作中給節省了很多時間。

介紹

EasyCode是基於IntelliJ IDEA Ultimate版開發的一個程式碼生成外掛,主要通過自定義模板(基於velocity)來生成各種你想要的程式碼。通常用於生成Entity、Dao、Service、Controller。如果你動手能力強還可以用於生成HTML、JS、PHP等程式碼。理論上來說只要是與資料有關的程式碼都是可以生成的。

使用環境

IntelliJ IDEA Ultimate版(172+)

功能說明:

  • 支援多表同時操作
  • 支援同時生成多個模板
  • 支援自定義模板
  • 支援自定義型別對映(支援正則)
  • 支援自定義擴充套件屬性
  • 支援對錶屬性進行手動配置
  • 所有配置專案支援分組模式,在不同專案(或選擇不同資料庫時),只需要切換對應的分組,所有配置統一變化。

安裝和使用

使用ORACLE注意事項

我們公司用的都是oracle資料庫,因此我當時下載這個外掛之後也是使用了oracle資料庫生成程式碼的,當我興致勃勃的選中一張表點選Generate Code的時候發現,報個未知的錯誤型別,一臉懵,心想這玩意不支援oracle的number型別啊,有點灰心,然後又仔細的看了下作者的部落格,發現原來型別是可以配置的,加上number的正則number(\(\*\))?,number(\(\d+\))?

即可,其他缺少的型別只要加上對應的正則以及對應的javaType就可以了,配置如下

生成包含註解的實體類

解決好型別錯誤之後,終於可以生成對應的實體類了,生成的效果如下

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模板語言的語法去寫的

增加了一些空行,修改了註釋的方式,增加了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
}