
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
/*
* 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/) : "BigDecimal",
(~/(?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 = 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 { 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 lombok.AccessLevel;"
out.println "import lombok.Getter;"
out.println "import lombok.NoArgsConstructor;"
out.println "import lombok.ToString;"
out.println "import org.springframework.data.annotation.CreatedBy;"
out.println "import org.springframework.data.annotation.LastModifiedBy;"
out.println "import org.springframework.data.jpa.domain.support.AuditingEntityListener;"
out.println ""
out.println "import javax.persistence.*;"
out.println "import java.io.Serializable;"
out.println "import java.time.LocalDateTime;"
Set types = new HashSet()
fields.each() {
types.add(it.type)
}
if (types.contains("Date")) {
out.println "import java.util.Date;"
}
if (types.contains("BigDecimal")) {
out.println "import java.math.BigDecimal;"
}
if (types.contains("InputStream")) {
out.println "import java.io.InputStream;"
}
// out.println ""
// out.println "/**\n" +
// " * @Description \n" +
// " * @Date " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " \n" +
// " */"
out.println ""
out.println "@Getter"
out.println "@ToString"
out.println "@Entity"
out.println "@EntityListeners(AuditingEntityListener.class)"
out.println "@NoArgsConstructor(access = AccessLevel.PROTECTED)"
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.toString()}"
out.println "\t */"
}
if ((it.annos + "").indexOf("[@Id]") >= 0) out.println "\t@Id"
if (it.annos != "") {
if (it.type == "Date") {
if (it.name == "regDt") {
out.println "\t@Column(updatable = false, insertable = false)"
} else if (it.name == "updDt") {
out.println "\t@Column(insertable = false)"
} else {
out.println " ${it.annos.replace("[@Id]", "")}"
}
} else {
if (it.name == "regId") {
out.println "\t@CreatedBy"
out.println "\t@Column(updatable = false)"
} else if (it.name == "updId") {
out.println "\t@LastModifiedBy"
out.println "\t@Column(insertable = false)"
} else {
out.println " ${it.annos.replace("[@Id]", "")}"
}
}
}
if (it.type == "Date") {
out.println "\tprivate LocalDateTime ${it.name};"
} else {
out.println "\tprivate ${it.type} ${it.name};"
}
}
out.println ""
out.print "\tpublic $className ("
fields.each() {
if (it.name != "regId" && it.name != "updId" && it.name != "regDt" && it.name != "updDt") {
if (it != fields.first()) {
out.println ","
out.print "\t\t\t"
}
if (it.type == "Date") {
out.print "LocalDateTime ${it.name}"
} else {
out.print "${it.type} ${it.name}"
}
}
}
out.println ") {"
fields.each() {
if (it.name != "regId" && it.name != "updId") {
if (it.name == "regDt" || it.name == "updDt") {
out.println "\t\tthis.${it.name} = LocalDateTime.now();"
} else {
out.println "\t\tthis.${it.name} = ${it.name};"
}
}
}
out.println "\t}"
// out.println ""
// out.println "\t@Override"
// out.println "\tpublic String toString() {"
// out.println "\t\treturn \"{\" +"
// fields.each() {
// out.println "\t\t\t\t\t\"${it.name}='\" + ${it.name} + '\\'' +"
// }
// out.println "\t\t\t\t'}';"
// 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]
}
}
def javaClassName(str, capitalize) {
def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
.collect { Case.LOWER.apply(it).capitalize() }
.join("")
.replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
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;"
}
단축키 Shift + Shift 로 들어가서 Action 탭에서 Database를 입력 후 클릭하여 활성화

상단에 New - Data Source - MySQL 클릭

접속 정보를 입력하고 Test Connection 으로 정상적으로 접속되는지 확인 (jdbc driver 다운받으라고 뜨면 클릭해서 다운받기)

해당 Database 접속 후 Table이 조회되는지 확인

만들고 싶은 테이블에 우클릭 Tools - Scripted Extenstions - 방금전 새로 생성한 파일이름 클릭(MySQL JPA Entity.groovy)

Finder가 뜨면 코드 경로를 선택 (프로젝트 하위 entity 객체가 들어있는 폴더 선택)

선택한 경로에 java 파일이 바로 생성됨

해당 파일을 열어서 Custom이 필요한 코드를 작성

각 프로젝트의 맞게 “MySQL JPA Entity.groovy” 코드를 수정하여 사용 가능