{"id":28,"date":"2025-05-20T23:58:50","date_gmt":"2025-05-20T15:58:50","guid":{"rendered":"https:\/\/itfinn.com\/?p=28"},"modified":"2025-05-20T23:58:50","modified_gmt":"2025-05-20T15:58:50","slug":"idea-%e7%94%9f%e6%88%90%e5%b8%a6%e6%b3%a8%e9%87%8a%e7%9a%84%e5%ae%9e%e4%bd%93%e7%b1%bb-%e8%84%9a%e6%9c%ac","status":"publish","type":"post","link":"https:\/\/itfinn.com\/index.php\/2025\/05\/20\/idea-%e7%94%9f%e6%88%90%e5%b8%a6%e6%b3%a8%e9%87%8a%e7%9a%84%e5%ae%9e%e4%bd%93%e7%b1%bb-%e8%84%9a%e6%9c%ac\/","title":{"rendered":"IDEA \u751f\u6210\u5e26\u6ce8\u91ca\u7684\u5b9e\u4f53\u7c7b \u811a\u672c"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>import com.intellij.database.model.DasTable\nimport com.intellij.database.model.ObjectKind\nimport com.intellij.database.util.Case\nimport com.intellij.database.util.DasUtil\n\nimport java.sql.Date\n\n\n\/*\n * Available context bindings:\n *   SELECTION   Iterable&lt;DasObject&gt;\n *   PROJECT     project\n *   FILES       files helper\n *\/\n\n\/**\n * \u901a\u8fc7Databas\u751f\u6210\u5b9e\u4f53\u7c7b\n * \u81ea\u52a8\u8bc6\u522b\u7c7b\u578b\n * \u52a0\u5b57\u6bb5\u6ce8\u91ca\n *\/\n\npackageName = \"\"\n\n\/\/\u7c7b\u578b\u5b57\u5178\ntypeMapping = &#91;\n        (~\/(?i)tinyint|smallint|mediumint|int\/)     : \"Integer\",\n\/\/        (~\/(?i)int\/)                                : \"Long\",\n        (~\/(?i)bool|bit\/)                           : \"Boolean\",\n        (~\/(?i)float|double|decimal|real\/)          : \"Double\",\n        (~\/(?i)datetime|timestamp|date|time\/)       : \"Date\",\n        (~\/(?i)blob|binary|bfile|clob|raw|image\/)   : \"InputStream\",\n        (~\/(?i)\/)                                   : \"String\"\n]\n\n\n\nFILES.chooseDirectoryAndSave(\"Choose directory\", \"Choose where to store generated files\") { dir -&gt;\n    SELECTION.filter { it instanceof DasTable &amp;&amp; it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) }\n}\n\n\ndef generate(table, dir) {\n    def className = changeStyle(javaName(table.getName(), true), true)\n    def fields = calcFields(table)\n    packageName = getPackageName(dir)\n    PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + \".java\")), \"UTF-8\"))\n    printWriter.withPrintWriter { out -&gt; generate(out, className, fields, table) }\n\/\/    new File(dir, className + \".java\").withPrintWriter { out -&gt; generate(out, className, fields, table) }\n}\n\n\/\/ \u83b7\u53d6\u5305\u6240\u5728\u6587\u4ef6\u5939\u8def\u5f84\ndef getPackageName(dir) {\n    return dir.toString().replaceAll(\"\\\\\\\\\", \".\").replaceAll(\"\/\", \".\").replaceAll(\"^.*src(\\\\.main\\\\.java\\\\.)?\", \"\") + \";\"\n}\n\ndef generate(out, className, fields, table) {\n    out.println \"package $packageName\"\n    out.println \"\"\n    out.println \"import lombok.Data;\"\n    out.println \"\"\n    out.println \"import javax.persistence.*;\"\n    out.println \"import java.io.Serializable;\"\n\n    Set types = new HashSet()\n\n    fields.each() {\n        types.add(it.type)\n    }\n\n    if (types.contains(\"Date\")) {\n        out.println \"import java.util.Date;\"\n    }\n\n    if (types.contains(\"InputStream\")) {\n        out.println \"import java.io.InputStream;\"\n    }\n    out.println \"\"\n    out.println \"\/**\\n\" +\n            \" * \u751f\u6210\u5e26\u6ce8\u91ca\u7684\u5b9e\u4f53\u7c7b \\n\" +\n            \" * \\n\" +\n            \" * @date \" + new java.sql.Date(new java.util.Date().getTime()).toString() + \"\\n\" +\n            \" * @author xiefei\\n\" +\n            \" *\/\"\n    out.println \"\"\n    out.println \"@Data\"\n    out.println \"@Entity\"\n    out.println \"@Table(name =\\\"\" + table.getName() + \"\\\")\"\n    out.println \"public class $className  implements Serializable {\"\n    out.println \"\"\n    out.println genSerialID()\n\n    fields.each() {\n        out.println \"\"\n        \/\/ \u8f93\u51fa\u6ce8\u91ca\n        if (isNotEmpty(it.commoent)) {\n            out.println \"\\t\/**\"\n            out.println \"\\t * ${it.commoent}\"\n            out.println \"\\t *\/\"\n        }\n\n        if (it.annos != \"\") out.println \"   ${it.annos}\"\n\n        \/\/ \u8f93\u51fa\u6210\u5458\u53d8\u91cf\n        out.println \"\\tprivate ${it.type} ${it.name};\"\n    }\n\n    \/* \/\/ \u8f93\u51faget\/set\u65b9\u6cd5\n     fields.each() {\n         out.println \"\"\n         out.println \"\\tpublic ${it.type} get${it.name.capitalize()}() {\"\n         out.println \"\\t\\treturn this.${it.name};\"\n         out.println \"\\t}\"\n         out.println \"\"\n\n         out.println \"\\tpublic void set${it.name.capitalize()}(${it.type} ${it.name}) {\"\n         out.println \"\\t\\tthis.${it.name} = ${it.name};\"\n         out.println \"\\t}\"\n     }*\/\n\n    out.println \"\"\n    out.println \"}\"\n}\n\ndef calcFields(table) {\n    DasUtil.getColumns(table).reduce(&#91;]) { fields, col -&gt;\n        def spec = Case.LOWER.apply(col.getDataType().getSpecification())\n\n        def typeStr = typeMapping.find { p, t -&gt; p.matcher(spec).find() }.value\n        def comm = &#91;\n                colName : col.getName(),\n                name    : changeStyle(javaName(col.getName(), false), true),\n                type    : typeStr,\n                commoent: col.getComment(),\n\/\/                annos   : \"\\t@Column(name = \\\"\" + col.getName() + \"\\\")\"]\n                annos   : \"\\t@Column(name = \\\"`\" + col.getName() + \"`\\\")\"]\n        if (\"id\".equals(Case.LOWER.apply(col.getName()))) {\n            comm.annos = \" @Id\"\n\n            if (\"Integer\".equals(typeStr)) {\n                comm.annos += \"\\n\\t@GeneratedValue(strategy = GenerationType.IDENTITY)\"\n            }\n        }\n        fields += &#91;comm]\n    }\n}\n\n\/\/ \u5904\u7406\u7c7b\u540d\uff08\u8fd9\u91cc\u662f\u56e0\u4e3a\u6211\u7684\u8868\u90fd\u662f\u4ee5t_\u547d\u540d\u7684\uff0c\u6240\u4ee5\u9700\u8981\u5904\u7406\u53bb\u6389\u751f\u6210\u7c7b\u540d\u65f6\u7684\u5f00\u5934\u7684T\uff0c\n\/\/ \u5982\u679c\u4f60\u4e0d\u9700\u8981\u90a3\u4e48\u8bf7\u67e5\u627e\u7528\u5230\u4e86 javaClassName\u8fd9\u4e2a\u65b9\u6cd5\u7684\u5730\u65b9\u4fee\u6539\u4e3a javaName \u5373\u53ef\uff09\ndef javaClassName(str, capitalize) {\n    def s = str.split(\/&#91;^\\p{Alnum}]\/).collect { def s = Case.LOWER.apply(it).capitalize() }.join(\"\")\n    \/\/ \u53bb\u9664\u5f00\u5934\u7684T  http:\/\/developer.51cto.com\/art\/200906\/129168.htm\n    s = s&#91;1..s.size() - 1]\n    capitalize ? s : Case.LOWER.apply(s&#91;0]) + s&#91;1..-1]\n}\n\ndef javaName(str, capitalize) {\n    def s = str.split(\/(?&lt;=&#91;^\\p{IsLetter}])\/).collect { Case.LOWER.apply(it).capitalize() }\n            .join(\"\").replaceAll(\/&#91;^\\p{javaJavaIdentifierPart}]\/, \"_\")\n    capitalize || s.length() == 1 ? s : Case.LOWER.apply(s&#91;0]) + s&#91;1..-1]\n}\n\ndef isNotEmpty(content) {\n    return content != null &amp;&amp; content.toString().trim().length() &gt; 0\n}\n\nstatic String changeStyle(String str, boolean toCamel) {\n    if (!str || str.size() &lt;= 1)\n        return str\n\n    if (toCamel) {\n        String r = str.toLowerCase().split('_').collect { cc -&gt; Case.LOWER.apply(cc).capitalize() }.join('')\n        return r&#91;0].toLowerCase() + r&#91;1..-1]\n    } else {\n        str = str&#91;0].toLowerCase() + str&#91;1..-1]\n        return str.collect { cc -&gt; ((char) cc).isUpperCase() ? '_' + cc.toLowerCase() : cc }.join('')\n    }\n}\n\n\/\/ \u751f\u6210serialVersionUID\nstatic String genSerialID() {\n    return \"\\tprivate static final long serialVersionUID =  \" + Math.abs(new Random().nextLong()) + \"L;\"\n}<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u5c06\u4ee5\u4e0a\u4ee3\u7801\u4fdd\u5b58\u6210<code>GenerateScript.groovy<\/code>\u6587\u4ef6, \u653e\u5728<code>IDEA\\config\\extensions\\com.intellij.database\\schema<\/code>\u76ee\u5f55\u4e0b<\/p>\n<\/blockquote>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5c06\u4ee5\u4e0a\u4ee3\u7801\u4fdd\u5b58\u6210GenerateScript.groovy\u6587\u4ef6, \u653e\u5728IDEA\\config\\extensio [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-28","post","type-post","status-publish","format-standard","hentry","category-development"],"_links":{"self":[{"href":"https:\/\/itfinn.com\/index.php\/wp-json\/wp\/v2\/posts\/28","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itfinn.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itfinn.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itfinn.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/itfinn.com\/index.php\/wp-json\/wp\/v2\/comments?post=28"}],"version-history":[{"count":1,"href":"https:\/\/itfinn.com\/index.php\/wp-json\/wp\/v2\/posts\/28\/revisions"}],"predecessor-version":[{"id":29,"href":"https:\/\/itfinn.com\/index.php\/wp-json\/wp\/v2\/posts\/28\/revisions\/29"}],"wp:attachment":[{"href":"https:\/\/itfinn.com\/index.php\/wp-json\/wp\/v2\/media?parent=28"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itfinn.com\/index.php\/wp-json\/wp\/v2\/categories?post=28"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itfinn.com\/index.php\/wp-json\/wp\/v2\/tags?post=28"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}