IDEA + Groovy脚本一键生成实体类,用法舒服,高效!

idea 功能很强大,以前不知道有这样的提升工作效率的方法,虽然有的工具确实可以直接生成实体类,mapper文件,还有dao接口,但是个人觉得涉及到复杂业务还是只生成实体类比较好,后面部分就自己搞定就可以了。

一、连接数据库


打开项目:

1、点击右侧的datesource图标,要是没有该图标,请去自行百度

2、点击 + 号

3、选择 datasource

4、选择 mysql


1、填写一个连接名,随便填什么都行

2、不用选择,默认就行

3、填写数据库连接的 IP地址,比如本地数据库可以填写:localhost或者127.0.0.1

4、填写数据库开放的端口号,一般没设置的话默认都是3306

5、填写你需要连接的数据库名

6、填写数据库的用户名

7、填写数据库密码

8、这里会有一个驱动需要点击下载,图中是已经下载好了

9、填写自己的数据库连接url,然后可以点击9所在按钮进行测试连接,本地连接失败检查是否开启了mysql服务


连接好了如上图所示,可以看到自己的数据库和表,选择一个表右键,网上教程一般到这里结束,都是选择说Generate POJOs.groovy,然后在弹出窗口选择需要生成的文件夹所在即可。

我选择一张表进行生成示例如下:


表明去除了“_”然后以驼峰方式生成了类名,而且开始的package 路径也不对,重点是没有注释,没有注释,没有注释!

网上搜了一些方法,都不太行,要不就是到处报错,没辙只能自己瞎琢磨。没想到最后也不难,下面就是实现:

右键选择表,在选择Generate POJOs.groovy 的下面那一项:



进来只有Generate POJOs.groovy,右键新建另外一个比如我的叫做:Generate MyPOJOs.groovy,里面内容如下:

importcom.intellij.database.model.DasTableimportcom.intellij.database.model.ObjectKindimportcom.intellij.database.util.Caseimportcom.intellij.database.util.DasUtilimportjava.io.*importjava.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{itinstanceofDasTable&&it.getKind()==ObjectKind.TABLE}.each{generate(it,dir)}}defgenerate(table,dir){def className=javaClassName(table.getName(),true)def fields=calcFields(table)packageName=getPackageName(dir)PrintWriter printWriter=newPrintWriter(newOutputStreamWriter(newFileOutputStream(newFile(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) }}// 获取包所在文件夹路径defgetPackageName(dir){returndir.toString().replaceAll("\\\\",".").replaceAll("/",".").replaceAll("^.*src(\\.main\\.java\\.)?","")+";"}defgenerate(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=newHashSet()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 "+newSimpleDateFormat("yyyy-MM-dd").format(newDate())+" \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.printlngenSerialID()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"}"}defcalcFields(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 即可)defjavaClassName(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.htms=s[1..s.size()-1]capitalize||s.length()==1?s:Case.LOWER.apply(s[0])+s[1..-1]}defjavaName(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]}defisNotEmpty(content){returncontent!=null&&content.toString().trim().length()>0}staticStringchangeStyle(String str,boolean toCamel){if(!str||str.size()<=1)returnstrif(toCamel){String r=str.toLowerCase().split('_').collect{cc->Case.LOWER.apply(cc).capitalize()}.join('')returnr[0].toLowerCase()+r[1..-1]}else{str=str[0].toLowerCase()+str[1..-1]returnstr.collect{cc->((char)cc).isUpperCase()?'_'+cc.toLowerCase():cc}.join('')}}staticStringgenSerialID(){return"\tprivate static final long serialVersionUID =  "+Math.abs(newRandom().nextLong())+"L;"}

完成后,点击此处,选择project 切换回来:


这时,我们再次选择表,右键,选择我们自己新建的 groovy,然后选择生成存放的文件夹路径,生成:


可以看到,生成的类名,package路径,以及已经实现了序列化,也加上了注解,指明了每个属性对应的表字段,如果@Table和@Column没有引入包,还请在maven中添加相关依赖:

<dependency>

    <groupId>javax.persistence</groupId>

    <artifactId>persistence-api</artifactId>

    <version>1.0.2</version>

</dependency>



免费学习课程,需要的小伙伴可以私我拉你们听课哦!!

关于 groovy ,个人也是懂得不多,很多东西都是照葫芦画瓢,欢迎各位大佬共同交流,要是本文对你有所帮助,欢迎点赞支持一下,谢谢~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容