IDEA JPA 表生成實體類 groovy 腳本

IDEA JPA 表生成實體類 groovy 腳本

注:部分代碼來源于互聯(lián)網(wǎng)

現(xiàn)存問題

無法自動判斷主鍵 只能根據(jù)名稱判斷是否是主鍵

//現(xiàn)在是根據(jù)UUID 判斷主鍵
annos: ("UUID".equals(col.getName())?"\t@Id\n\t@Basic(optional = false)\n\t@GeneratedValue(generator = \"jpa-uuid\")\n":"")+"\t@Column(name = \""+col.getName()+"\" )"]

生成實體類(部分)

package C:.Users.Mxnter.Desktop;


import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;

import java.util.Date;

/**
 * @Description  
 * @Author IDEA Auto JPA database tables generate entity Script Mxnter
 * @Date 2019-07-10 
 */

@Entity
@Table ( name ="******" )
@Data
@GenericGenerator(name = "jpa-uuid", strategy = "uuid2")
public class MgProfit implements Serializable {


    private static final long serialVersionUID =  5536760774831154871L;

    /**
     * UUID
     */
    @Id
    @Basic(optional = false)
    @GeneratedValue(generator = "jpa-uuid")
    @Column(name = "UUID" )
    private String uuid;

    /**
     * *******
     */
    @Column(name = "APPLY_ID" )
    private String applyId;

Generate ENTITYs.groovy

import com.intellij.database.model.DasTable
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil
import java.io.*
import java.text.SimpleDateFormat

/*
 * Available context bindings:
 *   SELECTION   Iterable<DasObject>
 *   PROJECT     project
 *   FILES       files helper
 */
packageName = ""
typeMapping = [
        (~/(?i)tinyint|smallint|mediumint/)      : "Integer",
        (~/(?i)int/)                             : "Long",
        (~/(?i)bool|bit/)                        : "Boolean",
        (~/(?i)float|double|decimal|real/)       : "Double",
        (~/(?i)datetime|timestamp|date|time/)    : "Date",
        (~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",
        (~/(?i)/)                                : "String"
]


FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
  SELECTION.filter { it instanceof DasTable && it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) }
}

def generate(table, dir) {
  def className = javaClassName(table.getName(), true)
  def fields = calcFields(table)
  packageName = getPackageName(dir)
  PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "UTF-8"))
  printWriter.withPrintWriter {out -> generate(out, className, fields,table)}

//    new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields,table) }
}

// 獲取包所在文件夾路徑
def getPackageName(dir) {
  return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
}

def generate(out, className, fields,table) {
  out.println "package $packageName"
  out.println ""

  out.println ""
  out.println "import lombok.Data;"
  out.println "import javax.persistence.Column;"
  out.println "import javax.persistence.Entity;"
  out.println "import javax.persistence.Table;"
  out.println "import java.io.Serializable;"
  out.println "import javax.persistence.*;"
  out.println "import org.hibernate.annotations.GenericGenerator;"
  out.println ""
  Set types = new HashSet()

  fields.each() {
    types.add(it.type)
  }

  if (types.contains("Date")) {
    out.println "import java.util.Date;"
  }

  if (types.contains("InputStream")) {
    out.println "import java.io.InputStream;"
  }
  out.println ""
  out.println "/**\n" +
          " * @Description  \n" +
          " * @Author IDEA Auto JPA database tables generate entity Script Mxnter\n" +
          " * @Date "+ new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " \n" +
          " */"
  out.println ""
  out.println "@Entity"
  out.println "@Table ( name =\""+table.getName() +"\" )"
  out.println "@Data"
  out.println "@GenericGenerator(name = \"jpa-uuid\", strategy = \"uuid2\")"
  out.println "public class $className implements Serializable {"
  out.println ""
  out.println ""
  out.println genSerialID()
  fields.each() {
    out.println ""
    // 輸出注釋
    if (isNotEmpty(it.commoent)) {
      out.println "\t/**"
      out.println "\t * ${it.commoent.toString()}"
      out.println "\t */"
    }

    if (it.annos != "") out.println "   ${it.annos.replace("[@Id]", "")}"

    // 輸出成員變量
    out.println "\tprivate ${it.type} ${it.name};"
  }

  // 輸出get/set方法
//    fields.each() {
//        out.println ""
//        out.println "\tpublic ${it.type} get${it.name.capitalize()}() {"
//        out.println "\t\treturn this.${it.name};"
//        out.println "\t}"
//        out.println ""
//
//        out.println "\tpublic void set${it.name.capitalize()}(${it.type} ${it.name}) {"
//        out.println "\t\tthis.${it.name} = ${it.name};"
//        out.println "\t}"
//    }
  out.println ""
  out.println "}"
}

def calcFields(table) {
  DasUtil.getColumns(table).reduce([]) { fields, col ->
    def spec = Case.LOWER.apply(col.getDataType().getSpecification())

    def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
    def comm =[
            colName : col.getName(),
            name :  javaName(col.getName(), false),
            type : typeStr,
            commoent: col.getComment(),
            annos: ("UUID".equals(col.getName())?"\t@Id\n\t@Basic(optional = false)\n\t@GeneratedValue(generator = \"jpa-uuid\")\n":"")+"\t@Column(name = \""+col.getName()+"\" )"]
    if("id".equals(Case.LOWER.apply(col.getName())))
      comm.annos +=["@Id"]
    fields += [comm]
  }
}

// 處理類名(這里是因為我的表都是以t_命名的戳表,所以需要處理去掉生成類名時的開頭的T肯污,
// 如果你不需要那么請查找用到了 javaClassName這個方法的地方修改為 javaName 即可)
def javaClassName(str, capitalize) {
  def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
          .collect { Case.LOWER.apply(it).capitalize() }
          .join("")
          .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
  // 去除開頭的T  http://developer.51cto.com/art/200906/129168.htm
//  s = s[1..s.size() - 1]
//  capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

def javaName(str, capitalize) {
//    def s = str.split(/(?<=[^\p{IsLetter}])/).collect { Case.LOWER.apply(it).capitalize() }
//            .join("").replaceAll(/[^\p{javaJavaIdentifierPart}]/, "_")
//    capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
  def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
          .collect { Case.LOWER.apply(it).capitalize() }
          .join("")
          .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
  capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

def isNotEmpty(content) {
  return content != null && content.toString().trim().length() > 0
}

static String changeStyle(String str, boolean toCamel){
  if(!str || str.size() <= 1)
    return str

  if(toCamel){
    String r = str.toLowerCase().split('_').collect{cc -> Case.LOWER.apply(cc).capitalize()}.join('')
    return r[0].toLowerCase() + r[1..-1]
  }else{
    str = str[0].toLowerCase() + str[1..-1]
    return str.collect{cc -> ((char)cc).isUpperCase() ? '_' + cc.toLowerCase() : cc}.join('')
  }
}

static String genSerialID()
{
  return "\tprivate static final long serialVersionUID =  "+Math.abs(new Random().nextLong())+"L;"
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末押蚤,一起剝皮案震驚了整個濱河市太颤,隨后出現(xiàn)的幾起案子止潘,更是在濱河造成了極大的恐慌奔脐,老刑警劉巖躯舔,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彭雾,死亡現(xiàn)場離奇詭異滞谢,居然都是意外死亡串稀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門狮杨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來母截,“玉大人,你說我怎么就攤上這事橄教∏蹇埽” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵护蝶,是天一觀的道長华烟。 經(jīng)常有香客問我,道長持灰,這世上最難降的妖魔是什么盔夜? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮堤魁,結(jié)果婚禮上喂链,老公的妹妹穿的比我還像新娘。我一直安慰自己妥泉,他們只是感情好椭微,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盲链,像睡著了一般赏表。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匈仗,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天瓢剿,我揣著相機與錄音,去河邊找鬼悠轩。 笑死间狂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的火架。 我是一名探鬼主播鉴象,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼忙菠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纺弊?” 一聲冷哼從身側(cè)響起牛欢,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淆游,沒想到半個月后傍睹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡犹菱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年拾稳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腊脱。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡访得,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陕凹,到底是詐尸還是另有隱情悍抑,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布杜耙,位于F島的核電站传趾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泥技。R本人自食惡果不足惜浆兰,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望珊豹。 院中可真熱鬧簸呈,春花似錦、人聲如沸店茶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贩幻。三九已至轿腺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丛楚,已是汗流浹背族壳。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趣些,地道東北人仿荆。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拢操。 傳聞我的和親對象是個殘疾皇子锦亦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345