• IDEA连接DB2数据库自动生成Entity实体类(SpringBoot + Spring JPA + Lombok + DB2)


    一。简介

    本篇博客主要介绍如何使用IDEA连接数据库,并且自动生成与table对应的实体类,省时省力。
    项目环境:SpringBoot + Spring JPA + Lombok + DB2

    二。操作流程

    1.连接DB2数据库,打开IDEA,找到最右侧的Database,创建一个新的DB2的连接:
    在这里插入图片描述
    2.注意这里要选Type4和IBM Db2:
    在这里插入图片描述
    3.db信息填完之后再点击Schemas,选择你需要连接的数据库:
    在这里插入图片描述

    4.这个时候你就能在IDEA中看到数据库的详细信息了,如果加载慢,尝试多手动点击刷新按钮即可:
    在这里插入图片描述
    5.选中任意table点击鼠标右键,Scripted Extensions --> GoTo Scripts Directory,找到Generate POJOs.groovy文件,这个是IDEA生成Entity的初始脚本模板:
    在这里插入图片描述
    在这里插入图片描述
    6.往往IDEA生成的初始模板不能满足我们的需求,所以我们可以复制Generate POJOs.groovy并重命名为Generate POJOs-new.groovy,下面是我自己写的groovy脚本:

    import com.intellij.database.model.DasTable
    import com.intellij.database.util.Case
    import com.intellij.database.util.DasUtil
    
    /*
     * Available context bindings:
     *   SELECTION   Iterable
     *   PROJECT     project
     *   FILES       files helper
     */
    //1.这里更改成你想要的包名
    packageName = "package com.example.demo;"
    //2.这里是DB2的类型typeMapping,自行变换成自己需要的
    typeMapping = [
            (~/(?i)int/)                      : "Integer",
            (~/(?i)float|double|decimal|real/): "BigDecimal",
            (~/(?i)datetime|timestamp/)       : "LocalDateTime",
            (~/(?i)date/)                     : "LocalDate",
            (~/(?i)time/)                     : "LocalTime",
            (~/(?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)
        new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields, table) }
    }
    
    def generate(out, className, fields, table) {
        //3.增加你需要导入的包或者添加的注解
        out.println "package $packageName"
        out.println ""
        out.println "import lombok.AllArgsConstructor;"
        out.println "import lombok.Data;"
        out.println "import lombok.NoArgsConstructor;"
        out.println "import lombok.experimental.SuperBuilder;"
        out.println "import javax.persistence.*;"
        out.println "import java.io.Serializable;"
        out.println "import java.math.BigDecimal;"
        out.println "import java.time.LocalDate;"
        out.println "import java.time.LocalDateTime;"
        out.println ""
        out.println "@Data"
        out.println "@SuperBuilder"
        out.println "@NoArgsConstructor"
        out.println "@AllArgsConstructor"
        out.println "@Entity"
        out.println "@Table(name = \"${table.getName()}\", schema = \"FOS\")"
        out.println "public class $className implements Serializable{"
        out.println ""
        fields.each() {
            if (it.annos != "") out.println "  ${it.annos}"
            //4.增加@Column注解
            out.println "  @Column(name= = \"${it.filed}\")"
            out.println "  private ${it.type} ${it.name};"
            out.println ""
        }
        out.println ""
        //5.因为使用Lombok插件,注释Getter和Setter方法
    //    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,
                               //6.增加filed属性,给@Column获取table中的属性名
                               filed: col.getName(),
                               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]
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98

    三。生成Entity示例

    注意,生成的Entity不能自动识别到table中的主键,所以需要手动修改并添加@Id注解

    在这里插入图片描述

  • 相关阅读:
    javaWeb监听器Listener(三)定时清理session
    (五)JPA - 原生SQL实现增删改查
    Educational Codeforces Round 133 (Rated for Div. 2)
    echarts环图配置
    spring actuator未授权之heapdump自动化利用【JDumpSpider】
    【大数据 - Doris 实践】数据表的基本使用(五):ROLLUP
    【Java】21天学习挑战赛
    SwiftUI&ArkUI-曲线动画Path和路径动画motionPath
    Jenkins - Copy Artifact 插件 Build 之间数据共享传递
    win7系统修改磁盘提示参数错误的解决办法
  • 原文地址:https://blog.csdn.net/weixin_44009447/article/details/127794360