idea反向生成數(shù)據(jù)庫實體類和mapper

idea反向生成數(shù)據(jù)庫實體類和mapper

生成實體類

采用idea中的generate POJOs.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 className = javaName(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("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.Entity;"
  out.println "import javax.persistence.Table;"
  out.println "import java.io.Serializable;"
  out.println "import lombok.Getter;"
  out.println "import lombok.Setter;"
  out.println "import lombok.ToString;"
  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  Hunter\n" +
          " * @Date "+ new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " \n" +
          " */"
  out.println ""
  out.println "@Setter"
  out.println "@Getter"
  out.println "@ToString"
  out.println "@Entity"
  out.println "@Table ( name =\""+table.getName() +"\" )"
  out.println "public class $className  implements Serializable {"
  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: "\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;"
}

生成mapper

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <!--<classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />-->

    <context id="DB2Tables" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/dubbo_one"
                        userId="root"
                        password="123456">
        </jdbcConnection>

        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <javaModelGenerator targetPackage="com.sunny.dubbo.one.model.pojo" targetProject="F:\OneDrive\immoc_courses\dubbo_course\immoc\dubboOne\model\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!-- 生成映射文件的包名和位置-->
        <sqlMapGenerator targetPackage="mapping"  targetProject="F:\OneDrive\immoc_courses\dubbo_course\immoc\dubboOne\model\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER" targetPackage="com.sunny.dubbo.one.model.mapper"  targetProject="F:\OneDrive\immoc_courses\dubbo_course\immoc\dubboOne\model\src\main\java">
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <table schema="dubbo_one" tableName="item_info"></table>

    </context>
</generatorConfiguration>

上面是generatorConfig.xml

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘉赎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子亩冬,更是在濱河造成了極大的恐慌艘希,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硅急,死亡現(xiàn)場離奇詭異覆享,居然都是意外死亡,警方通過查閱死者的電腦和手機营袜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門撒顿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荚板,你說我怎么就攤上這事凤壁》砸伲” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵拧抖,是天一觀的道長煤搜。 經(jīng)常有香客問我,道長唧席,這世上最難降的妖魔是什么擦盾? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮袱吆,結(jié)果婚禮上厌衙,老公的妹妹穿的比我還像新娘距淫。我一直安慰自己绞绒,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布榕暇。 她就那樣靜靜地躺著蓬衡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪彤枢。 梳的紋絲不亂的頭發(fā)上狰晚,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音缴啡,去河邊找鬼壁晒。 笑死,一個胖子當著我的面吹牛业栅,可吹牛的內(nèi)容都是我干的秒咐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼碘裕,長吁一口氣:“原來是場噩夢啊……” “哼携取!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起帮孔,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雷滋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后文兢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晤斩,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年姆坚,在試婚紗的時候發(fā)現(xiàn)自己被綠了澳泵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡旷偿,死狀恐怖烹俗,靈堂內(nèi)的尸體忽然破棺而出爆侣,到底是詐尸還是另有隱情,我是刑警寧澤幢妄,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布兔仰,位于F島的核電站,受9級特大地震影響蕉鸳,放射性物質(zhì)發(fā)生泄漏乎赴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一潮尝、第九天 我趴在偏房一處隱蔽的房頂上張望榕吼。 院中可真熱鬧,春花似錦勉失、人聲如沸羹蚣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顽素。三九已至,卻和暖如春徒蟆,著一層夾襖步出監(jiān)牢的瞬間胁出,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工段审, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留全蝶,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓寺枉,卻偏偏與公主長得像抑淫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子型凳,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

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