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 import java.sql.Date
7
8
9 /*
10 * Available context bindings:
11 * SELECTION Iterable<DasObject>
12 * PROJECT project
13 * FILES files helper
14 */
15
16 packageName = "com.sample;"
17
18 typeMapping = [
19 (~/(?i)tinyint|smallint|mediumint/) : "Integer",
20 (~/(?i)int/) : "Integer",
21 (~/(?i)bool|bit/) : "Boolean",
22 (~/(?i)float|double|decimal|real/) : "Double",
23 (~/(?i)datetime|timestamp|date|time/) : "Date",
24 (~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",
25 (~/(?i)number/) : "Integer",
26 (~/(?i)/) : "String"
27 ]
28
29
30 FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
31 SELECTION.filter { it instanceof DasTable && it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) }
32 }
33
34
35 def generate(table, dir) {
36 def className = javaClassName(table.getName(), true)
37 def fields = calcFields(table)
38 //当是maven项目的时候,需要解开下面的注释
39 // packageName = getPackageName(dir)
40 new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields, table) }
41 }
42
43
44 def generate(out, className, fields, table) {
45 out.println "package $packageName"
46 out.println ""
47 out.println "import javax.persistence.*;"
48 out.println "import java.io.Serializable;"
49 out.println "import com.fasterxml.jackson.annotation.JsonIgnore;"
50 out.println "import io.swagger.annotations.ApiModel;"
51 out.println "import io.swagger.annotations.ApiModelProperty;"
52 out.println "import lombok.Data;"
53 out.println "import org.hibernate.annotations.DynamicInsert;"
54 out.println "import org.hibernate.annotations.DynamicUpdate;"
55 out.println "import org.springframework.data.jpa.domain.support.AuditingEntityListener;"
56
57 Set types = new HashSet()
58
59 fields.each() {
60 types.add(it.type)
61 }
62
63 if (types.contains("Date")) {
64 out.println "import java.util.Date;"
65 out.println "import org.springframework.data.annotation.LastModifiedDate;"
66 out.println "import org.springframework.data.annotation.CreatedDate;"
67 }
68
69 if (types.contains("InputStream")) {
70 out.println "import java.io.InputStream;"
71 }
72 out.println ""
73 out.println "/**
" +
74 " * @Description:
" +
75 " * @Date: Created in" + new java.util.Date().toString() +"
"+
76 " * @Author: Cenobitor
" +
77 " * @Modified By:
" +
78 " */"
79 out.println "@Data"
80 out.println "@Entity"
81 out.println "@DynamicInsert"
82 out.println "@DynamicUpdate"
83 out.println "@EntityListeners(AuditingEntityListener.class)"
84 out.println "@ApiModel(value="",description="")"
85 out.println "@Table ( name ="" + table.getName() + "" )"
86 out.println "public class $className implements Serializable {"
87 out.println ""
88 out.println genSerialID()
89 fields.each() {
90 out.println ""
91 // 输出注释
92 if (isNotEmpty(it.commoent)) {
93 out.println " /**${it.commoent}*/"
94 }
95
96 if (it.annos != "") out.println " ${it.annos}"
97 // 输出成员变量
98 out.println " private ${it.type} ${it.name};"
99 }
100 out.println ""
101 out.println "}"
102 }
103
104 def calcFields(table) {
105 DasUtil.getColumns(table).reduce([]) { fields, col ->
106 def spec = Case.LOWER.apply(col.getDataType().getSpecification())
107
108 def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
109 def comm = [
110 colName : col.getName(),
111 name : changeStyle(javaName(col.getName(), false), true),
112 type : typeStr,
113 commoent: col.getComment(),
114 annos : " @Column(name = "" + col.getName() + "" )"]
115 if ("id".equals(Case.LOWER.apply(col.getName()))){
116 comm.annos = " @Id
"
117 //自增主键需要
118 comm.annos += " @GeneratedValue(strategy = GenerationType.IDENTITY)"
119 }
120 if ("create_time".equals(Case.LOWER.apply(col.getName()))){
121 comm.annos += "
@CreatedDate"
122 }
123 if ("update_time".equals(Case.LOWER.apply(col.getName()))){
124 comm.annos += "
@LastModifiedDate"
125 }
126 fields += [comm]
127 }
128 }
129
130 // 处理类名(这里是因为我的表都是以t_命名的,所以需要处理去掉生成类名时的开头的T,
131 // 如果你不需要那么请查找用到了 javaClassName这个方法的地方修改为 javaName 即可)
132 def javaClassName(str, capitalize) {
133 def s = str.split(/[^p{Alnum}]/).collect { def s = Case.LOWER.apply(it).capitalize() }.join("")
134 // 去除开头的T http://developer.51cto.com/art/200906/129168.htm
135 s = s[1..s.size() - 1]
136 capitalize ? s : Case.LOWER.apply(s[0]) + s[1..-1]
137 }
138
139 def javaName(str, capitalize) {
140 def s = str.split(/(?<=[^p{IsLetter}])/).collect { Case.LOWER.apply(it).capitalize() }
141 .join("").replaceAll(/[^p{javaJavaIdentifierPart}]/, "_")
142 capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
143 }
144
145 def isNotEmpty(content) {
146 return content != null && content.toString().trim().length() > 0
147 }
148
149 static String changeStyle(String str, boolean toCamel) {
150 if (!str || str.size() <= 1)
151 return str
152
153 if (toCamel) {
154 String r = str.toLowerCase().split('_').collect { cc -> Case.LOWER.apply(cc).capitalize() }.join('')
155 return r[0].toLowerCase() + r[1..-1]
156 } else {
157 str = str[0].toLowerCase() + str[1..-1]
158 return str.collect { cc -> ((char) cc).isUpperCase() ? '_' + cc.toLowerCase() : cc }.join('')
159 }
160 }
161
162 static String genSerialID() {
163 return " private static final long serialVersionUID = " + Math.abs(new Random().nextLong()) + "L;";
164 }
二、自动生成的实体类
1 package com.sample;
2
3 import javax.persistence.*;
4 import java.io.Serializable;
5 import com.fasterxml.jackson.annotation.JsonIgnore;
6 import io.swagger.annotations.ApiModel;
7 import io.swagger.annotations.ApiModelProperty;
8 import lombok.Data;
9 import org.hibernate.annotations.DynamicInsert;
10 import org.hibernate.annotations.DynamicUpdate;
11 import org.springframework.data.jpa.domain.support.AuditingEntityListener;
12 import java.util.Date;
13 import org.springframework.data.annotation.LastModifiedDate;
14 import org.springframework.data.annotation.CreatedDate;
15
16 /**
17 * @Description:
18 * @Date: Created inWed Nov 06 17:08:23 CST 2019
19 * @Author: Cenobitor
20 * @Modified By:
21 */
22 @Data
23 @Entity
24 @DynamicInsert
25 @DynamicUpdate
26 @EntityListeners(AuditingEntityListener.class)
27 @ApiModel(value="",description="")
28 @Table ( name ="t_staff_role" )
29 public class StaffRole implements Serializable {
30
31 private static final long serialVersionUID = 2663305203216589678L;
32
33
34 /**自增ID*/
35 @Id
36 @GeneratedValue(strategy = GenerationType.IDENTITY)
37 private Integer id;
38
39 /**角色名*/
40 @Column(name = "role_name" )
41 private String roleName;
42
43 /**备注*/
44 @Column(name = "remark" )
45 private String remark;
46
47 /**创建人*/
48 @Column(name = "create_user" )
49 private String createUser;
50
51 /**创建时间*/
52 @Column(name = "create_time" )
53 @CreatedDate
54 private Date createTime;
55
56 /**修改人*/
57 @Column(name = "update_user" )
58 private String updateUser;
59
60 /**更新时间*/
61 @Column(name = "update_time" )
62 @LastModifiedDate
63 private Date updateTime;
64
65 /**是否删除 0否 1 是*/
66 @Column(name = "is_deleted" )
67 private String isDeleted;
68
69 }