zoukankan      html  css  js  c++  java
  • idea实现快速根据表创建实体

    第一步使用idea连上数据库

    第二步选择需要创建实体的表

    选择这个创建的实体是没有注解的

    需要注解的话需要在

    创建这样一个文件

    文件的内容

    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.io.*
    import java.text.SimpleDateFormat
     
    /*
     * Available context bindings:
     *   SELECTION   Iterable<DasObject>
     *   PROJECT     project
     *   FILES       files helper
     */
    packageName = ""
    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 className = javaName(table.getName(), true)
        def fields = calcFields(table)
        packageName = getPackageName(dir)
        PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "UTF-8"))
        printWriter.withPrintWriter {out -> generate(out, className, fields,table)}
     
    //    new File(dir, className + ".java").withPrintWriter { 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 javax.persistence.Column;"
        out.println "import javax.persistence.Entity;"
        out.println "import javax.persistence.Table;"
        out.println "import java.io.Serializable;"
        out.println "import lombok.Getter;"
        out.println "import lombok.Setter;"
        out.println "import lombok.ToString;"
        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 "/**
    " +
                " * @Description  
    " +
                " * @Author  Hunter
    " +
                " * @Date "+ new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " 
    " +
                " */"
        out.println ""
        out.println "@Setter"
        out.println "@Getter"
        out.println "@ToString"
        out.println "@Entity"
        out.println "@Table ( name =""+table.getName() +"" )"
        out.println "public class $className  implements Serializable {"
        out.println ""
        out.println genSerialID()
        fields.each() {
            out.println ""
            // 输出注释
            if (isNotEmpty(it.commoent)) {
                out.println "	/**"
                out.println "	 * ${it.commoent.toString()}"
                out.println "	 */"
            }
     
            if (it.annos != "") out.println "   ${it.annos.replace("[@Id]", "")}"
     
            // 输出成员变量
            out.println "	private ${it.type} ${it.name};"
        }
     
        // 输出get/set方法
    //    fields.each() {
    //        out.println ""
    //        out.println "	public ${it.type} get${it.name.capitalize()}() {"
    //        out.println "		return this.${it.name};"
    //        out.println "	}"
    //        out.println ""
    //
    //        out.println "	public void set${it.name.capitalize()}(${it.type} ${it.name}) {"
    //        out.println "		this.${it.name} = ${it.name};"
    //        out.println "	}"
    //    }
        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: "	@Column(name = ""+col.getName()+"" )"]
            if("id".equals(Case.LOWER.apply(col.getName())))
                comm.annos +=["@Id"]
            fields += [comm]
        }
    }
     
    // 处理类名(这里是因为我的表都是以t_命名的,所以需要处理去掉生成类名时的开头的T,
    // 如果你不需要那么请查找用到了 javaName这个方法的地方修改为 javaName 即可)
    /*def javaClassName(str, capitalize) {
        def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
                .collect { Case.LOWER.apply(it).capitalize() }
                .join("")
                .replaceAll(/[^p{javaJavaIdentifierPart}[_]]/, "_")
        // 去除开头的T  http://developer.51cto.com/art/200906/129168.htm
        s = s[1..s.size() - 1]
        capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
    }*/
     
    def javaName(str, capitalize) {
    //    def s = str.split(/(?<=[^p{IsLetter}])/).collect { Case.LOWER.apply(it).capitalize() }
    //            .join("").replaceAll(/[^p{javaJavaIdentifierPart}]/, "_")
    //    capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
        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 "	private static final long serialVersionUID =  "+Math.abs(new Random().nextLong())+"L;"
    }
    

    然后选择表,选择自己定义的groovy文件即可

    当然需要在pom文件中添加

     <dependency>
                <groupId>javax.persistence</groupId>
                <artifactId>persistence-api</artifactId>
                <version>1.0.2</version>
            </dependency>
    
            <!-- set,get注解实现-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.10</version>
                <scope>provided</scope>
            </dependency>

    支持注解

    小蘑菇
  • 相关阅读:
    百度之星资格赛1001——找规律——大搬家
    HDU1025——LIS——Constructing Roads In JGShining's Kingdom
    DP(递归打印路径) UVA 662 Fast Food
    递推DP UVA 607 Scheduling Lectures
    递推DP UVA 590 Always on the run
    递推DP UVA 473 Raucous Rockers
    博弈 HDOJ 4371 Alice and Bob
    DFS(深度) hihoCoder挑战赛14 B 赛车
    Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)
    DP(DAG) UVA 437 The Tower of Babylon
  • 原文地址:https://www.cnblogs.com/wang66a/p/12069288.html
Copyright © 2011-2022 走看看