IDEA 逆向工程

今天要写一个导入功能,须要把数据库的一个表映射成一个pojo,可是这表字段不是通常的多啊。。。想了想能不能自动生成???在IDEA中点了半天发现仍是能够的java

下面介绍一下步骤:sql

第一步:找到这个图标,创建一个数据库链接数据库

创建完成以后以下图:api

第二部修改生成pojo的脚本,切换到这个视图app

主要是修改包名:maven

把上图中的packageName修改为生成pojo存放位置的包便可ui

第三步:选中要生成实体类的表(能够多选),右键按下图便可生成spa

若是项目中使用了Lombok插件的话,能够扩展一下自带的Generate POJOs.groovy就可很快的生成咱们想要形式的pojohibernate

下面是个人这个工程结构:插件

这是一个典型的maven工程结构,针对maven工程,扩展的两个groovy脚本,两个脚本都可以根据选择的文件夹自动生成正确的包名

Generate POJOs For Hibernate Lombok.groovy 这个脚本用来生成Hibernate的实体类,要注意两点:一、主键名必须是“id”,二、若是表中有版本字段,那么版本字段名必须是"version",三、这脚本生成的实体类,主键生成策略没有采用自增模式,若是你的表中主键设置了自增的话,

须要稍微改动一下才能够用

 1 import com.intellij.database.model.DasTable
 2 import com.intellij.database.model.ObjectKind
 3 import com.intellij.database.util.Case
 4 import com.intellij.database.util.DasUtil
 5 
 6 /*
 7  * Available context bindings:
 8  *   SELECTION   Iterable<DasObject>
 9  *   PROJECT     project
10  *   FILES       files helper
11  */
12 typeMapping = [
13         (~/(?i)int/)                      : "long",
14         (~/(?i)float|double|decimal|real/): "double",
15         (~/(?i)datetime|timestamp/)       : "java.sql.Timestamp",
16         (~/(?i)date/)                     : "java.sql.Date",
17         (~/(?i)time/)                     : "java.sql.Time",
18         (~/(?i)/)                         : "String"
19 ]
20 
21 FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
22     SELECTION.filter {
23         it instanceof DasTable && it.getKind() == ObjectKind.TABLE
24     }.each {
25         generate(it, dir)
26     }
27 }
28 
29 def generate(table, dir) {
30     def className = javaName(table.getName(), true)
31     def fields = calcFields(table)
32     def tableName = table.getName()
33     def path = dir.getPath()
34     def packageName = path.substring(path.lastIndexOf("java") + 5, path.length()).replaceAll("\\\\", ".")
35     new File(dir, className + ".java").withPrintWriter { out -> generate(out, tableName, className, fields, packageName) }
36 }
37 
38 def generate(out, tableName, className, fields, packageName) {
39     out.println "package $packageName;"
40     out.println ""
41     out.println "import lombok.Data;"
42     out.println "import org.hibernate.annotations.DynamicInsert;"
43     out.println "import org.hibernate.annotations.DynamicUpdate;"
44     out.println "import org.hibernate.annotations.GenericGenerator;"
45     out.println ""
46     out.println "import javax.persistence.*;"
47     out.println "import java.io.Serializable;"
48     out.println ""
49     out.println "@Data"
50     out.println "@Entity"
51     out.println "@Table(name = \"${tableName}\")"
52     out.println "@DynamicUpdate(true)"
53     out.println "@DynamicInsert(true)"
54     out.println "public class $className  implements Serializable{"
55     out.println ""
56     out.println "\tprivate static final long serialVersionUID = 33163593958226L;"
57     out.println ""
58     fields.each() {
59         if (it.annos != "") out.println "\t${it.annos}"
60         out.println "\tprivate ${it.type} ${it.name};"
61         out.println ""
62     }
63     out.println "}"
64 }
65 
66 def calcFields(table) {
67     DasUtil.getColumns(table).reduce([]) { fields, col ->
68         def spec = Case.LOWER.apply(col.getDataType().getSpecification())
69         def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
70         if (col.getName().toLowerCase() == "id") {
71             fields += [[name : javaName(col.getName(), false),
72                         type : typeStr,
73                         annos: "@Id\n" +
74                                 "\t@GeneratedValue(generator = \"" + table.getName() + "IDGenerator\" , strategy = GenerationType.AUTO)\n" +
75                                 "\t@GenericGenerator(name = \"" + table.getName() + "IDGenerator\" , strategy = \"uuid\")\n" +
76                                 "\t@Column(name =\"" + col.getName() + "\")"]]
77         }  else if(col.getName().toLowerCase() == "version"){
78             fields += [[name : javaName(col.getName(), false),
79                         type : typeStr,
80                         annos: "@Version\n" +
81                                 "\t@Column(name =\"" + col.getName() + "\")"]]
82         }else {
83             fields += [[name : javaName(col.getName(), false),
84                         type : typeStr,
85                         annos: "@Column(name =\"" + col.getName() + "\")"]]
86         }
87     }
88 }
89 
90 def javaName(str, capitalize) {
91     def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
92             .collect { Case.LOWER.apply(it).capitalize() }
93             .join("")
94             .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
95     capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
96 }

 

Generate POJOs For Lombok.groovy 使用lombok插件以后能够采用以下脚本生成Lombok形式的pojo

import com.intellij.database.model.DasTable
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil

/*
 * Available context bindings:
 *   SELECTION   Iterable<DasObject>
 *   PROJECT     project
 *   FILES       files helper
 */

packageName = "com.ryb.pojo;"

typeMapping = [
  (~/(?i)int/)                      : "long",
  (~/(?i)float|double|decimal|real/): "double",
  (~/(?i)datetime|timestamp/)       : "java.sql.Timestamp",
  (~/(?i)date/)                     : "java.sql.Date",
  (~/(?i)time/)                     : "java.sql.Time",
  (~/(?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 = javaName(table.getName(), true)
  def fields = calcFields(table)
  def path = dir.getPath()
  def packageName = path.substring(path.lastIndexOf("java") + 5, path.length()).replaceAll("\\\\", ".")
  new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields, packageName) }
}

def generate(out, className, fields, packageName) {
  out.println "package $packageName;"
  out.println ""
  out.println "import lombok.Data;"
  out.println ""
  out.println "@Data"
  out.println "public class $className {"
  out.println ""
  fields.each() {
    if (it.annos != "") out.println "\t${it.annos}"
    out.println "\tprivate ${it.type} ${it.name};"
  }
  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
    fields += [[
                 name : javaName(col.getName(), false),
                 type : typeStr,
                 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]
}
相关文章
相关标签/搜索