Idea Reverse Generation Code (am Beispiel der MySQL-Datenbank)

Öffnen Sie die Einstellungen der Ideendatenbank

Ansicht–> Tool Windows–> Datenbank, öffnen Sie die Datenbankkonfigurationsseite.
Fügen Sie hier eine Bildbeschreibung ein
Auf der rechten Seite sollte sich ein rotes Feld befinden, oder Sie können es über die Datenbank auf der rechten Seite des roten Felds öffnen
Fügen Sie hier eine Bildbeschreibung ein

Konfigurationsdatenbank

+ Signieren -> Datenquelle -> MySQL, rufen Sie die Konfigurationsseite auf
Fügen Sie hier eine Bildbeschreibung ein

Geben Sie die Konfigurationsinformationen ein und überprüfen Sie diese
Fügen Sie hier eine Bildbeschreibung ein

Ein grüner Haken erscheint und die Überprüfung ist erfolgreich
Fügen Sie hier eine Bildbeschreibung ein

Wenn unten auf der Seite Folgendes angezeigt wird, klicken Sie auf Herunterladen, um den Treiber herunterzuladen
Fügen Sie hier eine Bildbeschreibung ein

Nach dem Konfigurieren und Klicken auf OK werden die Datenbankinformationen auf der rechten Seite angezeigt
Fügen Sie hier eine Bildbeschreibung ein

Erstellen Sie eine groovige Datei

Fügen Sie hier eine Bildbeschreibung ein

Schreibe eine groovige Datei

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

packageName = ""

// 表字段类型与Java的对应关系
typeMapping = [
        (~/(?i)tinyint|smallint|mediumint|int/)  : "Integer",
        (~/(?i)bool|bit/)                        : "Boolean",
        (~/(?i)float|double|decimal|real/)       : "BigDecimal",
        (~/(?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 = javaClassName(table.getName(), true)
    def fields = calcFields(table)
    packageName = getPackageName(dir)
    packageName = packageName.toString().replaceAll(";", "")

    def entityDir = dir.toString() + "\\entity"
    createDir(entityDir)
    PrintWriter entityPrintWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(entityDir, className + ".java")), "UTF-8"))
    entityPrintWriter.withPrintWriter {
    
     out -> entity(out, className, fields, table) }

    def mapperDir = dir.toString() + "\\dao"
    createDir(mapperDir)
    PrintWriter mapperPrintWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(mapperDir, className + "Mapper.java")), "UTF-8"))
    mapperPrintWriter.withPrintWriter {
    
     out -> mapper(out, className) }

    def serviceDir = dir.toString() + "\\service"
    createDir(serviceDir)
    PrintWriter servicePrintWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(serviceDir, className + "Service.java")), "UTF-8"))
    servicePrintWriter.withPrintWriter {
    
     out -> service(out, className) }

    def implDir = dir.toString() + "\\service\\impl"
    createDir(implDir)
    PrintWriter implPrintWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(implDir, className + "ServiceImpl.java")), "UTF-8"))
    implPrintWriter.withPrintWriter {
    
     out -> impl(out, className) }
}

/**
 * 创建目录
 * @param path 路径
 * @return
 */
static def createDir(path) {
    
    
    File dir = new File(path);
    if (!dir.exists()) {
    
    
        dir.mkdirs();
    }
}

/**
 * 获取package
 * @param dir 选择的目录
 * @return package
 */
static def getPackageName(dir) {
    
    
    return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
}

/**
 * 实体类生成
 * @param out 实体类输出流
 * @param className 类名
 * @param fields 表字段信息
 * @param table 表
 * @return 实体类输出流
 */
def entity(out, className, fields, table) {
    
    
    out.println "package $packageName" + ".entity;"
    out.println ""
    out.println "import io.swagger.annotations.ApiModel;"
    out.println "import io.swagger.annotations.ApiModelProperty;"
    out.println "import lombok.Data;"
    out.println ""
    out.println "import javax.persistence.Column;"
    out.println "import javax.persistence.Entity;"
    out.println "import javax.persistence.Table;"
    out.println "import javax.persistence.GeneratedValue;"
    out.println "import javax.persistence.Id;"
    out.println "import java.io.Serializable;"
    Set types = new HashSet()

    fields.each() {
    
    
        types.add(it.type)
    }

    if (types.contains("Date")) {
    
    
        out.println "import java.util.Date;"
    }

    if (types.contains("InputStream")) {
    
    
        out.println "import java.io.InputStream;"
    }

    if (types.contains("BigDecimal")) {
    
    
        out.println "import java.math.BigDecimal;"
    }
    out.println ""
    out.println "/**\n" +
            " * @Description  \n" +
            " * @Author: hyy\n" +
            " * @Date " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()) + " \n" +
            " */"
    out.println ""
    out.println "@Data"
    out.println "@Entity"
    out.println "@Table ( name =\"" + table.getName() + "\" )"
    out.println "@ApiModel(description = \"" + table.getName() + "\")"
    out.println "public class $className implements Serializable {"
    fields.each() {
    
    
        out.println ""
        // 输出注释
        if (isNotEmpty(it.commoent)) {
    
    
            out.println "\t/**"
            out.println "\t * ${it.commoent.toString()}"
            out.println "\t */"
            out.println "\t@ApiModelProperty(value = \"${it.commoent.toString()}\")"
        }
        if (it.name == "id") {
    
    
            out.println "\t@Id"
            out.println "\t@GeneratedValue(generator=\"JDBC\")"
        } else {
    
    
            if (it.annos != "") out.println "   ${it.annos.replace("[@Id]", "")}"
        }

        // 输出成员变量
        out.println "\tprivate ${it.type} ${it.name};"
    }

    out.println ""
    out.println "}"
}

/**
 * dao生成
 * @param out 输出流
 * @param className 类名
 * @return
 */
def mapper(out, className) {
    
    
    out.println "package $packageName" + ".dao;"
    out.println ""
    out.println "import $packageName" + ".entity.$className;"
    out.println ""
    out.println "/**\n" +
            " * @Description  \n" +
            " * @Author: hyy\n" +
            " * @Date " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()) + " \n" +
            " */"
    out.println "public interface $className" + "Mapper {"
    out.println "}"
}

/**
 * service生成
 * @param out 输出流
 * @param className 类名
 * @return
 */
def service(out, className) {
    
    
    out.println "package $packageName" + ".service;"
    out.println ""
    out.println "/**\n" +
            " * @Description  \n" +
            " * @Author: hyy\n" +
            " * @Date " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()) + " \n" +
            " */"
    out.println "public interface $className" + "Service {"
    out.println "}"
}

/**
 * serviceImpl生成
 * @param out 输出流
 * @param className 类名
 * @return
 */
def impl(out, className) {
    
    
    out.println "package $packageName" + ".service.impl;"
    out.println ""
    out.println "import $packageName" + ".dao." + "$className" + "Mapper;"
    out.println "import $packageName" + ".service." + "$className" + "Service;"
    out.println "import org.springframework.stereotype.Service;"
    out.println ""
    out.println "import javax.annotation.Resource;"
    out.println ""
    out.println "/**\n" +
            " * @Description  \n" +
            " * @Author: hyy\n" +
            " * @Date " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()) + " \n" +
            " */"
    out.println "@Service"
    out.println "public class $className" + "ServiceImpl implements $className" + "Service {"
    out.println ""
    out.println "\t@Resource"
    out.println "\tprivate $className" + "Mapper " + Case.LOWER.apply(className[0]) + className[1..-1] + "Mapper;"
    out.println ""
    out.println "}"
}

/**
 * 获取表字段信息
 * @param table 表名
 * @return 表字段信息
 */
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}[_]]/, "_")

    // 去除开头的tb
    s = s[2..-1]
    capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

/**
 * 类名按照驼峰规则修改
 * @param str
 * @param capitalize
 * @return
 */
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]
}

def isNotEmpty(content) {
    
    
    return content != null && content.toString().trim().length() > 0
}

Datei generieren

Klicken Sie mit der rechten Maustaste auf die Tabelle, und klicken Sie dann nacheinander gemäß der folgenden Abbildung. Achten Sie auf die letzte, um die zuvor erstellte Groovy-Datei auszuwählen
Fügen Sie hier eine Bildbeschreibung ein

Im Folgenden wird das Verzeichnis der generierten Datei ausgewählt
Fügen Sie hier eine Bildbeschreibung ein

Nach dem Klicken auf OK wird die Datei erfolgreich generiert, die Seite sieht wie folgt aus und die generierte Datei befindet sich im roten Feld.
Hinweis:

  • Wenn es eine Datei mit demselben Namen gibt, wird sie direkt ersetzt
  • Wenn die Ordner dao, entity, service und impl nicht vorhanden sind, werden sie automatisch erstellt
    Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/huangge1199/article/details/113254919
Empfohlen
Rangfolge