본문 바로가기
카테고리 없음

DataGrip

by Younji! 2019. 4. 7.

DataGrip JPA 엔티티 자동생성 에 대해서 알아보자.

매 번 생성하는 엔티티를 DataGrip에 등록 후 자동화해서 생성해보자. 매우 편리하다.

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

 

/*

 * Available context bindings:

 *   SELECTION   Iterable<DasObject>

 *   PROJECT     project

 *   FILES       files helper

 */

 

packageName = "com.benx.membership.model.entity;"

typeMapping = [

        (~/(?i)int/)                      : "long",

        (~/(?i)float|double|decimal|real/): "double",

        (~/(?i)datetime|timestamp/)       : "java.sql.Timestamp",

        (~/(?i)date/)                     : "java.sql.Date",

        (~/(?i)time/)                     : "java.sql.Time",

        (~/(?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 = javaName(table.getName(), true)

    def fields = calcFields(table)

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

}

 

def generate(out, className, fields, tableName) {

 

    out.println "package $packageName"

    out.println ""

    out.println ""

    out.println "import javax.persistence.*;"

    out.println "import lombok.Data;"

    out.println ""

    out.println "@Data"

    out.println "@Entity"

    out.println "@Table(name=\"${tableName}\")"

    out.println "public class ${underscoreToCamelCase(className)} {"

 

    fields.each() {

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

        out.println ""

        if (it.primary) {

            out.println "  @Id"

            out.println "  @GeneratedValue(strategy = GenerationType.AUTO)"

        }

 

        out.println "   private ${it.type} ${underscoreToCamelCase(it.name)};"

    }

    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

        fields += [[

                           name : javaName(col.getName(), false),

                           type : typeStr,

                           annos: "",

                           colName: col.getName(),

                           primary: DasUtil.isPrimary(col)

                   ]]

    }

}

 

def javaName(str, capitalize) {

    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]

}

 

String underscoreToCamelCase(String underscore){

    if(!underscore || underscore.isAllWhitespace()){

        return ''

    }

    return underscore.replaceAll(/_\w/){ it[1].toUpperCase() }

}

 

댓글