专栏首页须臾之余IDEA连接数据库生成对应实体类(有字段注释)

IDEA连接数据库生成对应实体类(有字段注释)

添加模板

import com.intellij.database.model.DasTable
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil
import java.io.*
import java.text.SimpleDateFormat

/*
 * Available context bindings:
 *   SELECTION   Iterable<DasObject>
 *   PROJECT     project
 *   FILES       files helper
 */

packageName = "com.jx.eat.domain;"
typeMapping = [
        (~/(?i)int/)                      : "Long",
        (~/(?i)float|double|decimal|real/): "Double",
        (~/(?i)datetime|timestamp/)       : "java.util.Date",
        (~/(?i)date/)                     : "java.util.Date",
        (~/(?i)time/)                     : "java.util.Date",
        (~/(?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) {
    def tableComment = getTableComment(table)
    if (tableComment == null || "".equals(tableComment)) {
        tableComment = ""
    }
    def className = javaName(table.getName(), true)
    def fields = calcFields(table)
    PrintWriter output = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "utf-8"))
    output.withPrintWriter { out -> generate(out, className, fields, tableComment) }
}

def generate(out, className, fields, tableComment) {
    out.println "package $packageName"
    out.println "import java.io.Serializable;"
    out.println ""
    out.println ""
    out.println "/**\n" +
            " * <p> \n" +
            " * \n" +
            " * <p> \n" +
            " * \n" +
            " * @author xuyu\n" +
            " * @desc " + tableComment + "\n" +
            " * @since: " + getNowDateYMS() + "\n" +
            " */"
    out.println ""
    out.println "public class $className implements Serializable{"
    out.println ""
    fields.each() {
        if (isNotEmpty(it.commoent)) {
            out.println "\t/**"
            out.println "\t * ${it.commoent}"
            out.println "\t */"
        }
        if (it.annos != "") out.println "  ${it.annos}"
        out.println "  private ${it.type} ${it.name};"
    }
    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 += [[
                           name    : javaName(col.getName(), false),
                           type    : typeStr,
                           commoent: col.getComment(),
                           annos   : ""]]
    }
}

def getTableComment(table) {

    return table.getComment();
}


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 isNotEmpty(content) {
    return content != null && content.toString().trim().length() > 0
}

def getNowDateYMS() {
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd")// 设置日期格式
    return df.format(new Date())
}

效果

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring5.0源码深度解析之SpringBean的生命周期终结

    那么这个MemberServiceImpl对象是交给spring到底是通过反射还是其它方式初始化的?

    须臾之余
  • Java集合源码分析之ArrayList

    分析一个类的时候,数据结构往往是它的灵魂所在,理解底层的数据结构其实就理解了该类的实现思路,具体的实现细节再具体分析。

    须臾之余
  • Mybatis深入源码分析之Mapper与接口绑定原理源码分析

    紧接上篇文章:Mybatis深入源码分析之SqlSessionFactoryBuilder源码分析,这里再来分析下,Mapper与接口绑定原理。

    须臾之余
  • 【Java学习笔记之十四】Java中this用法小节

    用类名定义一个变量的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法。     那们类里面是够也应该有一个引用来访问自己的属性和方法纳...

    Angel_Kitty
  • Java基础小结(一)

    1、default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

    汐楓
  • HBase案例之2个逻辑思维训练小题目

    我们知道,在对Hbase表中的数据进行全表扫描时,可以指定rowkey的范围,比如:

    CoderJed
  • Java集合框架

    听着music睡
  • Spring配置DBCP连接池

    爱撒谎的男孩
  • 深度解读马云的功成名就

    在美期间,马云出席克林顿全球倡议大会时,与美国前总统克林顿一家人及美国商界大佬畅谈上市感想。谈起阿里的成功,马云表示,是因为中国的贸易结构实在太烂了,才给了阿里...

    用户1756920
  • 运营商再度提升CDN关注,SDN/NFV成2015年重要关注点

    2015年3月31日,2015第三届亚太CDN峰会圆满落下帷幕,本届CDN峰会以“大数据背景下的流量经营”为主题,力邀广电总局、工信部、腾讯云、阿里、迅雷、乐视...

    SDNLAB

扫码关注云+社区

领取腾讯云代金券