idea生成mysql脚本_IDEA + Groovy脚本一键生成实体类,用法舒服,高效! 今天药忘吃喽~ 2022-11-03 10:46 59阅读 0赞 idea 功能很强大,以前不知道有这样的提升工作效率的方法,虽然有的工具确实可以直接生成实体类,mapper文件,还有dao接口,但是个人觉得涉及到复杂业务还是只生成实体类比较好,后面部分就自己搞定就可以了。 一、连接数据库![format,png][format_png] 打开项目: 1、点击右侧的datesource图标,要是没有该图标,请去自行百度 2、点击 + 号 3、选择 datasource 4、选择 mysql![format,png][format_png 1] 1、填写一个连接名,随便填什么都行 2、不用选择,默认就行 3、填写数据库连接的 IP地址,比如本地数据库可以填写:localhost或者127.0.0.1 4、填写数据库开放的端口号,一般没设置的话默认都是3306 5、填写你需要连接的数据库名 6、填写数据库的用户名 7、填写数据库密码 8、这里会有一个驱动需要点击下载,图中是已经下载好了 9、填写自己的数据库连接url,然后可以点击9所在按钮进行测试连接,本地连接失败检查是否开启了mysql服务![format,png][format_png 2] 连接好了如上图所示,可以看到自己的数据库和表,选择一个表右键,网上教程一般到这里结束,都是选择说Generate POJOs.groovy,然后在弹出窗口选择需要生成的文件夹所在即可。![format,png][format_png 3] 我选择一张表进行生成示例如下:![format,png][format_png 4] 表明去除了“\_”然后以驼峰方式生成了类名,而且开始的package 路径也不对,重点是没有注释,没有注释,没有注释! 网上搜了一些方法,都不太行,要不就是到处报错,没辙只能自己瞎琢磨。没想到最后也不难,下面就是实现: 右键选择表,在选择Generate POJOs.groovy 的下面那一项:![format,png][format_png 5] 进来只有Generate POJOs.groovy,右键新建另外一个比如我的叫做:Generate MyPOJOs.groovy,里面内容如下: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\* 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 = javaClassName(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 "/\*\*\\n" + " \* @Description \\n" + " \* @Author Hunter\\n" + " \* @Date "+ new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " \\n" + " \*/" 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 "\\t/\*\*" out.println "\\t \* $\{it.commoent.toString()\}" out.println "\\t \*/" \} if (it.annos != "") out.println " $\{it.annos.replace("\[@Id\]", "")\}" // 输出成员变量 out.println "\\tprivate $\{it.type\} $\{it.name\};" \} // 输出get/set方法 // fields.each() \{ // out.println "" // out.println "\\tpublic $\{it.type\} get$\{it.name.capitalize()\}() \{" // out.println "\\t\\treturn this.$\{it.name\};" // out.println "\\t\}" // out.println "" // // out.println "\\tpublic void set$\{it.name.capitalize()\}($\{it.type\} $\{it.name\}) \{" // out.println "\\t\\tthis.$\{it.name\} = $\{it.name\};" // out.println "\\t\}" // \} 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()+"\\" )"\] if("id".equals(Case.LOWER.apply(col.getName()))) comm.annos +=\["@Id"\] fields += \[comm\] \} \} // 处理类名(这里是因为我的表都是以t\_命名的,所以需要处理去掉生成类名时的开头的T, // 如果你不需要那么请查找用到了 javaClassName这个方法的地方修改为 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 "\\tprivate static final long serialVersionUID = "+Math.abs(new Random().nextLong())+"L;" \} 完成后,点击此处,选择project 切换回来:![format,png][format_png 6] 这时,我们再次选择表,右键,选择我们自己新建的 groovy,然后选择生成存放的文件夹路径,生成:![format,png][format_png 7] 可以看到,生成的类名,package路径,以及已经实现了序列化,也加上了注解,指明了每个属性对应的表字段,如果@Table和@Column没有引入包,还请在maven中添加相关依赖:javax.persistence persistence-api 1.0.2 关于 groovy ,个人也是懂得不多,很多东西都是照葫芦画瓢,欢迎各位拍砖共同交流,要是本文对你有所帮助,欢迎点赞支持一下,谢谢~~~题外话: 目前小哈正在个人博客(新搭建的网站,域名就是犬小哈的拼音)www.quanxiaoha.com上更新《Go语言教程》、《Gin Web框架教程》,毕竟Go自带天然的并发优势,后端的同学还是要学一下的,这个教程系列小哈会一直更新下去,欢迎小伙伴们访问哦~END 获取方式:点“在看”,关注公众号并回复Java领取,更多内容陆续奉上。 文章有帮助的话,在看,转发吧。 谢谢支持哟 (\*^\_\_^\*) [format_png]: /images/20221024/520ac08792c341d6956e1136f71eca4c.png [format_png 1]: /images/20221024/8ad94873eb3b4063b60e7571ed9560f1.png [format_png 2]: /images/20221024/6a9f3f44463b4da598e4153d3206e070.png [format_png 3]: /images/20221024/e233ff6012f643378916462d1251a6de.png [format_png 4]: /images/20221024/a82418ba894d41a59a06483b668b48b1.png [format_png 5]: /images/20221024/7065ee30abd8425094bdcc110a825d3e.png [format_png 6]: /images/20221024/f237ff3a70284089b8424e4e1692d4e3.png [format_png 7]: /images/20221024/75fe0415768744dcbc3f36a2e12a88fd.png
还没有评论,来说两句吧...