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)
            }
    // 生成mapper
    String 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)
            }
    // 生成service
    String serviceDir = "${dir}/service"
    String serviceClassName = "${domainClassName}Service"
    String servicePackageName = getPackageName(serviceDir)
    new File(serviceDir, "${serviceClassName}.java")
            .withPrintWriter("UTF-8") { out -> generateService(out, serviceClassName, servicePackageName) }

    // 生成serviceImpl
    String 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)
            }

    // 生成Controller
    String 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() }.value
        def 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.mfbz.cn/a/496220.html

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

相关文章

WorkPlus最佳的内网通讯软件解决方案,助力企业构建高效沟通环境

高效的内部通讯对于团队协作和工作效率至关重要&#xff0c;而选择适合的内网通讯软件&#xff0c;能够提升企业的通讯效能。WorkPlus以其卓越的性能和全面的功能&#xff0c;成为企业内网通讯软件的最佳选择。 为何选择WorkPlus作为企业的内网通讯软件呢&#xff1f;首先&…

西藏实景三维技术研讨交流会成功举办

2024年3月21-22日&#xff0c;西藏自治区“实景三维技术研讨交流会”在拉萨成功举办。 本次会议由西藏自治区自然资源厅、自然资源部重庆测绘院指导&#xff0c;西藏自治区测绘学会、西藏自治区地理信息产业协会主办&#xff0c;武汉大势智慧科技有限公司&#xff08;后简称“…

Java多线程实战-从零手搓一个简易线程池(二)线程池与拒绝策略实现

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…

【每日一题 | 动态规划】访问完所有房间的第一天

文章目录 Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【数组】【2024-03-28】 题目来源 1997. 访问完所有房间的第一天 解题思路 方法一&#xff1a;动态规划 定义状态 定义 f[i] 表示第一次到达房间 i 的日期编号。 根据题意&#xff0c;…

VMware vSAN OSA存储策略 - 基于虚拟机的分布式对象存储

简介 博客&#xff1a;https://songxwn.com/ 存储策略 (Storage Policy) 是管理员定义的一组规则&#xff0c;这组规则定义了数据对象在 vSAN 存储上是如何保存的&#xff0c;存储策略定义了数据存储的可靠性、访问性能等特性。vSAN 提供了基于存储策略的存储管理 SPBM (Stor…

upload-labs-master靶场训练笔记

2004.2.17 level-1 &#xff08;前端验证&#xff09; 新建一个写有下面一句话木马的php文件&#xff0c;然后把后缀改为png <?php eval($_POST["abc"]); ?> 用bp抓包后更改文件后缀为php 再用蚁剑等工具链接即可拿下shell level-2 &#xff08;后端…

js改变图片曝光度(高亮度)

方法一&#xff1a; 原理&#xff1a; 使用canvas进行滤镜操作&#xff0c;通过改变图片数据每个像素点的RGB值来提高图片亮度。 缺点 当前项目使用的是svg&#xff0c;而不是canvas 调整出来的效果不是很好&#xff0c;图片不是高亮&#xff0c;而是有些发白 效果 代码 …

量子通信达新高度!两大诺奖技术联手,铸就前所未有的高效纠缠光子源

滑铁卢大学量子计算研究所&#xff08;IQC&#xff09;的科学家们成功地融合了两项诺贝尔奖级别的研究成果&#xff0c;从而在量子通信领域取得了重大进展。他们现在能够通过量子点技术高效生成几乎完美的纠缠光子对&#xff0c;这一突破性成果已在《通信物理学》&#xff08;C…

实例:NX二次开发求取封闭曲线的面积(多个封闭曲线)

一、概述 最近在NX二次开发群里有人推了一篇关于写求取封闭曲线面积的文章。针对小白的我决定试着做一做&#xff0c;期间遇到了很多问题&#xff0c;全部用NXOpenC通过录制代码进行修改&#xff0c;最后发现老是有问题&#xff0c;后来通过ufun转化解决了问题&#xff0c;个人…

如何使用在项目中使用echarts

一、使用echarts的好处和作用 ECharts 是一个强大的数据可视化库&#xff0c;主要用于在网页上创建丰富多彩的交互式图表和地图。一些 ECharts 的好处和作用包括&#xff1a; 好处&#xff1a; 丰富的图表类型&#xff1a;ECharts 提供了各种常见的图表类型&#xff0c;如折线…

python的一些知识点

在C C Java中&#xff0c;基本数据类型变量&#xff08;将常量数据存储在变量空间当中&#xff09; int a 3; int b 4; 在C C中&#xff0c;指针变量&#xff08;存储的是变量的物理内存地址&#xff09; int a 3; int* b; b &a; int** c; c &b; printf("%d&…

jira安装与配置

1. 环境准备 环境要求 1) JDK1.8以上环境配置 2) Mysql数据库5.7.13 3) Jira版本7及破解包 1.1 JDK1.8安装配置 1) 首先下载 JDK1.8&#xff0c; - 网址&#xff1a;https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html - windows64 版&am…

Vue3气泡卡片(Popover)

效果如下图&#xff1a;在线预览 APIs 参数说明类型默认值必传title卡片标题string | slot‘’falsecontent卡片内容string | slot‘’falsemaxWidth卡片内容最大宽度string | number‘auto’falsetrigger卡片触发方式‘hover’ | ‘click’‘hover’falseoverlayStyle卡片样式…

开源AI引擎:利用影像处理与目标检测技术对违章建筑排查

一、项目案例介绍 随着城市化进程的加快&#xff0c;城市规划和管理工作面临着前所未有的挑战&#xff0c;违章建筑的排查与处理成为了城市管理中的一项重要任务。传统的违章建筑排查方法依赖于人力巡查&#xff0c;效率低下且难以全面覆盖。为了解决这一问题&#xff0c;现代…

C++资产设备管理系统

一、引言 1.1 项目设计背景及意义 1.1.1理论研究基础 &#xff08;1&#xff09;C在C的基础上增加了面向对象的机制。 &#xff08;2&#xff09;充分利用面向对象机制中的多态性实现函数的设计。 1.1.2 技术层面的支持 运用系统为C面向对象程序设计提供的各种设计方法和V…

DAZ Studio中常用的快捷键组合

CtrlAlt左键: 旋转视图CtrlAlt右键: 平移视图CtrlF: 在Mac上对应AppleF,聚焦选中的物体Alt方向键: 平移视图CtrlP: 返回透视视图W/A/S/D: 上/下/左/右视图ShiftF11: 在Mac上可能需要添加Option键,全屏模式F3: 启用X射线视见效果Ctrl1到0: 切换各种渲染式样CtrlL: 切换场景灯光 …

Midjourney辞典AIGC中英双语图文辞典+Midjourney提示关键词

完整内容下载&#xff1a;https://download.csdn.net/download/u010564801/89042077 完整内容下载&#xff1a;https://download.csdn.net/download/u010564801/89042077 完整内容下载&#xff1a;https://download.csdn.net/download/u010564801/89042077

基于Java在线考试系统系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

element表格 加滚动,监听底部实现分页加载

表格要实现滚动很简单&#xff0c;给他加一个高度即可 height"300" 然后是监听事件 mounted() {this.lazyLoading();}, methods:{lazyLoading(){let dom document.querySelector(".el-table__body-wrapper");dom.addEventListener("scroll", (…

适合工业应用,MAX42408AFOA、MAX42408AFOB、MAX42410AFOA采用小解决方案尺寸的高功率DC/DC转换器

产品简介 MAX42408/MAX42410均为高度集成的同步降压转换器&#xff0c;具有内部高侧和低侧开关。这些IC均可在4.5V至36V的输入电压范围内提供高达8A/10A的电流。电压质量可以通过PGOOD信号来监测。MAX42408/MAX42410可以在压差模式下以99%的占空比运行&#xff0c;非常适合工业…