idea默认代码生成脚本修改

news/2024/4/28 7:04:12/文章来源:https://blog.csdn.net/qq_40488121/article/details/137120475

修改了下idea自带的代码生成脚本,增加了脚本代码的注释,生成了controller,service,impl,mapper,里面都是空的,具体可以根据自己的代码习惯增加
代码生成脚本的使用可以看下使用 idea 生成实体类代码

修改后的脚本代码

import com.intellij.database.model.DasTable
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil
import com.intellij.database.model.ObjectKind
import java.io.*
import java.text.SimpleDateFormat/** Available context bindings:*   SELECTION   Iterable<DasObject>*   PROJECT     project*   FILES       files helper*/
/*** 对应类型转换配置* 数据库类型:java类型*/
typeMapping = [(~/(?i)tinyint|smallint|mediumint/)  : "Integer",(~/(?i)int/)                         : "Long",(~/(?i)bool|bit/)                    : "Boolean",(~/(?i)float|double|decimal|real/)   : "Double",(~/(?i)datetime|timestamp|date|time/): "Date",(~/(?i)/)                            : "String"
]/*** 程序入口*/
FILES.chooseDirectoryAndSave("选择文件夹", "选择controller、domain,service,mapper的上级目录,生成的代码将会保存到对应文件夹。") {dir -> SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) }
}/*** 代码生成* @param table 表的对象* @param dir 选择的文件夹路径*/
def generate(table, dir) {String domainDir = "${dir}/domain"String domainClassName = javaName(table.getName(), true)String domainPackageName = getPackageName(domainDir)// 生成实体类// 这个utf8是解决乱码new File(domainDir, "${domainClassName}.java").withPrintWriter("UTF-8") {out -> generateDomain(out, domainClassName, table, domainPackageName)}// 生成mapperString mapperDir = "${dir}/mapper"String mapperClassName = "${domainClassName}Mapper"String mapperPackageName = getPackageName(mapperDir)new File(mapperDir, "${mapperClassName}.java").withPrintWriter("UTF-8") {out ->generateMapper(out, mapperClassName, mapperPackageName,domainClassName, domainPackageName)}// 生成serviceString serviceDir = "${dir}/service"String serviceClassName = "${domainClassName}Service"String servicePackageName = getPackageName(serviceDir)new File(serviceDir, "${serviceClassName}.java").withPrintWriter("UTF-8") { out -> generateService(out, serviceClassName, servicePackageName) }// 生成serviceImplString servicImplDir = "${serviceDir}/impl"String serviceImplClassName = "${serviceClassName}Impl"String serviceImplPackageName = getPackageName(servicImplDir)new File(servicImplDir, "${serviceImplClassName}.java").withPrintWriter("UTF-8") {out ->generateServiceImpl(out, serviceImplClassName, serviceImplPackageName,serviceClassName, servicePackageName, mapperPackageName,mapperClassName, domainClassName, domainPackageName)}// 生成ControllerString controllerDir = "${dir}/controller"String controllerClassName = "${domainClassName}Controller"String controllerPackageName = getPackageName(controllerDir)new File(controllerDir, "${controllerClassName}.java").withPrintWriter("UTF-8") {out ->generateController(out, controllerClassName, controllerPackageName,serviceImplClassName, serviceImplPackageName, serviceClassName,servicePackageName, domainClassName, domainPackageName)}}/*** 文件夹路径转换为包名* @param dir 文件夹路径* @return 包名*/
static String getPackageName(dir) {return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "")
}
/*** 生成实体类* @param out 输出流* @param className 类名* @param table 数据库表对象* @param dir 文件夹路径*/
def generateDomain(out, className, table, domainPackageName) {def fields = calcFields(table)String tableName = table.getName();def comment = table.getComment();out.println "package $domainPackageName;"out.println ""out.println "import com.baomidou.mybatisplus.annotation.IdType;"out.println "import com.baomidou.mybatisplus.annotation.TableField;"out.println "import com.baomidou.mybatisplus.annotation.TableId;"out.println "import com.baomidou.mybatisplus.annotation.TableName;"out.println "import java.util.Date;"out.println "import com.fasterxml.jackson.annotation.JsonFormat;"out.println "import java.io.Serializable;"out.println "import lombok.Data;"out.println "import lombok.AllArgsConstructor;"out.println "import lombok.Builder;"out.println "import lombok.NoArgsConstructor;"out.println ""out.println "/**"out.println "* $comment"out.println "* @author zjx"out.println "*/"out.println "@Data"out.println "@TableName(\"$tableName\")"out.println "@NoArgsConstructor"out.println "@AllArgsConstructor"out.println "@Builder"out.println "public class $className implements Serializable{"out.println ""out.println "\t@TableField(exist = false)"out.println genSerialID()out.println ""fields.each() {// 输出注释if (isNotEmpty(it.commoent)) {out.println "\t/**"out.println "\t * ${it.commoent}"out.println "\t */"}if (it.type == "Date") {out.println "\t@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")"}if (it.annos != "") out.println "  ${it.annos}"out.println "\tprivate ${it.type} ${it.name};"}out.println ""out.println "}"
}/*** 生成mapper* @param out 输出流* @param mapperClassName mapper类名* @param mapperPackageName mapper包名* @param domainClassName 实体类类名* @param domainPackageName 实体类包名*/
void generateMapper(out, mapperClassName, mapperPackageName, domainClassName,domainPackageName) {out.println "package $mapperPackageName;"out.println ""out.println "import $domainPackageName.$domainClassName;"out.println "import com.baomidou.mybatisplus.core.mapper.BaseMapper;"out.println "import org.apache.ibatis.annotations.Mapper;"out.println ""out.println "/**"out.println "* @author zjx"out.println "*/"out.println "@Mapper"out.println "public interface $mapperClassName extends BaseMapper<$domainClassName>{"out.println ""out.println "}"
}
/*** 生成service* @param out 输出流* @param serviceClassName service类名* @param servicePackageName service包名*/
void generateService(out, serviceClassName, servicePackageName) {out.println "package $servicePackageName;"out.println ""out.println "/**"out.println "* @author zjx"out.println "*/"out.println "public interface $serviceClassName {"out.println ""out.println "}"
}
/*** 生成ServiceImpl* @param out 输出流* @param serviceImplClassName serviceImpl类名* @param serviceImplPackageName serviceImpl包名* @param serviceClassName service类名* @param service包名* @param mapperPackageName mapper类名* @param mapperClassName mapper包名* @param domainClassName 实体类类名* @param domainPackageName 实体类包名*/
void generateServiceImpl(out, serviceImplClassName, serviceImplPackageName,serviceClassName, servicePackageName, mapperPackageName,mapperClassName, domainClassName, domainPackageName) {String lowerMapperClassName =mapperClassName.length() == 1 ? mapperClassName : mapperClassName[0].toLowerCase() + mapperClassName[1..-1];out.println "package $serviceImplPackageName;"out.println ""out.println "import $servicePackageName.$serviceClassName;"out.println "import $mapperPackageName.$mapperClassName;"out.println "import org.springframework.stereotype.Service;"out.println "import javax.annotation.Resource;"out.println ""out.println "/**"out.println "* @author zjx"out.println "*/"out.println "@Service"out.println "public class $serviceImplClassName implements $serviceClassName {"out.println "\t@Resource"out.println "\tprivate $mapperClassName $lowerMapperClassName;"out.println ""out.println "}"
}/**** 生成ServiceImpl* @param out 输出流* @param serviceImplClassName serviceImpl类名* @param serviceImplPackageName serviceImpl包名* @param serviceClassName service类名* @param service包名* @param controllerClassName controller类名* @param controllerPackageName controller包名* @param domainClassName 实体类类名* @param domainPackageName 实体类包名*/
void generateController(out, controllerClassName, controllerPackageName,serviceImplClassName, serviceImplPackageName, serviceClassName,servicePackageName, domainClassName, domainPackageName){String lowerServiceClassName =serviceClassName.length() == 1 ? serviceClassName : serviceClassName[0].toLowerCase() + serviceClassName[1..-1];String lowerDomainClassName =domainClassName.length() == 1 ? domainClassName : domainClassName[0].toLowerCase() + domainClassName[1..-1];out.println "package $serviceImplPackageName;"out.println ""out.println "import $servicePackageName.$serviceClassName;"out.println "import javax.annotation.Resource;"out.println "import org.springframework.web.bind.annotation.RestController;"out.println "import org.springframework.web.bind.annotation.RequestMapping;"out.println ""out.println "/**"out.println "* @author zjx"out.println "*/"out.println "@RestController"out.println "@RequestMapping(\"/${lowerDomainClassName}\")"out.println "public class $controllerClassName {"out.println "\t@Resource"out.println "\tprivate $serviceClassName $lowerServiceClassName;"out.println ""out.println "}"
}/*** 读取处理表的数据* @param table 表的对象* @return 表的数据*/
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   : ""]if ("主键".equals(col.getComment().toString()))comm.annos += "\t@TableId(type = IdType.AUTO)"fields += [comm]}
}/*** 表名转换为类名* @param tableName 表名* @param capitalize 是否将首字母转大写* @return 转换后的类名*/
String javaName(tableName, capitalize) {String s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(tableName).collect { Case.LOWER.apply(it).capitalize() }.join("").replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
}static def isNotEmpty(content) {return content != null && content.toString().trim().length() > 0
}/*** 生成serialVersionUID*/
static String genSerialID() {return "\tprivate static final long serialVersionUID =  " + Math.abs(new Random().nextLong()) + "L;"
}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win11蓝牙图标点击变灰,修复过程

问题发现 有一天突然心血来潮想着连接蓝牙音响放歌来听,才发现win11系统右下角菜单里的蓝牙开关有问题。 打开蓝牙设置,可以正常直接连上并播放声音,点击右下角菜单里的蓝牙开关按钮后,蓝牙设备也能正常断开,但是按钮直接变深灰色,无法再点击打开。 重启电脑,蓝牙开关显…

Parade Series - SVG Resource

iconfont https://www.iconfont.cn/?spma313x.search_index.i3.2.74e53a819tkkcG音符 <div class"form-group"><a href"Javascript:reload();" class"btn btn-icon btn-outline-light btn-block" style";"><svg t&q…

Docker命令及部署Java项目

文章目录 简介Docker镜像镜像列表查找镜像拉取镜像删除镜像镜像标签 Docker容器容器启动容器查看容器停止和重启后台模式和进入强制停止容器清理停止的容器容器错误日志容器别名及操作 Docker部署Java项目 简介 Docker是一种容器化技术&#xff0c;可以帮助开发者轻松打包应用…

学透Spring Boot — [二] Spring 和 Spring Boot的比较

欢迎关注我们的专栏 学透 Spring Boot 一、创建一个简单Web应用 本篇文章&#xff0c;我们将会比较 Spring 框架和 Spring Boot 的区别。 什么是 Spring? 也许你在项目中已经可以很熟练的使用 Spring 了&#xff0c;但是当被问到这个问题时&#xff0c;会不会犹豫一下&#…

SQLyog连接MySQL8.0+报错:错误码2058的解决方案

最近把mysql从5.7迁移到8.3.0发现连接不上 因为 MySQL 从 8.0 版本开始&#xff0c;新增了caching_sha2_password授权插件 技术博客 http://idea.coderyj.com/ 1.更换sqlyog 更新到13.1.3之后的版本 2.取消mysql8的加密授权机制 mysql> ALTER USER sqlyog% IDENTIFIED WIT…

Nginx【概述:网页服务器 并发能力强】【常见命令】【部署实战】【反向代理】

Nginx-概述 介绍下载和安装下载安装重点目录和文件如下 Nginx-命令常用命令1). 查看版本2). 检查配置文件3). 启动4). 停止5). 重新加载 环境变量配置 Nginx-应用配置文件结构部署静态资源介绍测试1). 将静态资源上传到 /usr/local/nginx/html 目录2). 启动nginx3). 访问4). 配…

栈和队列——c语言实现栈

本节复习栈和队列中栈的增删查改。 首先回顾一下栈的性质&#xff1a; 栈的存储数据的原则是“后入先出”&#xff0c; 先入的在栈底&#xff1b; 后入的在栈顶。&#xff0c;弹出数据时在栈顶弹出。 目录 准备文件 创建栈的结构体蓝图 栈的初始化 入栈 出栈 获取栈顶元素 获…

MoonBit MeetUp回顾——张正、宗喆:编程语言在云原生与区块链领域的技术探索

宗喆和张正分别给我们带了 KCL 相关的最新进展&#xff0c;由蚂蚁集团开发的 Rust 编写的开源 DSL&#xff0c;目标是优化云原生策略配置和用户体验。它通过引入动态配置管理、配置校验和基础设施抽象等核心概念&#xff0c;解决开发者认知负担、配置膨胀和标准化工具缺乏的问题…

目标检测的相关模型图:YOLO系列和RCNN系列

目标检测的相关模型图&#xff1a;YOLO系列和RCNN系列 前言YOLO系列的图展示YOLOpassthroughYOLO2YOLO3YOLO4YOLO5 RCNN系列的图展示有关目标检测发展的 前言 最近好像大家也都在写毕业论文&#xff0c;前段时间跟朋友聊天&#xff0c;突然想起自己之前写画了一些关于YOLO、Fa…

自己编译SQLite或将SQLite移植到新的操作系统(六)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite中的动态内存分配&#xff08;五&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 1.0 引言 对于大多数应用程序&#xff0c;推荐的构建方法 SQLite是使用合并代码 文件 sqlite3.c 及其相应的头文件 sqlite3.…

C# OpenCvSharp 轮廓检测

目录 效果 代码 下载 效果 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.…

k8s1.28.8版本配置prometheus监控告警

文章目录 官方架构图组件的具体介绍kube-prometheus包含的组件简介&#xff1a;文件存储路径&#xff1a; 结构分析官网自带的一些规则自己总结流程 1-创建规则磁盘使用率报警规则 详解上面rule流程Alertmanagerg查看 2-报警接收器2.1-邮件报警修改Alertmanager配置查看现有的s…

实战|使用 Node.js 和 htmx 构建全栈应用程序

在本教程中&#xff0c;我将演示如何使用 Node 作为后端和 htmx 作为前端来构建功能齐全的 CRUD 应用程序。这将演示 htmx 如何集成到全栈应用程序中&#xff0c;使您能够评估其有效性并确定它是否是您未来项目的不错选择。 htmx 是一个现代 JavaScript 库&#xff0c;旨在通过…

Haproxy2.8.1+Lua5.1.4部署,haproxy.cfg配置文件详解和演示

目录 一.快速安装lua和haproxy 二.配置haproxy的配置文件 三.配置haproxy的全局日志 四.测试负载均衡、监控和日志效果 五.server常用可选项 1.check 2.weight 3.backup 4.disabled 5.redirect prefix和redir 6.maxconn 六.调度算法 1.静态 2.动态 一.快速安装lu…

【python】网络编程socket TCP UDP

文章目录 socket常用方法TCP客户端服务器UDP客户端服务器网络编程就是实现两台计算机的通信 互联网协议族 即通用标准协议,任何私有网络只要支持这个协议,就可以接入互联网。 socket socke模块的socket()函数 import socketsock = socket.socket(Address Family, type)参…

推动制药行业数字化转型:基于超融合架构的MES一体机解决方案

随着中国对信息化重视程度的不断加深&#xff0c;制药行业作为国民经济的重要支柱之一&#xff0c;也在积极寻求通过数字化手段提升产业效率与产品质量。自党的十六大提出“以信息化带动工业化”的战略以来&#xff0c;制药业的这一转型探索尤为迫切。 在现代制药生产中&#…

scala-idea环境搭建及使用

环境搭建 创建一个新项目&#xff0c;选择maven工程 点击next&#xff0c;写入项目名&#xff0c;然后finish 注意&#xff1a;默认下&#xff0c;maven不支持scala的开发&#xff0c;需要引入scala框架&#xff0c;右键项目点击-》add framework pport....&#xff0c;在下图…

基于java+SpringBoot+Vue的书籍学习平台设计与实现

基于javaSpringBootVue的书籍学习平台设计与实现 开发语言: Java 数据库: MySQL技术: SpringBoot MyBatis工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 后台展示 系统简介 整体功能包含&#xff1a; 书籍学习平台是一个基于Internet的在线学习资源平台&#xf…

Apache Hive的基本使用语法(二)

Hive SQL操作 7、修改表 表重命名 alter table score4 rename to score5;修改表属性值 # 修改内外表属性 ALTER TABLE table_name SET TBLPROPERTIES("EXTERNAL""TRUE"); # 修改表注释 ALTER TABLE table_name SET TBLPROPERTIES (comment new_commen…

音视频开发Day01

备注 ffmpeg 库相关函数记忆 FFmpeg 库简介 FFmpeg一共包含8个库: avcodec:编解码(最重要的库) avformat:封装格式处理。 avfilter:滤镜特效处理 avdevice:各种设备的输入输出。 avutil:工具库(大部分库都需要这个库的支持)。 postproc:后加工。 swresample:音频采样数据格式…