网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

来自:CSDN,作者:悲凉的秋风

链接:https://blog.csdn.net/qq_34371461/article/details/80571281

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

一、连接数据库

打开项目:

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

2、点击 + 号

3、选择 datasource

4、选择 mysql

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

2、不用选择,默认就行

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

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

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

6、填写数据库的用户名

7、填写数据库密码

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

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

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

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

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

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

进来只有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 切换回来:

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

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


javax.persistence
persistence-api
1.0.2

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


逆锋起笔是一个专注于程序员圈子的技术平台,你可以收获最新技术动态、最新内测资格、BAT等大厂的经验、精品学习资料、职业路线、副业思维,微信搜索逆锋起笔关注!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
是什么影响了民营的信心?专家在回避最简单的事实

是什么影响了民营的信心?专家在回避最简单的事实

永不出场的戈多
2024-06-17 12:04:16
油腻师姐力压耶路撒冷,蒂法在3D区的地位岌岌可危

油腻师姐力压耶路撒冷,蒂法在3D区的地位岌岌可危

街机时代
2024-05-13 08:31:21
没有朱婷,没有李盈莹,蔡斌轮休6大巨星高深莫测!恐被日本双杀

没有朱婷,没有李盈莹,蔡斌轮休6大巨星高深莫测!恐被日本双杀

嘴炮体坛
2024-06-17 11:06:58
南方医科大事件,弄不好就成了另一起彭宇案

南方医科大事件,弄不好就成了另一起彭宇案

亮见
2024-06-17 15:19:22
关于死亡,这可能是一篇颠覆你认知的文章!

关于死亡,这可能是一篇颠覆你认知的文章!

尚曦读史
2024-04-05 10:52:47
TVB老夫少妻林祖辉姚嘉妮结束18年婚姻,女方身材美貌仍在巅峰

TVB老夫少妻林祖辉姚嘉妮结束18年婚姻,女方身材美貌仍在巅峰

八卦宝宝
2024-06-18 01:24:57
朱婷等主力回北京,蔡斌透露新阵容,中国女排吴梦洁等将前往泰国

朱婷等主力回北京,蔡斌透露新阵容,中国女排吴梦洁等将前往泰国

海宝爱体育
2024-06-17 09:58:19
土地卖不动以后,为了保障体制内的工资,许多地方开始“大甩卖”

土地卖不动以后,为了保障体制内的工资,许多地方开始“大甩卖”

庞明说财经
2024-06-16 17:00:58
美国将伊拉克一民兵组织认定为恐怖组织

美国将伊拉克一民兵组织认定为恐怖组织

界面新闻
2024-06-18 07:19:53
比妖精还美!秒杀迪丽热巴的泰国第一神颜Mai,到底是什么来头?

比妖精还美!秒杀迪丽热巴的泰国第一神颜Mai,到底是什么来头?

娱乐白名单
2024-06-17 13:07:53
宁波大学研究生录取通知书英文单词少字母,学校:将重新制作

宁波大学研究生录取通知书英文单词少字母,学校:将重新制作

澎湃新闻
2024-06-17 13:24:27
英国对五家中国实体实施制裁

英国对五家中国实体实施制裁

未来半导体
2024-06-17 09:37:58
语惊四座,该国在瑞士和平峰会上替俄罗斯说了一句话

语惊四座,该国在瑞士和平峰会上替俄罗斯说了一句话

听风听你
2024-06-17 10:16:41
莱因克尔谈卢卡库第二球被吹:狗屁不通的判罚,简直是丑闻

莱因克尔谈卢卡库第二球被吹:狗屁不通的判罚,简直是丑闻

懂球帝
2024-06-18 04:02:22
新合同3年8000万!汤普森,哭了!勇士已经仁至义尽……

新合同3年8000万!汤普森,哭了!勇士已经仁至义尽……

篮球实战宝典
2024-06-17 14:37:29
严明党的政治纪律 坚决维护党中央权威和集中统一领导

严明党的政治纪律 坚决维护党中央权威和集中统一领导

人民资讯
2024-06-17 06:08:10
时机已到,扣押拘捕!中国海警发声:依法对菲船只采取管制措施

时机已到,扣押拘捕!中国海警发声:依法对菲船只采取管制措施

大风文字
2024-06-17 18:03:01
可悲!俞莉老师已停诊,回看这份处罚通报,才发现猫腻原来这么多

可悲!俞莉老师已停诊,回看这份处罚通报,才发现猫腻原来这么多

娱乐圈见解说
2024-06-17 19:08:03
俄乌就和平谈判隔空交锋

俄乌就和平谈判隔空交锋

环球时报国际
2024-06-17 06:11:14
女县长被18岁男技师杀死,背后真相龌龊不堪,30名老干部因此落马

女县长被18岁男技师杀死,背后真相龌龊不堪,30名老干部因此落马

摇扇公子聊天下
2024-02-03 14:00:09
2024-06-18 08:44:49
技术小生
技术小生
互联网技术与技术人的职业发展
942文章数 498关注度
往期回顾 全部

科技要闻

低价“6·18”没有狂欢

头条要闻

外媒炒作:中国首次将核弹头置于高度战备状态

头条要闻

外媒炒作:中国首次将核弹头置于高度战备状态

体育要闻

24年后,他们终于又在欧洲杯赢球了

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

广汽也想“掀桌子”了?

汽车要闻

传奇新篇章 全新一代大众迈腾来了

态度原创

教育
健康
时尚
本地
亲子

教育要闻

难倒全班同学的一道小学数学思维训练题,符号的运算规矩

晚餐不吃or吃七分饱,哪种更减肥?

夏季流行单品西装短裤的N种穿法,你学会了吗

本地新闻

能动司法尽“执”履责 ——“交叉执行”高效能

亲子要闻

女子晒自家的龙凤胎,两个小宝贝乖乖地等妈妈泡奶回来

无障碍浏览 进入关怀版