idea默认代码生成脚本修改

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

代码生成脚本的使用可以看下使用 idea 生成实体类代码

修改后的脚本代码

java 复制代码
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;"
}
相关推荐
qq_189807032 分钟前
c++怎么解决ifstream在读取UTF-16文件时的乱码_imbue用法【避坑】
jvm·数据库·python
java1234_小锋8 分钟前
Java高频面试题:Spring框架中的单例bean是线程安全的吗?
java·spring·面试
Tingjct20 分钟前
C++ 多态
java·开发语言·c++
2301_7775993724 分钟前
Golang怎么实现微服务日志聚合_Golang如何将多个服务的日志统一收集到一处查询【指南】
jvm·数据库·python
数琨创享TQMS质量数智化24 分钟前
数琨创享Sigmar TQMS: 制造业质量管理报表体系的系统性重构
数据库·人工智能·重构
Devin~Y25 分钟前
大厂Java面试实战:Spring Boot/WebFlux、Redis+Kafka、K8s可观测性与Spring AI RAG/Agent三轮连环问
java·spring boot·redis·kafka·kubernetes·resilience4j·spring webflux
m0_7478545231 分钟前
MySQL如何缓解热点数据的更新瓶颈_合并更新请求与排队控制
jvm·数据库·python
zhangchaoxies32 分钟前
React Flow 边缘丢失与错位问题的根源及 Hooks 重构方案
jvm·数据库·python
Wyz2012102432 分钟前
如何在 React 中正确绑定 onClick 事件避免字符串赋值错误
jvm·数据库·python
m0_3776182341 分钟前
如何在 Node.js 服务器间正确配置 CORS 实现跨子域资源访问
jvm·数据库·python