Código de geração reversa de ideia (tome o banco de dados MySQL como exemplo)
Abra as configurações do banco de dados de ideias
Exibir–> Janelas de ferramentas–> Banco de dados, abra a
página de configuração do banco de dados , deve haver uma caixa vermelha no lado direito da página, ou você pode abri-lo através do Banco de dados no lado direito da caixa vermelha
Banco de dados de configuração
+ Sign–> Data Source–> MySQL, entre na página de configuração
Preencha as informações de configuração e verifique
Uma marca de verificação verde aparece e a verificação foi bem-sucedida
Se o seguinte aparecer na parte inferior da página, clique em Download para baixar o driver
Depois de configurar e clicar em OK, as informações do banco de dados aparecem no lado direito da página
Crie um arquivo bacana
Escreva um arquivo bacana
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
}
Gerar arquivo
Clique com o botão direito na tabela e clique na sequência conforme a figura a seguir, preste atenção ao último para selecionar o arquivo groovy criado anteriormente
Aparece a seguir, selecione o diretório do arquivo gerado
Após clicar em OK, o arquivo é gerado com êxito, a página é a seguinte, e o arquivo gerado é na caixa vermelha.
Nota:
- Se houver um arquivo com o mesmo nome, ele será substituído diretamente
- Se as pastas dao, entity, service e impl não existirem, elas serão criadas automaticamente