idea自动生成带注解的实体

idea自动生成带注解的实体类

说明

idea本身自带有生成实体类操作方法,但生成后发现没有注解,很不方便,可使用以下方法生成带注解的实体类

idea配置数据库

打开idea最右边边上有database,点击进去

选择添加一个新的数据库类型,我们已mysql为例,选择mysql在这里插入图片描述

在弹出的窗口中填写mysql链接关键信息,地址(默认localhost),端口(默认3306),用户名,密码,完成之后点击Test connection,出现Successful则链接成功,点击右下角落确认即可在这里插入图片描述
在这里插入图片描述

idea添加groovy文件

此时我们可以直接生成实体类,选择 Generate POJOs.groovy即可
在这里插入图片描述

在这里插入图片描述
此时生成的实体为没有注解,我们可以选择Go to Scripts Directory
在这里插入图片描述
此时系统会自动定位到Generate POJOs.groovy的目录下,我们在次目录下新建一个GenerateMYPOJOs.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

typeMapping = [
        (~/(?i)number\(\d\)/)              : "int",
        (~/(?i)number/)              : "double",
        (~/(?i)int/)                      : "int",
        (~/(?i)long/)                      : "long",
        (~/(?i)float|double|decimal|real/): "double",
        (~/(?i)timestamp|datetime|date|time/)              : "LocalDateTime",
        (~/(?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)
    def file = new File(dir,className+".java")
    def packageName = dir.toString().replaceAll("\\\\", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
    def writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8"))

    writer.withPrintWriter { out -> generate(out, table, fields, packageName) }
}

def generate(out, table, fields, packageName) {
    def tableName = table.getName()
    def className = javaName(tableName, true)
    def tableComment = table.getComment()
    def hasPK = DasUtil.getPrimaryKey(table)!=null
    def hasDatetime = false
    fields.each() {hasDatetime=hasDatetime||it.type=="LocalDateTime"}

    out.println "package $packageName"
    out.println ""
    out.println "import javax.persistence.*;"
    if (hasPK) out.println "import java.time.LocalDateTime;"
    out.println "import org.hibernate.annotations.GenericGenerator;"
    out.println ""
    if (tableComment != "" && tableComment != null){
        out.println "/**"
        out.println " * ${tableComment}"
        out.println " */"
    }
    if (hasPK) out.println "@Entity"
    out.println "@Table(name = \"${tableName}\")"
    out.println "public class $className {"
    out.println ""
    fields.each() {
        out.println "    //${it.commoent} ${it.spec}"
        out.println "    private ${it.type} ${it.name};"
        out.println ""
    }
    fields.each() {
        out.println ""
        if (it.isId) out.println "    @Id"
        if (it.isId) out.println "    @GeneratedValue()"
        if (it.annos != "") out.println "    ${it.annos}"
        out.println "    public ${it.type} get${it.name.capitalize()}() {"
        out.println "        return ${it.name};"
        out.println "    }"
        out.println ""
        out.println "    public void set${it.name.capitalize()}(${it.type} ${it.name}) {"
        out.println "        this.${it.name} = ${it.name};"
        out.println "    }"
        out.println ""
    }
    out.println "}"
}

def calcFields(table) {
    def primaryKey = DasUtil.getPrimaryKey(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 colName = col.getName()
        fields += [[
                           name    : javaName(col.getName(), false),
                           type    : typeStr,
                           commoent: col.getComment(),
                           spec:spec,
                           isId    : primaryKey != null && DasUtil.containsName(colName, primaryKey.getColumnsRef()),
                           annos   : "@Column(name = \"${colName}\")",
                   ]]
    }
}

def javaName(str, capitalize) {
    def s = str.split(/(?<=[^\p{IsLetter}])/).collect { Case.LOWER.apply(it).capitalize() }
            .join("").replaceAll(/[^\p{javaJavaIdentifierPart}]/, "")
            .replaceAll("_", "")
    capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

生成带注解的实体

此时我们重新生成,选择我们刚刚添加的GenerateMYPOJOs.groovy,此时我们的类就有注解了
在这里插入图片描述

在这里插入图片描述

总结

整体来说这套生成方法也不算很方便,使用MyBatis Generator或hibernate都可以自动生成实体类,也都比较方便,之前也有看过有大神直接写一套程序输入数据源信息,选择表可以自动生成需要的xml,bean,service,dao这些结构代码,当然适合自己才是最重要的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值