groovy脚本定义结构表一键生成POJO类

 更新时间:2023年03月23日 14:00:49   作者:晃晃悠悠  
这篇文章主要为大家介绍了groovy脚本定义结构表一键生成POJO类示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

使用方式

分享一个小脚本,在定义完表结构后,可以一键生成对应的实体类。

  • 把脚本放在idea的这个位置:

  • 后面使用的话,在idea右侧的Database 栏中,选中对应的表,右键选择对应脚本名称即可。

脚本内容

整体的思路比较简单

  • 获取SQL表信息,提取列名/类型/comment等需要的信息。
  • 按java 中类格式,拼接后输出成文件。(需要import依赖的,需要加注解的都加上)

其中有部分注释,如果不清楚可以留言评论,我会继续补充解释。有问题的话,可以共同进步。

内容如下:

import com.intellij.database.model.DasTable
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil
import java.text.SimpleDateFormat
/*
 * Available context bindings:
 *   SELECTION   Iterable<DasObject>
 *   PROJECT     project
 *   FILES       files helper
 */
packageName = ""
author = "hhyy"
// 类型映射,mysql中的类型,对应java中的类型
typeMapping = [
        (~/bigint/)                       : "Long",
        (~/(?i)int/)                      : "Integer",
        (~/(?i)float|double|decimal|real/): "Double",
        (~/(?i)decimal/)                  : "BigDecimal",
        (~/(?i)datetime|timestamp|time/)  : "LocalDateTime",
        (~/(?i)bool|boolean/)             : "Boolean",
        (~/(?i)date/)                     : "LocalDate",
        (~/(?i)char|text/)                : "String",
        (~/(?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 className = javaName(table.getName(), true)
    def fields = calcFields(table)
    packageName = getPackageName(dir)
    new File(dir, className + "Entity.java").withPrintWriter { out -> generate(out, table, className, fields) }
}
def generate(out, table, className, fields) {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    def nowTime = format.format(new Date())
    def tableName = table.getName()
    out.println "package $packageName"
    out.println ""
    out.println "import lombok.Data;"
    out.println ""
    out.println "import javax.persistence.*;"
    out.println "import java.io.Serializable;"
    out.println "import java.time.LocalDateTime;"
    out.println "import java.math.BigDecimal;"
    out.println ""
    out.println ""
    out.println "/** "
    out.println " * @author $author"
    out.println " * @date $nowTime"
    out.println "**/"
    out.println "@Data"
    out.println "@Entity"
    out.println "@Table(name = "$tableName")"
    out.println "public class ${className}Entity implements Serializable {"
    out.println ""
    fields.each() {
        if (it.annos != "") out.println "  ${it.annos}"
        // 输出注释
        if (isNotEmpty(it.comment)) {
            out.println "\t/** "
            out.println "\t * $it.comment"
            out.println "\t**/"
        }
        if (it.name == "id") {
            // 判断自增
            if ((tableName + "_id").equalsIgnoreCase(fields[0].colum) || "id".equalsIgnoreCase(fields[0].colum)) {
                out.println "\t@Id"
                out.println "\t@GeneratedValue(strategy = GenerationType.IDENTITY)"
            }
        }
        out.println "    @Column(name = "${it.colum}", columnDefinition = "${it.sqlType}")"
        String colName = it.name
        // is_开头的列
        if (colName.startsWith("is")) {
            it.name = colName.substring(2).toLowerCase()
        }
        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
        // sql 字段类型处理
        String sqlTypeStr = spec;
        if (sqlTypeStr != null && !sqlTypeStr.isEmpty() && sqlTypeStr.contains("(")) {
            sqlTypeStr = sqlTypeStr.substring(0, sqlTypeStr.indexOf("("));
        }
        fields += [[
                           name   : javaName(col.getName(), false),
                           colum  : col.getName(),
                           type   : typeStr,
                           sqlType: sqlTypeStr,
                           comment: col.getComment(),
                           annos  : ""]]
    }
}
// sql列名转java列明, 主要是一个驼峰的转换
def javaName(str, capitalize) {
    def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
            .collect { Case.LOWER.apply(it).capitalize() }
            .join("")
            .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
            .replaceAll(/_/, "")
    capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
}
/**
 * 获取包名称
 * @param dir 实体类所在目录
 * @return
 */
static def getPackageName(dir) {
    String absolutePath = dir.toString()
    def replace = absolutePath.substring(absolutePath.indexOf("java\") + 5).replace("\", ".");
    return replace + ";"
}
static def isNotEmpty(content) {
    return content != null && content.toString().trim().length() > 0
}

End

在理解了groovy的语法之后(和Java相似),可以根据需要的方式,修改脚本。比如一些公司实体类可能有固定的规范,需要添加一些东西。比如不用lombok, 自定义get set方法都可以,只要有了列信息,都可以做。

将重复的工作,以脚本的形式固化下来,将大大节省时间精力。

小到一个定时shell脚本,再到我们编写的程序、软件都是在做这个工作,简化,再简化。

“懒惰”确实是人类进步的一大动力。

以上就是groovy脚本定义结构表一键生成POJO类的详细内容,更多关于groovy脚本生成POJO类的资料请关注脚本之家其它相关文章!

相关文章

  • Redis实现商品秒杀功能页面流程

    Redis实现商品秒杀功能页面流程

    这篇文章主要介绍了Redis实现商品秒杀功能的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • Java实现常用的三种加密算法详解

    Java实现常用的三种加密算法详解

    编程中常见的加密算法有以下几种:信息摘要算法、对称加密算法以及非对称加密算法。本文将利用Java实现这几种常见的加密算法,需要的可以参考一下
    2022-03-03
  • SpringBoot之logback-spring.xml不生效的解决方法

    SpringBoot之logback-spring.xml不生效的解决方法

    这篇文章主要介绍了SpringBoot之logback-spring.xml不生效的解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • SpringBoot项目中同时操作多个数据库的实现方法

    SpringBoot项目中同时操作多个数据库的实现方法

    在实际项目开发中可能存在需要同时操作两个数据库的场景,本文主要介绍了SpringBoot项目中同时操作多个数据库的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • java代码实现空间切割

    java代码实现空间切割

    大家好,本篇文章主要讲的是java代码实现空间切割,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • java实习--每天打卡十道面试题!

    java实习--每天打卡十道面试题!

    临近秋招,备战暑期实习,祝大家每天进步亿点点!本篇文章准备了十道java的常用面试题,希望能够给大家提供帮助,最后祝大家面试成功,进入自己心仪的大厂
    2021-06-06
  • IDEA中thymeleaf语法没有提示的问题及解决

    IDEA中thymeleaf语法没有提示的问题及解决

    这篇文章主要介绍了IDEA中thymeleaf语法没有提示的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • spring boot security设置忽略地址不生效的解决

    spring boot security设置忽略地址不生效的解决

    这篇文章主要介绍了spring boot security设置忽略地址不生效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 浅谈JAVASE单例设计模式

    浅谈JAVASE单例设计模式

    整理笔记的时候发现以前写的单利设计模式的文章,贴出来给大家分享下!有需要的小伙伴可以来参考下
    2015-11-11
  • 后端java压缩图片超详细图文教程

    后端java压缩图片超详细图文教程

    这篇文章主要给大家介绍了关于后端java压缩图片的相关资料,片压缩是一种广泛采用的技术,它不仅能显著减小文件大小,释放更多存储空间,还能提升图片加载速度,避免长时间等待,需要的朋友可以参考下
    2024-04-04

最新评论