暂时只对 MySQL进行了测试
项目使用 Lombok MyBatis-Plus
一:使用步骤首先在项目右侧找到 DataBase 如图 没有请参考 idea中database不显示问题
2.点开之后进行数据库连接(注意没有驱动的请下载相关数据库驱动)具体步骤如图
点开 + 号
选择Date Source
找到相应的数据库 这里我使用的是 mysql
如果没有 Dirver 请下载 idea 会在窗口左下角给提示(这里具体在什么位置我也记不清楚)输入相关连接信息
过程中出现任何问题,请在留言区留言(萌新基本全天在线)连接上之后如果没有需要的数据可以点击如下图方式
先设置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;"
}
|
选中需要的数据库,找到需要生成实体类的表这里我就随便选择一个。右键选择
在左侧列表找到文件名之后点击会有弹窗选择你要存放的地方点击