idea默认代码生成脚本修改
修改了下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;"
}相关文章:
idea默认代码生成脚本修改
修改了下idea自带的代码生成脚本,增加了脚本代码的注释,生成了controller,service,impl,mapper,里面都是空的,具体可以根据自己的代码习惯增加 代码生成脚本的使用可以看下使用 idea 生成实体类…...
StarRocks实战——多点大数据数仓构建
目录 前言 一、背景介绍 二、原有架构的痛点 2.1 技术成本 2.2 开发成本 2.2.1 离线 T1 更新的分析场景 2.2.2 实时更新分析场景 2.2.3 固定维度分析场景 2.2.4 运维成本 三、选择StarRocks的原因 3.1 引擎收敛 3.2 “大宽表”模型替换 3.3 简化Lambda架构 3.4 模…...
jmeter总结之:Regular Expression Extractor元件
Regular Expression Extractor是一个后处理器元件,使用正则从服务器的响应中提取数据,并将这些数据保存到JMeter变量中,以便在后续的请求或断言中使用。在处理动态数据或验证响应中的特定信息时很有用。 添加Regular Expression Extractor元…...
快速上手Spring Cloud 七:事件驱动架构与Spring Cloud
快速上手Spring Cloud 一:Spring Cloud 简介 快速上手Spring Cloud 二:核心组件解析 快速上手Spring Cloud 三:API网关深入探索与实战应用 快速上手Spring Cloud 四:微服务治理与安全 快速上手Spring Cloud 五:Spring …...
leetcode 1997.访问完所有房间的第一天
思路:动态规划前缀和 这道题还是很难的,因为你如果需要推出状态方程是很难想的。 在题中我们其实可以发现,这里在访问nextVisit数组的过程中,其实就是对于当前访问的房子之前的房子进行了回访。 怎么说呢?比如你现在…...
【InternLM 实战营第二期笔记】书生·浦语大模型全链路开源体系及InternLM2技术报告笔记
大模型 大模型成为发展通用人工智能的重要途径 专用模型:针对特定任务,一个模型解决一个问题 通用大模型:一个模型应对多种任务、多种模态 书生浦语大模型开源历程 2023.6.7:InternLM千亿参数语言大模型发布 2023.7.6&#…...
Netty对Channel事件的处理以及空轮询Bug的解决
继续上一篇Netty文章,这篇文章主要分析Netty对Channel事件的处理以及空轮询Bug的解决 当Netty中采用循环处理事件和提交的任务时 由于此时我在客户端建立连接,此时服务端没有提交任何任务 此时select方法让Selector进入无休止的阻塞等待 此时selectCnt进…...
【PostgreSQL】- 1.1 在 Debian 12 上安装 PostgreSQL 15
官方说明参考 (原文 PostgreSQL:Linux 下载 (Debian)) 默认情况下,PostgreSQL 在所有 Debian 版本中都可用。但是, Debians 的稳定版本“快照”了特定版本的 PostgreSQL 然后在该 Debian 版本的…...
第4章.精通标准提示,引领ChatGPT精准输出
标准提示 标准提示,是引导ChatGPT输出的一个简单方法,它提供了一个具体的任务让模型完成。 如果你要生成一篇新闻摘要。你只要发送指示词:汇总这篇新闻 : …… 提示公式:生成[任务] 生成新闻文章的摘要: 任务&#x…...
HTTP状态 405 - 方法不允许
方法有问题。 用Post发的请求,然后用Put接收的。 大家也可以看看是不是有这种问题 <body><h1>HTTP状态 405 - 方法不允许</h1><hr class"line" /><p><b>类型</b> 状态报告</p><p><b>消息…...
题目 2898: 二维数组回形遍历
题目描述: 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序遍历整个数组。如图所示: 代码: package lanqiao;import java.math.BigInteger; import java.util.*;public class Main {public static …...
Git命令上传本地项目至github
记录如何创建个人仓库并上传已有代码至github in MacOS环境 0. 首先下载git 方法很多 这里就不介绍了 1. Github Create a new repository 先在github上创建一个空仓库,用于一会儿链接项目文件,按照自己的需求设置name和是否private 2.push an exis…...
机器学习之决策树现成的模型使用
目录 须知 DecisionTreeClassifier sklearn.tree.plot_tree cost_complexity_pruning_path(X_train, y_train) CART分类树算法 基尼指数 分类树的构建思想 对于离散的数据 对于连续值 剪枝策略 剪枝是什么 剪枝的分类 预剪枝 后剪枝 后剪枝策略体现之威斯康辛州乳…...
【python分析实战】成本:揭示电商平台月度开支与成本结构占比 - 过于详细 【收藏】
重点关注本文思路,用python分析,方便大家实验复现,代码每次都用全量的,其他工具自行选择。 全文3000字,阅读10min,操作1小时 企业案例实战欢迎关注专栏 每日更新:https://blog.csdn.net/cciehl/…...
新网站收录时间是多久,新建网站多久被百度收录
对于新建的网站而言,被搜索引擎收录是非常重要的一步,它标志着网站的正式上线和对外开放。然而,新网站被搜索引擎收录需要一定的时间,而且时间长短受多种因素影响。本文将探讨新网站收录需要多长时间,以及新建网站多久…...
通过Caliper进行压力测试程序,且汇总压力测试问题解决
环境要求 第一步. 配置基本环境 部署Caliper的计算机需要有外网权限;操作系统版本需要满足以下要求:Ubuntu >= 16.04、CentOS >= 7或MacOS >= 10.14;部署Caliper的计算机需要安装有以下软件:python 2.7、make、g++(gcc-c++)、gcc及git。第二步. 安装NodeJS # …...
LabVIEW比例流量阀自动测试系统
LabVIEW比例流量阀自动测试系统 开发了一套基于LabVIEW编程和PLC控制的比例流量阀自动测试系统。通过引入改进的FCMAC算法至测试回路的压力控制系统,有效提升了压力控制效果,展现了系统的设计理念和实现方法。 项目背景: 比例流量阀在液压…...
安卓U3D逆向从Assembly-CSharp到il2cpp
随着unity技术的发展及厂商对于脚本源码的保护,很大一部分U3D应用的scripting backend已经由mono转为了il2cpp,本文从unity简单应用的制作讲起,介绍U3D应用脚本的Assembly-CSharp.dll的逆向及il2cpp.so的逆向分析。 目录如下: 0…...
计算机网络——30SDN控制平面
SDN控制平面 SDN架构 数据平面交换机 快速、简单,商业化交换设备采用硬件实现通用转发功能流表被控制器计算和安装基于南向API,SDN控制器访问基于流的交换机 定义了哪些可以被控制哪些不能 也定义了和控制器的协议 SDN控制器(网络OS&#…...
Obsidian插件-高亮块(Admonition)
在插件市场里面搜索Admonition并安装插件,就可以使用高亮块了。 添加高亮块 用法稍微有一些不同。按照下面的格式,输入Markdown就可以创建一个高亮块。 内容内容内容输入*ad-*会出现相应的类型可以选择...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
