Intellij IDEA 通过数据库表生成带注解的Java实体类(lombok版)

前言:因为今天在写实体类的时候,发现表中的字段太多,而且又要加注解怕写错漏写,现在市面上也有许多插件,但是有些达不到代码简洁,需要修改。后来还是选择了采用groovy写了一个脚本编写,本来idea他也支持自动生成实体类的功能,改造了一下。

前期准备

1、需要引入lombok依赖,这个东西应该大家都不陌生了

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

2、需要引入knife4j这个依赖,其实他就是一个生成文档接口的。当然你可以选择不用,直接删掉脚本里面的就好了,如果要用的话就添加依赖。
当然还需要一点配置不配置的话可能不生效但是不影响代码运行,参考knife4j官方文档配置

<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi2-spring-boot-starter</artifactId><version>4.3.0</version>
</dependency>

3、我们要使用IDEA连接数据库,我使用的是MySQL(这里按照自己的数据库去选择)
选择连接的数据库类型

配置数据库信息,连接成功

配置连接信息

选择自己的数据库是哪一个,有些时候他会选中,如果没有选中的话可以做这一步操作

选择数据库

准备完了,开干

1、点击表名,右键。Scripted Extensions => Generate POJOs.groovy【这里有两种方式】
我们可以通过点击:Go To Scripts Directory 跳转到脚本所在的目录位置

1、就是用原来的这个文件,这里面的脚本内容需要改变一下,在后面给出代码
2、自己去创建一个文件,也要放在同一个目录下面,就像我图里面的test这个文件夹,但是生成的时候需要选择自己的对应的这个脚本

选择那个脚本

2、选择要把文件生成的位置

文件的位置
3、生成的效果【这个是更改了脚本之后的示例】,这边使用的都是lombok注解,别无他说这样写代码简洁还省事。但是如果要做其他操作就宁说了

在这里插入图片描述

Generate POJOs.groovy 脚本【可自定义,语法简单,百度一下就能看懂,也可以直接使用我这个】:

import com.intellij.database.model.DasTable
import com.intellij.database.model.ObjectKind
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 = ""
typeMapping = [(~/(?i)bigint/)                          : "Long",(~/(?i)int|tinyint|smallint|mediumint/)  : "Integer",(~/(?i)bool|bit/)                        : "Boolean",(~/(?i)float|double|decimal|real/)       : "Double",(~/(?i)datetime|timestamp|date|time/)    : "Date",(~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",(~/(?i)/)                                : "String"
]FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->SELECTION.filter { it instanceof DasTable && it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) }
}def generate(table, dir) {def className = javaName(table.getName(), true)def fields = calcFields(table)packageName = getPackageName(dir)// 使用这个设置我们输出的字符编码PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "UTF-8"))printWriter.withPrintWriter {out -> generate(out, className, fields,table)}
}// 获取包所在文件夹路径
def getPackageName(dir) {return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
}def generate(out, className, fields,table) {out.println "package $packageName"out.println ""out.println "import java.io.Serializable;"out.println "import lombok.Data;"out.println "import lombok.NoArgsConstructor;"out.println "import lombok.AllArgsConstructor;"out.println "import io.swagger.annotations.ApiModelProperty;"Set types = new HashSet()// 控制所需类型导包fields.each() {types.add(it.type)}if (types.contains("Date")) {// 按照自己的序列化包导入,我采用的是jacksonout.println "import com.fasterxml.jackson.annotation.JsonFormat;"out.println "import java.util.Date;"}if (types.contains("InputStream")) {out.println "import java.io.InputStream;"}out.println ""out.println "/**\n" +" * @description $className \n" +" * @author  muguang\n" +" * @Date " + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + "\n"+" */"out.println ""out.println "@Data"out.println "@NoArgsConstructor"out.println "@AllArgsConstructor"
//    out.println "@Table ( name =\""+table.getName() +"\" )" 这里是指定实体类对应的表名out.println "public class $className  implements Serializable {"out.println ""out.println genSerialID()fields.each() {out.println ""// 输出注释if (isNotEmpty(it.commoent)) {out.println "\t/**"out.println "\t * ${it.commoent.toString()}"out.println "\t */"out.println "\t@ApiModelProperty(value = \"${it.commoent}\")"}// 如果是日期类型,我们进行格式化if (typeIsDate(it.type)){out.println "\t@JsonFormat(pattern = \"yyyy-MM-dd\",timezone = \"GMT+8\")"}// 输出成员变量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() }.valuedef comm =[colName : col.getName(),name :  javaName(col.getName(), false),type : typeStr,commoent: col.getComment(),annos: ""]fields += [comm]}
}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 typeIsDate(type){return type != null && type.toString().trim().equalsIgnoreCase("date")
}static String changeStyle(String str, boolean toCamel){if(!str || str.size() <= 1)return strif(toCamel){String r = str.toLowerCase().split('_').collect{cc -> Case.LOWER.apply(cc).capitalize()}.join('')return r[0].toLowerCase() + r[1..-1]}else{str = str[0].toLowerCase() + str[1..-1]return str.collect{cc -> ((char)cc).isUpperCase() ? '_' + cc.toLowerCase() : cc}.join('')}
}static String genSerialID()
{return "\tprivate static final long serialVersionUID =  "+Math.abs(new Random().nextLong())+"L;"
}

到这里就结束了,我也是因为用到了就研究了一下。至于mapper、service、controller,我相信小伙伴们也不需要生成,对于你们来说都是洒洒水了。【当然也有很多插件可以生成】

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

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

相关文章

gitlab使用小结

GitLab 是一个基于 Git 的代码托管平台&#xff0c;提供了丰富的功能来管理代码仓库、CI/CD、项目管理等。以下是一些常用的 GitLab 命令和示例&#xff0c;帮助你更好地使用 GitLab。 1、 克隆仓库 克隆一个远程仓库到本地&#xff1a; git clone gitgitlab.example.com:us…

深圳mes制造系统的主要功能

深圳MES系统的主要功能包括以下几个方面&#xff1a; 生产计划管理&#xff1a;MES系统可以帮助企业制定生产计划&#xff0c;包括订单管理、生产排程、生产任务分配等&#xff0c;实现生产资源的合理配置和生产计划的优化。 生产过程控制&#xff1a;MES系统可以监控生产过程中…

SpringBoot技术栈的网上超市开发实践

2 系统开发技术 这部分内容主要介绍本系统使用的技术&#xff0c;包括使用的工具&#xff0c;编程的语言等内容。 2.1 Java语言 Java语言自公元1995年至今&#xff0c;已经超过25年了&#xff0c;依然在软件开发上面有很大的市场占有率。当年Sun公司发明Java就是为了发展一门跨…

局域网远程命令重启电脑

只要知道远程服务器的管理员密码和IP地址&#xff0c;在局域网中的任意一台机器上打开“命令提示符”窗口&#xff0c;运行以下命令&#xff1a; 1、获取远程服务器的管理员权限 net use IP地址 "管理员密码" /user:administrator 2、使用shutdown命令远程重启服务器…

32中的外部中断

一、理解中断 关于32的中断 中断就是给cpu一个信号&#xff0c;cpu收到这个对应的信号再进行指挥 最常用的就是按键 key1按下是咩意思key2呢这样 中断信号线CPU要和对应的元器件连接 二、中断代码 代码编写 所有的0脚对应中断寄存器0&#xff0c;以此类推 引脚为n …

Unity :单例模式 + MonoBehaviour 是什么体验?

单例模式 与 MonoBehaviour的冲突点 单例模式 MonoBehaviour 保持单例的快速解决方案 就是自己创建一个空对象&#xff0c;然后把脚本挂在上去就行了&#xff0c;之后你就别自己挂载该脚本就行了 一般写法 public class AgentMoNo : MonoBehaviour {private static AgentM…

Python编码系列—Python观察者模式:实现事件驱动架构的利器

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

ComfyUI新版本提升效率小技巧(建议收藏)

原文链接&#xff1a;建议收藏&#xff01;ComfyUI提升效率的小技巧&#xff0c;肯定有你不知道的 (chinaz.com) 本篇带来ComfyUI非常实用的9个小技巧&#xff0c;可以提升我们的ComfyUI工作效率&#xff0c;建议大家收藏起来哈 新版中文搜节点 点击设置 comfy→搜索框框架…

PHP判断微信或QQ访问

PHP判断微信或QQ访问 若是微信或者QQ打开&#xff0c;提示图会覆盖网页&#xff0c;但网页功能仍在运行&#xff01; <meta name"viewport" content"initial-scale1, maximum-scale1, user-scalableno, widthdevice-width"><style> .top-gui…

OpenCV目标检测(1)模板匹配函数matchTemplate()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将一个模板与重叠的图像区域进行比较。 该函数在图像中滑动&#xff0c;使用指定的方法将大小为 w h w \times h wh的重叠块与模板 templ 进行…

基于python+django+vue的旅游景点数据分析系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

【Canvas与诗词】铁马冰河入梦来

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>金红圈铁马冰河入梦来</title><style type"text/css&q…

【linux经典工具】strace-就十分钟你也能成为性能调优专家

strace 是什么 strace是一款功能强大的 Linux 进程监控和诊断工具。主要作用就是&#xff1a;用于调试程序、解决问题、拦截和记录系统调用以及跟踪正在运行的进程。它能输出了程序如何与系统交互的过程&#xff0c;尤其是在无法获取源代码的情况下&#xff08;那些开源工具、…

召回04 离散特征的处理

推荐系统会将一个id映射成一个向量 Qne-Hot编码 Embedding(嵌入)&#xff1a; 把每个类别映射成一个低维的稠密向量

k均值算法 聚类算法 k-means

首先我们导入科学计算的库 import numpy as np import matplotlib.pyplot as plt直接我们生成一组数据&#xff0c;为了保证每次的数据是一致的&#xff0c;我们设置一个随机种子。 np.random.seed(0) Xnp.random.rand(100,2) print(X) 结果 然后我们就要开始写K-means算…

光控资本:红利税是什么?一万股票的红利税是多少?

盈利税&#xff0c;即股息盈利税&#xff0c;是投资者卖出分红的股票时&#xff0c;需求扣除的税&#xff0c;一般来说&#xff0c;投资者卖出分红股票之后&#xff0c;不会立马扣税&#xff0c;在投资者卖出股票的第2个生意日至31个工作日之间进行补缴。一万股票的盈利税盈利税…

VMware Workstation 17.5安装教程

目录 软件介绍 1、下载安装包 2、安装虚拟机 3、卸载虚拟机 软件介绍 VMware&#xff08;虚拟机&#xff09;是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统&#xff0c;通过它可在一台电脑上同时运行更多的Microsoft Windows、Linux…

LibJPEG库使用_通过LibJPEG将RGB数据保存为JPG图片存储到磁盘

一、前言 LibJPEG库是一个广泛使用的开源C库&#xff0c;用于处理JPEG图像的压缩和解压缩。该库由独立JPEG小组&#xff08;Independent JPEG Group, IJG&#xff09;开发&#xff0c;提供了功能强大的API&#xff0c;用于创建和读取JPEG文件。LibJPEG库支持JPEG的所有常见功能…

哈希——字符串哈希

回顾/本期梗概 上期我们学习了图论基础&#xff08;空降链接&#xff09;&#xff0c;本期我们将学习哈希中的字符串哈希。 1、什么是哈希 哈希算法是&#xff1a;通过哈希函数讲字符串、较大的数等转换为能够用变量表示的或者是直接能作为数组下标的数&#xff0c;通过哈希算法…

基于MT79815G CPE 板子上挂usb3.0的5G 模块,WIFI能跑多少速度呢

关于MT79815G CPE 板子上挂usb3.0的5G 模块&#xff0c;WIFI能跑多少速度的问题&#xff0c;我们以启明智显 ZX7981P智能无线接入型路由器&#xff08;CPE&#xff09;挂广合通5G模组为例说明&#xff1a; 一般来说&#xff0c;用 ZX7981P&#xff0c;通过软加速&#xff0c;U…