IDEA 逆向工程

今天要写一个导入功能,需要把数据库的一个表映射成一个pojo,但是这表字段不是一般的多啊。。。想了想能不能自动生成???在IDEA中点了半天发现还是可以的

下面介绍一下步骤:

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

建立完成之后如下图:

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

主要是修改包名:

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

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

如果项目中使用了Lombok插件的话,可以扩展一下自带的Generate POJOs.groovy就可很快的生成我们想要形式的pojo

下面是我的这个工程结构:

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

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

需要稍微改动一下才可以用

 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]
}

 

posted on 2018-01-04 11:10  一花一四季,一梦一世界  阅读(1042)  评论(0编辑  收藏  举报