如何基于Jetbrains IDEA DataBase从数据库表中生成对应的Java Bean

news2024/9/29 5:28:26

  在日常的项目开发过程中,大部分人可能都会遇到过想从表自动生成带有注释的Java Bean,在Jetbrains IDEA中通过DataBase工具也是可以生成的。Jetbrains IDEA的Database借助一个名称为Generate POJOs.groovy的groovy模板文件,可以帮我们做代码生成工作,但是原始的Generate POJOs.groovy文件生成的Java Bean是没有类注释和字段注释的,为了生成带有类注释和字段注释的Java Bean,我们需要对该文件做如下调整,具体内容如下:

import com.google.common.base.CaseFormat
import com.intellij.database.model.DasObject
import com.intellij.database.model.DasTable
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil

/**
 * modification of origin script :
 * - add comment support (if you are non native English user, it is very important)
 * - make names with underscore better: such as `t_my_table` -> `tMyTable`
 */

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

//packageName = "com.sample;"
packageName = "com.qwfys.sample.daopai.data.entity;"
//typeMapping = [
//        (~/(?i)int/)                      : "long",
//        (~/(?i)float|double|decimal|real/): "double",
//        (~/(?i)datetime|timestamp/)       : "java.sql.Timestamp",
//        (~/(?i)date/)                     : "java.sql.Date",
//        (~/(?i)time/)                     : "java.sql.Time",
//        (~/(?i)/)                         : "String"
//]

typeMapping = [
        (~/(?i)bigint/)                   : "BigInteger",
        (~/(?i)tinyint/)                  : "Byte",
        (~/(?i)int/)                      : "Integer",
        //(~/(?i)float|double|decimal|real/): "double",
        (~/(?i)float|double|decimal|real/): "BigDecimal",
        //  (~/(?i)datetime|timestamp/)       : "java.sql.Timestamp",
        (~/(?i)datetime|timestamp/)       : "LocalDateTime",
        //  (~/(?i)date/)                     : "java.sql.Date",
        (~/(?i)date/)                     : "LocalDate",
        (~/(?i)time/)                     : "LocalTime",
        (~/(?i)/)                         : "String"
]
FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
//    assert SELECTION instanceof Iterable<DasObject> //no use
    SELECTION.filter { it instanceof DasTable && it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) }
}

def generate(DasObject table, dir) {
    def tableComment = getTableComment(table)
    if (tableComment == null || "".equals(tableComment)) {
        tableComment = ""
    }else{
        tableComment = """
/**
 * $tableComment
 */"""
    }
    def className = javaName(table.name, true)
    def fields = calcFields(table)
    new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, tableComment, fields) }
}

def generate(out, className, tableComment, fields) {
    out.println "package $packageName"
    out.println ""
    out.println "import lombok.Data;"
    out.println ""
//    out.println ""
    if (tableComment != "") out.println "  ${tableComment}"
    out.println "@Data"
    out.println "public class $className {"
//    out.println ""
    fields.each() {
        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 getTableComment(table) {
    return table.getComment();
}

def calcFields(DasObject table) {
    DasUtil.getColumns(table).reduce([]) { fields, col ->
        def spec = Case.LOWER.apply(col.dataType.specification)
        def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
        fields += [[
                           name : javaName(col.name, false),
                           type : typeStr,
                           annos: col.comment ? """
    /**
     * $col.comment
     */""" : ""
       ]]
    }
}

static String javaName(String str, boolean capitalize) {
    def s = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, str);
    capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

//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]
//}

将该文件个性为上述内容以后,就以完成由表到Java Bean的生成工作。

  接下来,我们通过一个具体的例子给大家介绍一下。

  • 步骤1:基于如下脚本创建一张表
DROP TABLE IF EXISTS `region`;
CREATE TABLE `region` (
    `id`             bigint       NOT NULL AUTO_INCREMENT COMMENT '标识符',
    `code`           varchar(128) NOT NULL COMMENT '编码',
    `parent_code`    varchar(128) NOT NULL COMMENT '上级编码',
    `name`           varchar(128) NOT NULL COMMENT '名称',
    `full_name`      varchar(128) NOT NULL COMMENT '全称',
    `level`          int          NOT NULL COMMENT '层级',
    `province`       varchar(128) NOT NULL COMMENT '省份',
    `city`           varchar(128) NOT NULL COMMENT '地市',
    `district`       varchar(128) NOT NULL COMMENT '区县',
    `township`       varchar(128) NOT NULL COMMENT '乡镇',
    `created_by`     bigint       NOT NULL COMMENT '添加者',
    `created_time`   datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
    `updated_by`     bigint       NOT NULL COMMENT '添加者',
    `updated_time`   datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    `removed_status` tinyint      NOT NULL DEFAULT '0' COMMENT '移除状态,0-未移除,1-已移除',
    `version`        int          NOT NULL DEFAULT '1' COMMENT '版本号',
    PRIMARY KEY (`id`)
) COMMENT ='行政区基本信息';
  • 步骤2:生成Java Bean

通过执行如下操作即可生成我们要的Java Bean:DataBase --> 大家自己的数据库 --> tabses --> 单击鼠标右键 --> Tools --> Scripted Extensions --> Generate POJO.groovy,在此过程中系统会弹出一个目录选择对话框要求我们选择生成的Java Bean存放的目录,操作完成以后,就会我们指定的目录下生成了一个对应的Java Bean,具体如下:

package com.qwfys.sample.daopai.data.entity;

import lombok.Data;

import java.math.BigInteger;
import java.time.LocalDateTime;


/**
 * 行政区基本信息
 */
@Data
public class Region {
  
    /**
     * 标识符
     */
  private BigInteger id;
  
    /**
     * 编码
     */
  private String code;
  
    /**
     * 上级编码
     */
  private String parentCode;
  
    /**
     * 名称
     */
  private String name;
  
    /**
     * 全称
     */
  private String fullName;
  
    /**
     * 层级
     */
  private Integer level;
  
    /**
     * 省份
     */
  private String province;
  
    /**
     * 地市
     */
  private String city;
  
    /**
     * 区县
     */
  private String district;
  
    /**
     * 乡镇
     */
  private String township;
  
    /**
     * 添加者
     */
  private BigInteger createdBy;
  
    /**
     * 添加时间
     */
  private LocalDateTime createdTime;
  
    /**
     * 添加者
     */
  private BigInteger updatedBy;
  
    /**
     * 更新时间
     */
  private LocalDateTime updatedTime;
  
    /**
     * 移除状态,0-未移除,1-已移除
     */
  private Byte removedStatus;
  
    /**
     * 版本号
     */
  private Integer version;

}

  相对来说,还是蛮方便的。基于同样的道理,如果大家在些基础上编写生成数据访问层的代码,也是可以实现的,如果大家有兴趣可以尝试一下。

  Groovy文件中引入的包com.intellij.database.*涉及的几个类文件放在了目录${Jetbrains_ IDEA_HOME}/plugin/DatabaseTools/lib中的database-plugin.jar中,将该文件添加到项目类路径下,借助Jetbrains IDEA的反编译功能就可能看到这些类的大致结构了。

在这里插入图片描述
DataBase 插件相关组件类图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/96746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python工程师Java之路(t)SpringBoot部署步骤 java -jar

文章目录步骤1、开发环境2、新建工程3、新建controller4、开发环境试运行和测试5、打包运行命令补充步骤 1、开发环境 WIN10IDEA2021Maven3.6.3JDK1.8 2、新建工程 选择Spring和Java版本 添加依赖 3、新建controller package com.example.demo.controller;import org.spr…

macOS Ventura 13.1 (22C65) Boot ISO 原版可引导镜像

本站下载的 macOS Ventura 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。 2022 年 12 月 13 日&#xff0c;macOS Ventura 13.1 推出了“无边记”&#x…

基于python的PatchMatchStereo立体匹配算法实现

文章目录前言一、PatchMatchStereo是什么&#xff1f;1.随机初始化2.迭代传播2.1空间传播2.2视图传播2.3帧间传播2.4平面细化二、PatchMatchStereo立体匹配算法实现前言 PatchMatchStereo是Michael Bleyer等在2011年发表于British Machine Vision Conference&#xff08;BMVC&a…

机器学习 鸢尾花数据集划分 训练集和测试集

目录 一&#xff1a;加载数据 二&#xff1a;数据集整理 三&#xff1a;数据集划分 一&#xff1a;加载数据 加载数据&#xff0c;并创建一个DataFrame&#xff0c;便于数据分析 from sklearn.datasets import load_iris import pandas as pd import numpy as np from skle…

大数据:计算学生成绩

文章目录一、提出任务二、任务进行&#xff08;一&#xff09;准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录&#xff08;二&#xff09;实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建成绩映射器类5、创建成绩驱动器类6、启动成绩驱动器类…

【JavaSE】类和对象(三)——内部类

目录 1. 何为内部类 2. 内部类的分类 2.1 静态内部类 2.1.1 如何实例化静态内部类的对象&#xff1f; 2.1.2 外部类与静态内部类如何相互访问&#xff1f; 2.2 非静态内部类/实例内部类 2.2.1 非静态内部类不能定义静态的成员变量以及方法 2.2.2 非静态内部类的实例化 2.2.…

三层-生成树-ospf-速端口思科练习实验

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;疫情之下&#xff0c;你我素未谋面&#xff0c;但你一定要平平安安&#xff0c;一 起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;…

Spark-SaprkStreaming(概述、架构、原理、DStream转换、案例)

文章目录SparkStreaming概述特点架构原理DStream和RDD的区别DAG如何读取数据(※)WordCount 案例实操代码解析RDD 队列用法及说明案例实操自定义数据源Kafka 数据源DStream 转换无状态转化操作Transformjoin有状态转化操作UpdateStateByKeyWindowOperationsDStream 输出优雅关闭…

pip命令安装torchnet包,超简单!

pip命令安装torchnet包&#xff0c;超简单&#xff01; torchnet是torch的框架&#xff0c;它提供了一组抽象&#xff0c;旨在鼓励代码重用以及鼓励模块化编程。 目前&#xff0c;torchnet提供了四组重要的类&#xff1a; Dataset&#xff1a;以各种方式处理和预处理数据。 …

Typora入门教程

文章目录Typora入门教程1 简要介绍2 下载安装包3 常用操作3.1 标题3.2 加粗3.3 斜体3.4 高亮3.5 分割线3.6 图片3.7 链接3.8 引用3.9 列表3.10 目录3.11 表格3.12 代码块3.13 行内代码3.14 按键效果4 自定义快捷键5 Typora PicGo 阿里云OSS搭建个人笔记5.1 注意事项5.2 准备工…

Hibernate学习总结

文章目录一、图解运行过程二、核心代码三、session方法2、session缓存3、save&#xff08;&#xff09;与persist&#xff08;&#xff09;4、get()5、update()6、delete()7、evict()8、doWork()&#xff0c;可获得connection对象四、hibernate.cfg.xml(使用数据库连接池)五、*…

java项目-第176期ssm个人交友网站系统-java毕业设计

java项目-第176期ssm个人交友网站系统-java毕业设计 【源码请到下载专栏下载】 《个人交友网站》 该项目分为2个角色&#xff0c;管理员、用户角色。 用户可以浏览前台,包含功能有&#xff1a; 首页、交友信息、线下活动、系统公告、论坛信息 管理员进行后台登录&#xff0c;包…

【KNN分类】基于matlab模拟退火优化KNN、蝗虫算法优化KNN数据分类【含Matlab源码 2275期】

⛄一、1KNN算法思想 K近邻算法&#xff08;KNN,K nearest neighbor algorithm&#xff09;是机器学习中一种基本的分类与回归方法&#xff0c;其主要原理是通过对不同测试样本之间的距离进行量测&#xff0c;而后寻找最为相近的K个样本来进行分类&#xff0c;具有简单、直观、…

【LeetCode题目详解】(三)21.合并两个有序链表、141.环形链表、142.环形链表Ⅱ

目录 一、力扣第21题&#xff1a;合并两个有序链表 解法思路 代码一 代码二 代码三 二、力扣第141题&#xff1a;环形链表 1.快慢指针法 2.证明快慢指针是可行的 三、力扣第142题&#xff1a;环形链表Ⅱ 1.解题思路 2.代码 总结 一、力扣第21题&#xff1a;合并两个…

selenium自动化测试

文章目录1.什么是自动化测试2.UI自动化测试3, webdriver的原理元素的定位定位操作示例操作测试对象添加等待固定等待智能等待打印信息浏览器的操作浏览器最大化设置浏览器宽、高操作浏览器的前进、后退控制浏览器滚动条键盘事件键盘按键用法键盘组合键用法鼠标事件ActionChains…

接口测试(七)—— 参数化、数据库操作封装、接口自动化框架

目录 一、接口自动化测试框架 1、目录结构 二、封装iHRM登录 1、普通方式实现 2、登录接口对象层 3、登录接口测试用例层 4、封装断言方法 三、参数化 1、回顾UnitTest参数化 1.1 原始案例 1.2 参数化实现 1.3 从json文件读取 2、登录接口参数化 2.1 组织数据文…

ArcGIS:如何进行离散点数据插值分析(IDW)、栅格数据的重分类、栅格计算器的简单使用、缓冲区分析、掩膜?

目录 01 说明 02 实验目的及要求 03 实验设备及软件平台 04 实验内容与步骤 4.1 反距离权重插值分析 4.2 多栅格局域运算 4.3 按表格显示分区统计 4.4 重分类 4.5 邻域运算 4.6 矢量数据的裁剪 4.7 缓冲区分析及栅格数据提取分析 05 思考及讨论 01 说明 由于这次的作业是从word…

jsp+ssm计算机毕业设计宠物寻回系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

2.两数相加

正在建设中 传送门&#xff1a; https://leetcode.cn/problems/add-two-numbers/ 题目描述 给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式存储的&#xff0c;并且每个节点只能存储一位数字。 请你将两个数相加&#xff0c;并以相同形…

git 进阶系列教程-------git使用流程

GIT使用流程 前言 初衷 git是一门很容易入门的项目管理工具&#xff0c;但是它是一门很难精通的技术。 git pull/git add ./git commit -m "message"/git push/......知道以上几个命令&#xff0c;或许再多一点&#xff0c;也许就能说&#xff1a;‘我会git’了。…