在新手阶段是否遇到这样一个坑?在自己设计好一个MVC架构模式(简易版本)完成,摩擦手掌开干的时候。看到某个商城的MySQL数据库中N多的表和字段??!!。
因为刚刚入坑Java,没太多经验,但是想到这个万能IDEA肯定不会让我失望,想到旁边的同学一个字一个字对着字段名输入到实体类中我...作为一名专业的程序猿Ctrl+C+V不能满足与我了,我要一键!!!生成然后果断百度。
嘿嘿~~~(●ˇ∀ˇ●),果然idea没有让我失望,在IDEA中有Database可以连接MySQL还能执行、查看等更重要方便!果断跟着教程来了一遍,嘿嘿MySQL之前配置过idea连接起来没啥太多问题。
然后 面向百度编程之IDEA快速生成实体类 ,在看到这样文章:https://blog.csdn.net/aimashi620/article/details/80913422
一步一步跟着走,很好但是最后一步让人不爽,最后生成的私有属性都是驼峰规范的属性???而且最后解决办法也只是替换掉???这不能忍,懒的不要不要的我,又开始走上百度编程,最后无果???整个百度都没有这样的教程或者解决方案?我不信然鹅。。。被我找到这样一个文章说在IDEA生成实体类的功能是一个Java中脚本语言生成的,脚本位置附上:
C:\Users\Administrator\.IntelliJIdea2019.1\config\extensions\com.intellij.database\schema
我是默认的Administrator用户如果大家不是可以换成自己电脑中的用户民,然后在该文件夹下有一个:
Generate POJOs.groovy
相信如果你是跟着之前那个生成实体类走过一遍的看这个很眼熟有木有?。。。然后我果断右键看到有一些懵逼???像Java又想python?然后我百度了这个后缀名.groovy我才了解到原来他是:
Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy 可以使用其他 Java 语言编写的库。
看到这里我舒心了~~~果断百度快速入门手册~~~。嘿嘿对于我而言能掌握他的语法就够了。
附上我自己改写的Generate POJOs.groovy
1、保留了生成实体类名驼峰命名规范。
2、自写了一个方法成功解决自动包名(主要)
3、生成实体类中的私有属性和MySQL中字段保持一致(主要)
4、加入获取字段注释说明,自动放到私有属性后面。
import com.intellij.database.model.DasTable
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil
import java.util.*;
import java.text.SimpleDateFormat;
/*
* Available context bindings:
* SELECTION Iterable<DasObject>
* PROJECT project
* FILES files helper
*/
time = today();
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 }.each { generate(it, dir) }
}
def generate(table, dir) {
packageName = getPackageName(dir)
def className = javaName(table.getName(), true)
def fields = calcFields(table)
new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields) }
}
def generate(out, className, fields) {
out.println "package $packageName"
out.println ""
out.println "/*"
out.println "@author:羽大大"
out.println "@DESCRIPTION:"
out.println "@create:$time"
out.println "*/"
out.println "public class $className {"
out.println ""
fields.each() {
if (it.annos != "") out.println " ${it.annos}"
out.println " private ${it.type} ${it.name};${isNotEmpty(it.comment)?'//'+it.comment.toString():''}"
}
out.println ""
fields.each() {
out.println ""
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) {
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 += [[
comment: col.getComment(),
name : col.getName(),
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]
}
def today(){
String str = "";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-d");
Calendar lastDate = Calendar.getInstance();
lastDate.add(Calendar.MINUTE, 2);
str = sdf.format(lastDate.getTime());
return str;
}
// Get package path
def getPackageName(dir) {
return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src.?", "") + ";"
}
//!=null
def isNotEmpty(content) {
return content != null && content.toString().trim().length() > 0
}
相信仔细看到代码的你,一定细心发现了在写进私有属性后面有一段
${isNotEmpty(it.comment)?'//'+it.comment.toString():''
这段是获取MySQL中注释说明的,但是不知道为什么我获取的好像无效?算了不知道为什么,大家如果有兴趣可以自行解决后发在评论区~~~
代码五分钟,调试半小时~溜了溜了。
PS:复制粘贴的时候记住不要带格式哦~~~尽量保存utf-8编码~