真会玩!竟然可以这样用IDEA通过数据库生成lombok版的POJO

本文介绍了如何使用IDEA内置的Database插件,结合Groovy脚本来自动化生成带有Lombok注解的POJO类。通过预先编写好的脚本,用户可以直接从数据库表结构快速创建实体类,极大地提高了开发效率。脚本支持生成继承基类的实体,同时也提醒了关于tinyint映射和枚举类型的注意事项。
摘要由CSDN通过智能技术生成

前言

最近写需求时需要新建许多新表,设计完表结构还要一一写成对应的 POJO,很麻烦,就 Google 了一下。网上相关资料不多,借鉴了一篇博客,并在其基础上进行了完善。

前置步骤

  1. 使用 IDEA 自带的插件 Database 连接数据库
  2. 在数据库的表上右键 Scripted Extensions -> Go to Scripts Directory
  3. 在打开的目录下放入脚本文件

源码

脚本用的 Groovy 语言,语法类似 Java,并能调用 Java 类库,自己修改也很方便。唯一的麻烦是执行入口在 Intellij 内部,想 debug 很麻烦。

PO 的路径一般都是统一的,如果要在新的模块中使用需要改一下路径。另外类注释需要替换成自己的。

还有一点需要注意的是枚举类型,脚本中将 tinyint 统一映射成了 Boolean 类型,如果要映射成自定义枚举类型,需要在实体类中自行修改。

用于生成带 Lombok 注释的实体类的脚本

Generate Lombok POJOs.groovy:

import com.intellij.database.model.DasTable
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil

import java.time.LocalDate

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

// 此处指定包路径,路径需要自行维护;
packageName = "com.xxx.xxx.entity;"
// 此处指定对应的类型映射,可按需修改,目前tinyint如果要映射到自定义枚举类型,只能手动修改
typeMapping = [
        (~/(?i)bigint/)                   : "Long",
        (~/(?i)int/)                      : "Integer",
        (~/(?i)tinyint/)                  : "Boolean",
        (~/(?i)float|double|decimal|real/): "BigDecimal",
        (~/(?i)time|datetime|timestamp/)  : "LocalDateTime",
        (~/(?i)date/)                     : "LocalDate",
        (~/(?i)/)                         : "String"
]

// 上面用到类和它的导入路径的之间的映射
importMap = [
        "BigDecimal" : "java.math.BigDecimal",
        "LocalDate" : "java.time.LocalDate",
        "LocalDateTime" : "java.time.LocalDateTime",
]

// 导入路径列表,下面引用的时候会去重,也可以直接声明成一个 HashSet
importList = []

// 弹出选择文件的对话框
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) + "PO"
    def fields = calcFields(table)
    new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "utf-8")).withPrintWriter {
    out -> generate(out, className, fields, table) }
}

// 从这里开始,拼实体类的具体逻辑代码
def generate(out
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值