IDEA POJO开发神器之Groovy的使用详解

时间:2021-12-25 09:55:54

暂时只对 MySQL进行了测试

项目使用 Lombok MyBatis-Plus

一:使用步骤首先在项目右侧找到 DataBase 如图 没有请参考 idea中database不显示问题

IDEA POJO开发神器之Groovy的使用详解

2.点开之后进行数据库连接(注意没有驱动的请下载相关数据库驱动)具体步骤如图

IDEA POJO开发神器之Groovy的使用详解

点开 + 号

IDEA POJO开发神器之Groovy的使用详解

选择Date Source

IDEA POJO开发神器之Groovy的使用详解

找到相应的数据库 这里我使用的是 mysql

IDEA POJO开发神器之Groovy的使用详解

如果没有 Dirver 请下载 idea 会在窗口左下角给提示(这里具体在什么位置我也记不清楚)输入相关连接信息

IDEA POJO开发神器之Groovy的使用详解

过程中出现任何问题,请在留言区留言(萌新基本全天在线)连接上之后如果没有需要的数据可以点击如下图方式

IDEA POJO开发神器之Groovy的使用详解

IDEA POJO开发神器之Groovy的使用详解

先设置groovy

IDEA POJO开发神器之Groovy的使用详解

替换(有些地方需要注意,具体看下方源码)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import com.intellij.database.model.DasTable
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil
 
import java.time.LocalDate
 
/*
 * Available context bindings:
 * SELECTION Iterable<DasObject>
 * PROJECT  project
 * FILES  files helper
 */
 
// 此处指定包路径,路径需要自行维护;
packageName = "com.qgy.web.entity;"
// 此处指定对应的类型映射,可按需修改,目前tinyint如果要映射到自定义枚举类型,只能手动修改
typeMapping = [
  (~/(?i)bigint/)     : "Long",
  (~/(?i)int/)      : "Integer",
  (~/(?i)tinyint/)     : "Boolean",
  (~/(?i)float|double|decimal|real/): "BigDecimal",
  (~/(?i)time|datetime|timestamp/) : "LocalDateTime",
  (~/(?i)date/)      : "LocalDate",
  (~/(?i)/)       : "String"
]
 
// 上面用到类和它的导入路径的之间的映射
importMap = [
  "BigDecimal" : "java.math.BigDecimal",
  "LocalDate" : "java.time.LocalDate",
  "LocalDateTime": "java.time.LocalDateTime",
]
 
// 导入路径列表,下面引用的时候会去重,也可以直接声明成一个 HashSet
importList = []
 
// 弹出选择文件的对话框
FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
 SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) }
}
 
def generate(table, dir) {
 def className = javaName(table.getName(), true) + "Entity"
 def fields = calcFields(table)
 new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "utf-8")).withPrintWriter { out -> generate(out, className, fields, table) }
}
 
// 从这里开始,拼实体类的具体逻辑代码
def generate(out, className, fields, table) {
 out.println "package $packageName"
 out.println ""
 // 引入所需的包
 out.println "import lombok.Data;"
 out.println "import lombok.EqualsAndHashCode;"
 out.println "import lombok.experimental.Accessors;"
 out.println "import com.baomidou.mybatisplus.annotation.*;"
 out.println "import java.io.Serializable;"
 // 去重后导入列表
 importList.unique().each() { pkg ->
  out.println "import " + pkg + ";"
 }
 out.println ""
 // 添加类注释
 out.println "/**"
 // 如果添加了表注释,会加到类注释上
 if (isNotEmpty(table.getComment())) {
  out.println " * " + table.getComment()
 }
 out.println " *"
 out.println " * @author 输入作者"
 out.println " * @date " + LocalDate.now()
 out.println " */"
 // 添加类注解
 out.println "@Data"
 out.println "@EqualsAndHashCode(callSuper = false)"
 out.println "@Accessors(chain = true)"
 out.println "@TableName(\"${table.getName()}\")"
 out.println "public class $className implements Serializable {"
 out.println ""
 out.println genSerialID()
 boolean isId = true
 // 遍历字段,按下面的规则生成
 fields.each() {
  // 输出注释
  if (isNotEmpty(it.comment)) {
   out.println "\t/**"
   out.println "\t * ${it.comment}"
   out.println "\t */"
  }
  // 这边默认第一个字段为主键,实际情况大多数如此,遇到特殊情况可能需要手动修改
  if (isId) {
   out.println "\t@TableId(type = IdType.AUTO)"
   isId = false
  }
  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};"
  out.println ""
 }
 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
  if (importMap.containsKey(typeStr)) {
   importList.add(importMap.get(typeStr))
  }
  fields += [[
       name : javaName(col.getName(), false),
       type : typeStr,
       comment: col.getComment(),
       annos : "\t@TableField(\"" + col.getName() + "\" )"
     ]]
 }
}
 
def isNotEmpty(content) {
 return content != null && content.toString().trim().length() > 0
}
 
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]
}
 
static String genSerialID() {
 return "\tprivate static final long serialVersionUID = " + Math.abs(new Random().nextLong()) + "L;"
}

选中需要的数据库,找到需要生成实体类的表这里我就随便选择一个。右键选择

IDEA POJO开发神器之Groovy的使用详解

在左侧列表找到文件名之后点击会有弹窗选择你要存放的地方点击