idea生成数据库实体类

导读:本篇文章讲解 idea生成数据库实体类,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

import com.intellij.database.model.DasTable
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/)        : "LocalDateTime",
        (~/(?i)date/)                      : "LocalDateTime",
        (~/(?i)time/)                      : "LocalDateTime",
        (~/(?i)/)                          : "String"
]

FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
    SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) }
}

def getPackageName(dir) {
    return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
}

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) }
}

def generate(out, className, fields) {
    out.println "package $packageName"
    out.println ""
    Set types = new HashSet()
    Set names = new HashSet();
    fields.each() {
        types.add(it.type)
    }
    fields.each() {
        names.add(it.name);
    }
    if (names.contains("createTiem") || names.contains("updateTime")) {
        out.println "import com.baomidou.mybatisplus.annotation.FieldFill;"
        out.println "import com.baomidou.mybatisplus.annotation.TableField;"
    }
    if (types.contains("LocalDateTime")) {
        out.println "import com.fasterxml.jackson.annotation.JsonFormat;"
        out.println "import java.time.LocalDateTime;"
    }
    out.println "import lombok.Data;"
    out.println "import java.time.LocalDateTime;"
    out.println ""
    out.println "/**"
    out.println " * @author lixx"
    out.println " * @version 1.0"
    out.println " * @date " + new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date())
    out.println " */"
    out.println "@Data"
    out.println "public class $className {"
    out.println ""
    fields.each() {
        if (it.annos != "") out.println "  ${it.annos}"
        out.println ""

        if (isNotEmpty(it.commoent)) {
            out.println "\t/**"
            out.println "\t * ${it.commoent.toString()}"
            out.println "\t */"
        }
        if (it.type.equals("LocalDateTime") || it.type.equals("Date")) {
            // 时间类型格式化
            out.println "\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm\")"
            // 这里是mybatis plus 的自动填充, 没有使用的可以删掉这里
            if (it.name.contains("createTime")) {
                out.println "\t@TableField(fill = FieldFill.INSERT)"
            } else if (it.name.contains("updateTime")) {
                out.println "\t@TableField(fill = FieldFill.UPDATE)"
            }
        }
        out.println "\tprivate ${it.type} ${it.name};"
    }
    out.println ""
    // 不打印get set 方法
    /*fields.each() {
        out.println ""
        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 isNotEmpty(content) {
    return content != null && content.toString().trim().length() > 0
}

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,
                           // 获取 注释
                           commoent: col.getComment(),
                           annos   : ""]]
    }
}

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]
}

效果图如下:

idea生成数据库实体类

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/72559.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!