idea自动生成带注解的实体类
idea自动生成带注解的实体类
说明
idea本身自带有生成实体类操作方法,但生成后发现没有注解,很不方便,可使用以下方法生成带注解的实体类
idea配置数据库
打开idea最右边边上有database,点击进去
选择添加一个新的数据库类型,我们已mysql为例,选择mysql
在弹出的窗口中填写mysql链接关键信息,地址(默认localhost),端口(默认3306),用户名,密码,完成之后点击Test connection,出现Successful则链接成功,点击右下角落确认即可
idea添加groovy文件
此时我们可以直接生成实体类,选择 Generate POJOs.groovy即可
此时生成的实体为没有注解,我们可以选择Go to Scripts Directory
此时系统会自动定位到Generate POJOs.groovy的目录下,我们在次目录下新建一个GenerateMYPOJOs.groovy把下面内容复制进去,当然你也可以自己定义一套生成规则或者
去找一套需要的生成规则添加进去
import com.intellij.database.model.DasTable
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil
typeMapping = [
(~/(?i)number\(\d\)/) : "int",
(~/(?i)number/) : "double",
(~/(?i)int/) : "int",
(~/(?i)long/) : "long",
(~/(?i)float|double|decimal|real/): "double",
(~/(?i)timestamp|datetime|date|time/) : "LocalDateTime",
(~/(?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 file = new File(dir,className+".java")
def packageName = dir.toString().replaceAll("\\\\", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
def writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8"))
writer.withPrintWriter { out -> generate(out, table, fields, packageName) }
}
def generate(out, table, fields, packageName) {
def tableName = table.getName()
def className = javaName(tableName, true)
def tableComment = table.getComment()
def hasPK = DasUtil.getPrimaryKey(table)!=null
def hasDatetime = false
fields.each() {hasDatetime=hasDatetime||it.type=="LocalDateTime"}
out.println "package $packageName"
out.println ""
out.println "import javax.persistence.*;"
if (hasPK) out.println "import java.time.LocalDateTime;"
out.println "import org.hibernate.annotations.GenericGenerator;"
out.println ""
if (tableComment != "" && tableComment != null){
out.println "/**"
out.println " * ${tableComment}"
out.println " */"
}
if (hasPK) out.println "@Entity"
out.println "@Table(name = \"${tableName}\")"
out.println "public class $className {"
out.println ""
fields.each() {
out.println " //${it.commoent} ${it.spec}"
out.println " private ${it.type} ${it.name};"
out.println ""
}
fields.each() {
out.println ""
if (it.isId) out.println " @Id"
if (it.isId) out.println " @GeneratedValue()"
if (it.annos != "") out.println " ${it.annos}"
out.println " public ${it.type} get${it.name.capitalize()}() {"
out.println " return ${it.name};"
out.println " }"
out.println ""
out.println " public void set${it.name.capitalize()}(${it.type} ${it.name}) {"
out.println " this.${it.name} = ${it.name};"
out.println " }"
out.println ""
}
out.println "}"
}
def calcFields(table) {
def primaryKey = DasUtil.getPrimaryKey(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
def colName = col.getName()
fields += [[
name : javaName(col.getName(), false),
type : typeStr,
commoent: col.getComment(),
spec:spec,
isId : primaryKey != null && DasUtil.containsName(colName, primaryKey.getColumnsRef()),
annos : "@Column(name = \"${colName}\")",
]]
}
}
def javaName(str, capitalize) {
def s = str.split(/(?<=[^\p{IsLetter}])/).collect { Case.LOWER.apply(it).capitalize() }
.join("").replaceAll(/[^\p{javaJavaIdentifierPart}]/, "")
.replaceAll("_", "")
capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
}
生成带注解的实体
此时我们重新生成,选择我们刚刚添加的GenerateMYPOJOs.groovy,此时我们的类就有注解了
总结
整体来说这套生成方法也不算很方便,使用MyBatis Generator或hibernate都可以自动生成实体类,也都比较方便,之前也有看过有大神直接写一套程序输入数据源信息,选择表可以自动生成需要的xml,bean,service,dao这些结构代码,当然适合自己才是最重要的