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

*  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中添加相关依赖:

    javax.persistence

    persistence-api

    1.0.2



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

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

你可能感兴趣的:(IDEA + Groovy脚本一键生成实体类,用法舒服,高效!)