groovy腳本定義結(jié)構(gòu)表一鍵生成POJO類
使用方式
分享一個(gè)小腳本,在定義完表結(jié)構(gòu)后,可以一鍵生成對(duì)應(yīng)的實(shí)體類。
- 把腳本放在idea的這個(gè)位置:
- 后面使用的話,在idea右側(cè)的
Database
欄中,選中對(duì)應(yīng)的表,右鍵選擇對(duì)應(yīng)腳本名稱即可。
腳本內(nèi)容
整體的思路比較簡(jiǎn)單
- 獲取SQL表信息,提取列名/類型/comment等需要的信息。
- 按java 中類格式,拼接后輸出成文件。(需要import依賴的,需要加注解的都加上)
其中有部分注釋,如果不清楚可以留言評(píng)論,我會(huì)繼續(xù)補(bǔ)充解釋。有問題的話,可以共同進(jìn)步。
內(nèi)容如下:
import com.intellij.database.model.DasTable import com.intellij.database.util.Case import com.intellij.database.util.DasUtil import java.text.SimpleDateFormat /* * Available context bindings: * SELECTION Iterable<DasObject> * PROJECT project * FILES files helper */ packageName = "" author = "hhyy" // 類型映射,mysql中的類型,對(duì)應(yīng)java中的類型 typeMapping = [ (~/bigint/) : "Long", (~/(?i)int/) : "Integer", (~/(?i)float|double|decimal|real/): "Double", (~/(?i)decimal/) : "BigDecimal", (~/(?i)datetime|timestamp|time/) : "LocalDateTime", (~/(?i)bool|boolean/) : "Boolean", (~/(?i)date/) : "LocalDate", (~/(?i)char|text/) : "String", (~/(?i)/) : "String" ] FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir -> SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) } } def generate(table, dir) { def className = javaName(table.getName(), true) def fields = calcFields(table) packageName = getPackageName(dir) new File(dir, className + "Entity.java").withPrintWriter { out -> generate(out, table, className, fields) } } def generate(out, table, className, fields) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") def nowTime = format.format(new Date()) def tableName = table.getName() out.println "package $packageName" out.println "" out.println "import lombok.Data;" out.println "" out.println "import javax.persistence.*;" out.println "import java.io.Serializable;" out.println "import java.time.LocalDateTime;" out.println "import java.math.BigDecimal;" out.println "" out.println "" out.println "/** " out.println " * @author $author" out.println " * @date $nowTime" out.println "**/" out.println "@Data" out.println "@Entity" out.println "@Table(name = "$tableName")" out.println "public class ${className}Entity implements Serializable {" out.println "" fields.each() { if (it.annos != "") out.println " ${it.annos}" // 輸出注釋 if (isNotEmpty(it.comment)) { out.println "\t/** " out.println "\t * $it.comment" out.println "\t**/" } if (it.name == "id") { // 判斷自增 if ((tableName + "_id").equalsIgnoreCase(fields[0].colum) || "id".equalsIgnoreCase(fields[0].colum)) { out.println "\t@Id" out.println "\t@GeneratedValue(strategy = GenerationType.IDENTITY)" } } out.println " @Column(name = "${it.colum}", columnDefinition = "${it.sqlType}")" String colName = it.name // is_開頭的列 if (colName.startsWith("is")) { it.name = colName.substring(2).toLowerCase() } out.println "\tprivate ${it.type} ${it.name};" 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 // sql 字段類型處理 String sqlTypeStr = spec; if (sqlTypeStr != null && !sqlTypeStr.isEmpty() && sqlTypeStr.contains("(")) { sqlTypeStr = sqlTypeStr.substring(0, sqlTypeStr.indexOf("(")); } fields += [[ name : javaName(col.getName(), false), colum : col.getName(), type : typeStr, sqlType: sqlTypeStr, comment: col.getComment(), annos : ""]] } } // sql列名轉(zhuǎn)java列明, 主要是一個(gè)駝峰的轉(zhuǎn)換 def javaName(str, capitalize) { def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str) .collect { Case.LOWER.apply(it).capitalize() } .join("") .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_") .replaceAll(/_/, "") capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1] } /** * 獲取包名稱 * @param dir 實(shí)體類所在目錄 * @return */ static def getPackageName(dir) { String absolutePath = dir.toString() def replace = absolutePath.substring(absolutePath.indexOf("java\") + 5).replace("\", "."); return replace + ";" } static def isNotEmpty(content) { return content != null && content.toString().trim().length() > 0 }
End
在理解了groovy的語(yǔ)法之后(和Java相似),可以根據(jù)需要的方式,修改腳本。比如一些公司實(shí)體類可能有固定的規(guī)范,需要添加一些東西。比如不用lombok
, 自定義get set
方法都可以,只要有了列信息,都可以做。
將重復(fù)的工作,以腳本的形式固化下來,將大大節(jié)省時(shí)間精力。
小到一個(gè)定時(shí)shell腳本,再到我們編寫的程序、軟件都是在做這個(gè)工作,簡(jiǎn)化,再簡(jiǎn)化。
“懶惰”確實(shí)是人類進(jìn)步的一大動(dòng)力。
以上就是groovy腳本定義結(jié)構(gòu)表一鍵生成POJO類的詳細(xì)內(nèi)容,更多關(guān)于groovy腳本生成POJO類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringCloud Finchley+Spring Boot 2.0 集成Consul的方法示例(1.2版本)
這篇文章主要介紹了SpringCloud Finchley+Spring Boot 2.0 集成Consul的方法示例(1.2版本),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08SpringBoot?Security權(quán)限控制自定義failureHandler實(shí)例
這篇文章主要為大家介紹了SpringBoot?Security權(quán)限控制自定義failureHandler實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11java使用poi在excel單元格添加超鏈接設(shè)置字體顏色的方法
這篇文章主要介紹了java使用poi在excel單元格添加超鏈接,設(shè)置字體顏色,poi功能還是很強(qiáng)大的,基本能想到的功能都能通過poi實(shí)現(xiàn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09關(guān)于批量插入或更新數(shù)據(jù)(MyBatis-plus框架)
這篇文章主要介紹了關(guān)于批量插入或更新數(shù)據(jù)(MyBatis-plus框架),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09SpringCloud之動(dòng)態(tài)刷新、重試、服務(wù)化的實(shí)現(xiàn)
這篇文章主要介紹了SpringCloud 之動(dòng)態(tài)刷新、重試、服務(wù)化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10springboot集成Swagger的方法(讓你擁有屬于自己的api管理器)
在大型的項(xiàng)目中,如果你有非常多的接口需要統(tǒng)一管理,或者需要進(jìn)行接口測(cè)試,那么我們通常會(huì)在繁雜地api中找到需要進(jìn)行測(cè)試或者管理的接口,接下來通過本文給大家介紹springboot集成Swagger的方法讓你擁有屬于自己的api管理器,感興趣的朋友一起看看吧2021-11-11