2018-12-26_IDEA groovy生成實(shí)體解決亂碼問題

一及汉、IDEA groovy 生成實(shí)體部分參考此鏈接:

http://www.reibang.com/p/d2eb84209406

二沮趣、我調(diào)整后的腳本(我已注釋getter、setter生成部分坷随、使用lombok注解):

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.text.SimpleDateFormat
import java.sql.Date


/*
 * 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)
    new File(dir, className + ".java").withPrintWriter("UTF-8") { 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 "import javax.persistence.Column;"
    out.println "import javax.persistence.Table;"
    out.println "import javax.persistence.Id;"
    out.println "import java.io.Serializable;"

    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" +
            " * generated by Generate POJOs.groovy \n" +
            //" * <p>Date: " + new java.util.Date().toString() + ".</p>\n" +
            " * <p>Date: " + (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new java.util.Date()) + ".</p>\n" +
            " *\n" +
            " * @author custom\n" +
            " */"
    out.println ""
    out.println "@Table ( name =\""+table.getName() +"\" )"
    out.println "public class $className implements Serializable {"
    out.println genSerialID()
    fields.each() {
        out.println ""
        // 輸出注釋
        if (isNotEmpty(it.commoent)) {
            out.println "\t/**"
            out.println "\t * ${it.commoent}"
            out.println "\t */"
        }

        if (it.annos != "") out.println "   ${it.annos}"

        // 輸出成員變量
        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 :  changeStyle (javaName(col.getName(), false) ,true),
                type : typeStr,
                commoent: col.getComment(),
                annos: "\t@Column(name = \""+col.getName()+"\" )"]
        if("id".equals(Case.LOWER.apply(col.getName())))
            comm.annos += "\n\t@Id"
        fields += [comm]
    }
}

// 處理類名(這里是因?yàn)槲业谋矶际且詔_命名的房铭,所以需要處理去掉生成類名時(shí)的開頭的T驻龟,
// 如果你不需要那么請(qǐng)查找用到了 javaClassName這個(gè)方法的地方修改為 javaName 即可)
def javaClassName(str, capitalize) {
    def s = str.split(/[^\p{Alnum}]/).collect { def s = Case.LOWER.apply(it).capitalize() }.join("")
    // 去除開頭的T  http://developer.51cto.com/art/200906/129168.htm
    s = s[1..s.size() - 1]
    capitalize ? 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 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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缸匪,隨后出現(xiàn)的幾起案子翁狐,更是在濱河造成了極大的恐慌,老刑警劉巖豪嗽,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谴蔑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡龟梦,警方通過查閱死者的電腦和手機(jī)隐锭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來计贰,“玉大人钦睡,你說我怎么就攤上這事≡甑梗” “怎么了荞怒?”我有些...
    開封第一講書人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)秧秉。 經(jīng)常有香客問我褐桌,道長(zhǎng),這世上最難降的妖魔是什么象迎? 我笑而不...
    開封第一講書人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任荧嵌,我火速辦了婚禮,結(jié)果婚禮上砾淌,老公的妹妹穿的比我還像新娘啦撮。我一直安慰自己,他們只是感情好汪厨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開白布赃春。 她就那樣靜靜地躺著,像睡著了一般劫乱。 火紅的嫁衣襯著肌膚如雪织中。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,919評(píng)論 1 290
  • 那天衷戈,我揣著相機(jī)與錄音抠璃,去河邊找鬼。 笑死脱惰,一個(gè)胖子當(dāng)著我的面吹牛搏嗡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼采盒,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼旧乞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磅氨,我...
    開封第一講書人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤尺栖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后烦租,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體延赌,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年叉橱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挫以。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窃祝,死狀恐怖掐松,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粪小,我是刑警寧澤大磺,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站探膊,受9級(jí)特大地震影響杠愧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逞壁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一流济、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猾担,春花似錦、人聲如沸刺下。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽橘茉。三九已至工腋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畅卓,已是汗流浹背擅腰。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翁潘,地道東北人趁冈。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親渗勘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沐绒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 前言 由于項(xiàng)目需要用到 Groovy 語言,這兩天對(duì)其進(jìn)行了粗略的學(xué)習(xí)旺坠,本文是對(duì)學(xué)習(xí)做的一個(gè)簡(jiǎn)單總結(jié)乔遮,主要內(nèi)容參考...
    簡(jiǎn)單的土豆閱讀 188,478評(píng)論 12 201
  • 閑話 “程序猿”、“碼農(nóng)”取刃、“軟件攻城獅”蹋肮,程序員這個(gè)職業(yè)現(xiàn)在已經(jīng)被這些網(wǎng)絡(luò)流行語給玩壞了。由于程序員門檻越來越低...
    程序員吉森閱讀 1,815評(píng)論 0 8
  • 前言: 逛開源社區(qū)的時(shí)候無意發(fā)現(xiàn)的璧疗,用了一段時(shí)間坯辩,覺得還可以,特此推薦一下病毡。 lombok 提供了簡(jiǎn)單的注解的形式...
    OzanShareing閱讀 4,206評(píng)論 0 7
  • 愿為連接: http://yangbingdong.com/2017/note-of-learning-idea-...
    83cb194531a7閱讀 19,045評(píng)論 0 11
  • 2018.3.16周五 今天安心地在辦公室做憑證濒翻。 我的感冒還沒好利落。 詢問上次在大冰簽售會(huì)中有緣相識(shí)的那位女生...
    幻嶺之漫閱讀 142評(píng)論 0 1