【IntelliJ IDEA工具】spring boot使用JPA自动生成实体类(数据库表逆向工程自动生成带注释的实体类)

一、配置mysql数据库

1、IntelliJ IDEA菜单栏:view → Tool Windows → Database

【IntelliJ IDEA工具】spring boot使用JPA自动生成实体类(数据库表逆向工程自动生成带注释的实体类)_第1张图片

2、+  →  Data source  →  MySQL 

【IntelliJ IDEA工具】spring boot使用JPA自动生成实体类(数据库表逆向工程自动生成带注释的实体类)_第2张图片

3、填写数据库信息(初次连接需要安装驱动)

【IntelliJ IDEA工具】spring boot使用JPA自动生成实体类(数据库表逆向工程自动生成带注释的实体类)_第3张图片 4、点击 “Test Connection” 测试连接是否成功

【IntelliJ IDEA工具】spring boot使用JPA自动生成实体类(数据库表逆向工程自动生成带注释的实体类)_第4张图片 5、配置成功,可以直接看到数据库和数据表

【IntelliJ IDEA工具】spring boot使用JPA自动生成实体类(数据库表逆向工程自动生成带注释的实体类)_第5张图片

二、在pom.xml中导入必要maven依赖 

        
        
            mysql
            mysql-connector-java
            5.1.44
        
        
        
            org.springframework.boot
            spring-boot-starter-data-jpa
        
        
            javax.persistence
            persistence-api
            1.0.2
        
        
        
            org.projectlombok
            lombok
            1.16.20
            provided
        

 三、生成实体类操作

1、在database视图区域任意地方右键,然后Scripted Extensions Go to Scripts Directory

【IntelliJ IDEA工具】spring boot使用JPA自动生成实体类(数据库表逆向工程自动生成带注释的实体类)_第6张图片

2、修改 Generate POJOs.groovy文件的packageName为实体类的包名

【IntelliJ IDEA工具】spring boot使用JPA自动生成实体类(数据库表逆向工程自动生成带注释的实体类)_第7张图片

3、在database视图区域选择你想要生成的表,然后Scripted Extensions Generate POJOs.groovy

可以使用ShiftCtrl多选),选择项目下实体类的文件夹,然后点”ok“即可

【IntelliJ IDEA工具】spring boot使用JPA自动生成实体类(数据库表逆向工程自动生成带注释的实体类)_第8张图片

4、打开实体类文件夹,可以看到已经自动生成实体类了。

【IntelliJ IDEA工具】spring boot使用JPA自动生成实体类(数据库表逆向工程自动生成带注释的实体类)_第9张图片

四、带注释功能的Generate POJOs.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
import java.text.SimpleDateFormat
/*
 * Available context bindings:
 *   SELECTION   Iterable
 *   PROJECT     project
 *   FILES       files helper
 */
//实体类的包名
packageName = "com.jun.codepay.entity"
typeMapping = [
        (~/(?i)tinyint|smallint|mediumint/)      : "Integer",
        (~/(?i)int/)                             : "Long",
        (~/(?i)bool|bit/)                        : "Boolean",
        (~/(?i)float|double|decimal|real/)       : "BigDecimal",
        (~/(?i)datetime|timestamp|date|time/)    : "Date",
        (~/(?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) {
 //去除表前缀(针对“前缀_table”格式的表)  http://developer.51cto.com/art/200906/129168.htm
  tablename=table.getName();
  if(tablename.indexOf("_")!=-1){
    tablename=tablename.substring(tablename.indexOf("_"));
  }
  def className = javaName(tablename, true)
  def fields = calcFields(table)
  //当是maven项目的时候,需要解开下面的注释
  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, table) }
}

// 获取包所在文件夹路径
def getPackageName(dir) {
  return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
}

def generate(out, className, fields, table) {
  out.println "package $packageName"
  out.println "import javax.persistence.Column;"
  out.println "import javax.persistence.Entity;"
  out.println "import javax.persistence.Table;"
  out.println "import javax.persistence.Id;"
  out.println "import javax.persistence.GeneratedValue;"
  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("BigDecimal")) {
    out.println "import java.math.BigDecimal;"
  }
  if (types.contains("InputStream")) {
    out.println "import java.io.InputStream;"
  }
  out.println "/** \n" +
          " * @team mackie Studio \n" +
          " * @Author QQ:15577969 \n" +
          " * @Date " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " \n" +
          " */"
  out.println "@Entity"
  out.println "@Table ( name =\"" + table.getName() + "\" )"
  out.println "public class $className  implements Serializable {"
  out.println ""
  out.println genSerialID()
  fields.each() {
    out.println ""
    // 输出注释
    if (isNotEmpty(it.commoent)) {
      out.println "\t/**"
      out.println "\t * ${it.commoent.toString()}"
      out.println "\t */"
    }
    if ((it.annos+"").indexOf("[@Id]") >= 0) out.println "\t@Id"
    if (it.annos != "") out.println "   ${it.annos.replace("[@Id]", "")}"
    // 输出成员变量
    out.println "\tprivate ${it.type} ${it.name};"
  }
  // 输出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 ""
  }
  // 输出toString方法
  /*
  out.println ""
  out.println "\t@Override"
  out.println "\tpublic String toString() {"
  out.println "\t\treturn \"{\" +"
  fields.each() {
    out.println "\t\t\t\t\t\"${it.name}='\" + ${it.name} + '\\'' +"
  }
  out.println "\t\t\t\t'}';"
  out.println "\t}"
  out.println ""
  */
  out.println "}"
}

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 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
}
//生成序列化的serialVersionUID
static String genSerialID() {
  return "\tprivate static final long serialVersionUID =  " + Math.abs(new Random().nextLong()) + "L;"
}

效果如下:

【IntelliJ IDEA工具】spring boot使用JPA自动生成实体类(数据库表逆向工程自动生成带注释的实体类)_第10张图片

 【IntelliJ IDEA工具】spring boot使用JPA自动生成实体类(数据库表逆向工程自动生成带注释的实体类)_第11张图片

你可能感兴趣的:(IDEA)