最近做新项目,项目中没有引入自动生成的代码,要手写实体,好麻烦,就上网搜了一下IDEA工具有没有什么插件可以自动生成,没想到好真的有,用这篇文章记录一下整个过程,毕竟中间还是遇到了好几个问题。
1、打开Database工具Tab页,连接数据库,找到要生成实体的表,右键选择按照那个模板生成就可以了。
但是,网上说有人没有这些,他们说重新下载一个新的版本就可以了,我也没遇到,所有也不是很清楚。
2、现在生成的操作过程都清楚了,下面就是怎么自定义生成模板,我自己修改了一份JPA实体模板,如下:
import com.intellij.database.model.DasTable
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil
import java.sql.Date
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
/*
* Available context bindings:
* SELECTION Iterable<DasObject>
* PROJECT project
* FILES files helper
*/
packageName = "com.sample;"
typeMapping = [
(~/(?i)int|tinyint|smallint|mediumint/) : "Integer",
(~/(?i)bool|bit/) : "Boolean",
(~/(?i)float|double|decimal|real|number/): "BigDecimal",
(~/(?i)datetime|timestamp|date|time/) : "Date",
(~/(?i)binary|bfile|raw|image/) : "InputStream",
(~/(?i)blob|clob/) : "lob",
(~/(?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)
packageName = getPackageName(dir)
// 解决乱码问题
new File(dir, className + ".java").withPrintWriter("utf-8") { out -> generate(out, className, fields, table) }
}
// 获取包所在文件夹路径
def getPackageName(dir) {
return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
}
def generate(out, className, fields, table) {
out.println "package $packageName"
out.println ""
out.println "import javax.persistence.*;"
out.println "import java.io.Serializable;"
out.println "import lombok.*;"
Set types = new HashSet()
fields.each() {
types.add(it.type)
}
if (types.contains("BigDecimal")) {
out.println "import java.math.BigDecimal;"
}
if (types.contains("Date")) {
out.println "import java.util.Date;"
out.println "import org.hibernate.annotations.GenericGenerator;"
out.println "import org.hibernate.annotations.UpdateTimestamp;"
out.println "import org.hibernate.annotations.CreationTimestamp;"
}
if (types.contains("InputStream")) {
out.println "import java.io.InputStream;"
}
out.println ""
out.println "/**\n" +
" * @Author: zhangjian\n" +
" * @Date: " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm")) +"\n"+
" */"
out.println "@Data"
out.println "@Entity"
out.println "@Table (name = \"" + table.getName() + "\")"
out.println "@Builder"
out.println "@NoArgsConstructor"
out.println "@AllArgsConstructor"
out.println "public class $className implements Serializable {"
out.println ""
out.println genSerialID()
fields.each() {
out.println ""
// 输出注释
if (isNotEmpty(it.commoent)) {
out.println "\t/**${it.commoent.toString()}*/"
}
if (it.annos != "") out.println " ${it.annos}"
// 输出成员变量
out.println "\tprivate ${it.type} ${it.name};"
}
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
def comm = [
colName : col.getName(),
name : changeStyle(fileName(col.getName(), false), true),
type : typeStr,
commoent: col.getComment(),
annos : "\t@Column(name = \"" + col.getName() + "\" )"]
if ("id".equals(Case.LOWER.apply(col.getName()))){
comm.annos = "\t@Id\n"
//自增主键需要
comm.annos += "\t@GenericGenerator(name = \"idGen\", strategy = \"uuid\")\n"
comm.annos += "\t@GeneratedValue(generator = \"idGen\")\n"
comm.annos += "\t@Column(name = \"id\")"
}
if ("create_time".equals(Case.LOWER.apply(col.getName()))){
comm.annos += "\n\t@CreationTimestamp"
comm.annos += "\n\t@Temporal(TemporalType.TIMESTAMP)"
}
if ("update_time".equals(Case.LOWER.apply(col.getName()))){
comm.annos += "\n\t@UpdateTimestamp"
comm.annos += "\n\t@Temporal(TemporalType.TIMESTAMP)"
}
if("lob".equals(typeStr)) {
comm.type = "String";
comm.annos = "\t@Lob\n"
comm.annos += "\t@Basic(fetch = FetchType.EAGER)\n"
comm.annos += "\t@Column(name = \"" + col.getName() + "\", columnDefinition = \"CLOB\")"
}
fields += [comm]
}
}
def javaName(str, capitalize) {
def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
.collect { Case.LOWER.apply(it).capitalize() }
.join("")
.replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
// 这里是因为我的表都是以T_命名的,所以需要处理去掉生成类名时的开头的T,如果不用处理注释掉下面这句代码
s = s[1..s.size() - 1]
capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
}
def fileName(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 isNotEmpty(content) {
return content != null && content.toString().trim().length() > 0
}
static String changeStyle(String str, boolean toCamel) {
if (!str || str.size() <= 1)
return str
if (toCamel) {
String r = str.toLowerCase().split('_').collect { cc -> Case.LOWER.apply(cc).capitalize() }.join('')
return r[0].toLowerCase() + r[1..-1]
} else {
str = str[0].toLowerCase() + str[1..-1]
return str.collect { cc -> ((char) cc).isUpperCase() ? '_' + cc.toLowerCase() : cc }.join('')
}
}
static String genSerialID() {
return "\tprivate static final long serialVersionUID = " + Math.abs(new Random().nextLong()) + "L;";
}
将修改你的模板放到下图这个位置就可以了
你可以点击这个按钮来定位到这个位置
好了,这样你就不用在手写实体了