Idea Reverse Generation Code (am Beispiel der MySQL-Datenbank)
Öffnen Sie die Einstellungen der Ideendatenbank
Ansicht–> Tool Windows–> Datenbank, öffnen Sie die Datenbankkonfigurationsseite.
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
Konfigurationsdatenbank
+ Signieren -> Datenquelle -> MySQL, rufen Sie die Konfigurationsseite auf
Geben Sie die Konfigurationsinformationen ein und überprüfen Sie diese
Ein grüner Haken erscheint und die Überprüfung ist erfolgreich
Wenn unten auf der Seite Folgendes angezeigt wird, klicken Sie auf Herunterladen, um den Treiber herunterzuladen
Nach dem Konfigurieren und Klicken auf OK werden die Datenbankinformationen auf der rechten Seite angezeigt
Erstellen Sie eine groovige Datei
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
Im Folgenden wird das Verzeichnis der generierten Datei ausgewählt
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