Idea中自带的自动生成代码工具讲解及修改

目前有许多插件或者框架都可以自动生成一整套的代码,从实体层到显示层都有,但毕竟不是自己的,不方便根据项目需求动态修改调节,而且往往不够轻量级,需要额外运行一套项目,这里展示一种在idea中生成代码的轻量级方式。

首先上几个步骤截图:

1.打开idea,连接到数据库

这里以mysql为例:

输入账号密码等信息:

连接成功后,会显示数据库的表信息

2.选择代码生成脚本,idea默认有一套自带的简单的脚本,也可以自己编写脚本

3.选择生成目录,完成。

接下来自定义一套自己的生成代码脚本,上面的脚本列表中可以看到,所有的脚本都是 groovy语言写的,下面是一个生成实体的脚本示例,即使不会groovy,也可以照葫芦画瓢修改出自己的脚本,学会修改脚本后,就可以很简单的写出po,service,controller层的相关代码,甚至可以直接生成页面,

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.sql.Date




packageName = ""
//类型映射,左侧是数据库的类型,对应到右侧的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)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 tableName = table.getName();
    if(tableName.matches("t_.+")){
        tableName = tableName.substring(2)
    }
    def className = javaName(tableName, true) + "Po"
    def fields = calcFields(table)

    packageName = getPackageName(dir)
    new File(dir, className + ".java").withPrintWriter("utf-8") { 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 com.goumang.core.base.BasePo;"
    out.println ""
    out.println "import javax.persistence.GeneratedValue;"
    out.println "import javax.persistence.GenerationType;"
    out.println "import javax.persistence.Id;"
    out.println "import javax.persistence.Table;"

    Set types = new HashSet()

    fields.each() {
        types.add(it.type)
    }

    if (types.contains("Date")) {
        out.println "import java.util.Date;"
    }

    if (types.contains("InputStream")) {
        out.println "import java.io.InputStream;"
    }
    out.println ""
    out.println "@Table ( name =\""+table.getName() +"\" )"
    out.println "public class $className extends BasePo {"

    index = 0
    idName = "";
    fields.each() {
        out.println ""
        // 输出注释
        if (isNotEmpty(it.commoent)) {
            out.println "\t/* ${it.commoent} */"
        }

        if (it.annos != "") out.println "   ${it.annos}"
        //第一个字段有注解
        if (index == 0){
            index ++
            out.println"\t@Id"
            if(it.type=="Long" || it.type=="Integer"){
                out.println "\t@GeneratedValue(strategy = GenerationType.IDENTITY)"
            }
            idName = it.name
        }
        // 输出成员变量
        out.println "\tprivate ${it.type} ${it.name};"
    }

    // 输出get/set方法
    index = 0
    fields.each() {
        out.println ""
        if(index ==0){
            index ++
            out.println "\t@Override"
            out.println "\tpublic Object getPk() { return this.${it.name}; }"
            out.println ""
            out.println "\t@Override"
            if(it.type=="Long"){
                out.println "\tpublic void setPk(Object pk) { this.${it.name} = pk == null || pk.toString().length() == 0 ? null : Long.parseLong(pk.toString()); }"
            }else if(it.type=="String"){
                out.println "\tpublic void setPk(Object pk) { this.${it.name} = pk==null?null:pk.toString(); }"
            }else{
                out.println "\tpublic void setPk(Object pk) { this.${it.name} = (${it.type}) pk; }"
            }
            out.println ""
        }
        out.println "\tpublic ${it.type} get${it.name.capitalize()}() { return this.${it.name}; }"
        out.println ""
        out.println "\tpublic void set${it.name.capitalize()}(${it.type} ${it.name}) { this.${it.name} = ${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() }.value
        def comm =[
                colName : col.getName(),
                name :  javaName(col.getName(), false),
                type : typeStr,
                commoent: col.getComment(),
                //annos: "\t@Column(name = \""+col.getName()+"\" )",
                annos:""
        ]

//    if("id".equals(Case.LOWER.apply(col.getName())))
//      comm.annos +=["@Id"]
        fields += [comm]
    }
}

// 处理类名(这里是因为我的表都是以t_命名的,所以需要处理去掉生成类名时的开头的T,
// 如果你不需要那么请查找用到了 javaClassName这个方法的地方修改为 javaName 即可)
def javaClassName(str, capitalize) {
    def s = str.split(/[^\p{Alnum}]/).collect { def s = Case.LOWER.apply(it).capitalize() }.join("")
    // 去除开头的T  http://developer.51cto.com/art/200906/129168.htm
    s = s[1..s.size() - 1]
    capitalize ? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

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
}

static String changeStyle(String str, boolean toCamel){
    if(!str || str.size() <= 1)
        return str

    if(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;";
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CodeMaker是一种自动化代码生成工具,可以帮助开发人员根据他们的Idea快速生成代码。它可以减少代码编写的工作量,提高开发效率。 使用CodeMaker生成代码的步骤如下: 首先,我们需要安装并配置CodeMaker插件。打开Idea,选择插件设置,搜索CodeMaker并安装。安装完成后,重启Idea并进行相关配置,如选择所需的语言和代码风格等。 接下来,在Idea创建一个新的代码文件或打开现有的代码文件。 然后,选择需要自动生成代码的部分。可以选择整个文件、特定的类、方法,甚至是某些注释块。CodeMaker可以根据选定的代码自动生成相关的代码。 在选定的代码段上使用快捷键或右键菜单选择CodeMaker生成代码。根据选择的代码段,CodeMaker会自动生成代码。 生成的代码可以根据需要进行进一步的修改和定制。CodeMaker会根据所选的语言和代码风格生成代码模板,但仍然需要根据实际需求进行适当的调整。 最后,对生成的代码进行保存并进行测试。确保生成的代码符合预期并正常工作。 值得注意的是,CodeMaker虽然可以辅助我们生成代码,但并不能完全替代开发人员的工作。在使用CodeMaker生成的代码之前,开发人员需要对其进行充分的理解和确认,以确保生成的代码符合项目需求和开发准则。 总结起来,通过CodeMaker自动生成代码,开发人员可以提高开发效率,减少重复劳动,但仍需要根据实际需求进行适当的修改和定制。这样可以更好地利用CodeMaker的功能,快速开发出高质量的代码
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值