IDEA自动生成实体类
IDEA根据数据表自动生成实体类
第一次根据需求建了库,写实体类的时候一条条写太过麻烦,于是上网查找了一些资料一劳永逸一下。之前看到过别人使用自动生成的工具,不知道是Navicat自带的还是其他的工具,这次我使用的是idea的工具进行操作,记录一下操作步骤以便后续使用也分享一下。
简单的流程介绍
- 首先使用IDEA的Database链接数据库
- 修改Generate POJOs.groovy文件
- 选择指定的包下生成实体类
具体操作
IDEA顶部菜单栏选择View—Tool Windows—Database
点击Test Connection可以测试链接,进行相关的配置后点击Apply/OK
这时候右侧就可以找到Database的菜单栏了
右键点击一张表,选择Scripted Extensions — Generate POJOs.groovy,在弹出的对话框中选择想要创建实体类的包,点击ok就可以自动生成了
但是!自带的生成格式可能无法满足需求,比方说类名未必符合需求,没有使用Lombok自动生成get/set等方法,也没有生成注解等问题,所以需要修改Generate POJOs.groovy文件,用来自定义生成实体类的样式
同样的右键点击一张表,选择Scripted Extensions — Go To Scripts Directory可以找到生成实体类的相关配置文件,在此包下新建一个配置文件,这里我取名为Generate MyPOJOs.groovy,附上代码
- 此处参考了https://blog.csdn.net/qq_34371461/article/details/80571281/,并在此基础上进行了些许修改,主要修改为:
- 使用了Lombok的@Data注解来处理get/set等方法,简化了原代码
- 修改使用@TableName注解来设置对应表名
- 去除了@Column注解
可以根据个人不同的需求再进行其他的修改
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<DasObject>* PROJECT project* FILES files helper*/
packageName = ""
typeMapping = [(~/(?i)bigint/) : "Long",(~/(?i)tinyint|smallint|mediumint|int/) : "Integer",(~/(?i)bool|bit/) : "Boolean",(~/(?i)float|double|real/) : "Double",(~/(?i)decimal/) : "BigDecimal",(~/(?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 java.io.Serializable;"out.println "import lombok.Data;"out.println "import com.baomidou.mybatisplus.annotation.TableName;"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;"}if (types.contains("BigDecimal")) {out.println "import java.math.BigDecimal;"}out.println ""out.println "@Data"out.println "@TableName(\""+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() }.valuedef 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.htms = 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 strif(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;"
}
修改后再次右键点击表名,选我们刚刚新建的文件,再选择包进行创建实体类
这次创建的实体类中可以看到使用了Lombok并且表中对应的注解也写了进来,也进行了驼峰命名转换,完美符合了我的需求
至此,问题解决,可以不再为建实体类而发愁了。
PS. 如果有帮助欢迎采用转载
IDEA自动生成实体类相关推荐
- IDEA中根据数据库自动生成实体类,并自定义所生成的实体类中的注解 @Table @Id @...
使用IDEA项目添加Hibernate扩展,生成实体类并配置实体类中的注解 一.使用Hibernate自动生成实体类 1.在项目上右键,选择Add Framework Support找到 Hibern ...
- 实体类dao接口mysql_利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件...
解决问题: 可利用MyBatis生成器自动生成实体类.DAO接口和Mapping映射文件. 测试环境准备: 新建一个mysql数据库,例如mungerzTest. 生成一张主键为自增ID的学生表: C ...
- php写实体类,自动生成实体类(方式一)
YMP框架自v1.0开始就支持通过数据库表结构自动生成实体类代码,所以v2.0版本不但重构了实体代码生成器,而且更简单好用! #------------------------------------ ...
- Mybatis自动生成实体类等代码
Mybatis自动生成实体类等代码 具体步骤 具体步骤 在本机随便找个目录存放以下文件,如图(mybatis-generator-core-1.3.5.jar 和 mysql-connector-ja ...
- mysql 自动生成mapper_自动生成实体类、Mapper、Mapper.xml文件
自动生成实体类.Mapper.Mapper.xml文件 搭建Spring Boot + Mysql + MyBatis 项目 核心 配置pom.xml 创建表 配置文件 生成文件 结果 项目结构 搭建 ...
- java实体类没有映射文件_MyBatis自动生成实体类、DAO和XML映射文件,并去掉实体类中的getter和setter方法...
今天花了3个多小时搞定了这个事情,写个Blog记录一下,先看一下最终生成的实体类吧. packagecom.mybatis.pojo;importlombok.AllArgsConstructor;i ...
- 自动生成实体类、Mapper、Mapper.xml文件
自动生成实体类.Mapper.Mapper.xml文件 搭建Spring Boot + Mysql + MyBatis 项目 核心 配置pom.xml 创建表 配置文件 生成文件 结果 项目结构 搭建 ...
- mybatis逆向工程的使用,自动生成实体类与基础SQL
目录 简介 mybatis逆向工程的使用 导入依赖 编写逆向工程配置文件 编写执行方法 查看结果 简介 来分享一个比较使用的玩意,mybatis的逆向工程,可以自动生成实体类.基础SQL映射文件.Ma ...
- idea 集成mybatis,利用MyBatis Generator自动生成实体类、mapper文件
最近一个老项目集成mybatis,利用 generator自动生成实体类.mapper的时候折腾了一小时,记录一下,避免以后再折腾 很简单的三步 https://gitee.com/shunangua ...
- 给EF框架自动生成实体类修改名字
给EF框架自动生成实体类名字一般以T_ 开头,不符合我们给实体类起的名字这个时候如何进行修改呢? 右击2 选择属性 将属性中的实体集名称和名称改成自己想要的样子就可以啦~ 然后点击重新生成解决方案,我 ...
最新文章
- python经典案例-20个Python练手经典案例,能全做对的人确实很少!
- 【java】java获取对象属性类型、属性名称、属性值
- c# 再次尝试 连接失败_和平精英ios充值失败该怎么办
- Blazor 基础入门
- 堂妹问的一道暑假作业题,难住985的家长
- shell脚本执行时报“bad interpreter: Text file busy“的解决方法
- [译文]Domain Driven Design Reference(六)—— 提炼战略设计
- 利用js解析php的表单数据
- stn专线和otn有什么区别_专线网络和家庭宽带有什么区别?
- ffmpeg文档8:软件缩放
- 一个简单的二层系统分析全程
- mysql异构迁移_如何利用数据异构实现多级缓存和数据迁移
- 数学分析练习题答案一(自己做的)
- BIOS的启动原理学习--加载引导程序
- 国际及港澳台电话国家代码表
- 计算机木材染色 配色技术的应用技术,计算机配色技术在木材连缸染色中的应用研究.pdf...
- Proxmox VE
- qq授权登录【网站应用】-java版本
- VBA颜色转换 中英互译
- Android 中文API合集 最终版,androi中文api合集.doc
热门文章
- Oracle12C SGA PGA UGA
- 关于计算机的英语谜语,英语谜语大全及答案100个|英语谜语(50条)
- unity android 性能分析,Unity Profiler 性能分析
- mysql一段时间过后 无法连接_MYSQL连接一段时间不操作后出现异常的解决方案
- C/S客户端渗透测试(一)客户端渗透环境配置
- 宋朝记载的超新星爆发和光速不变
- go break跳出两层for循环
- SQL exists 删除重复记录
- gta5 android版数据包,gta5手机版数据包和apk
- 【国产加密算法-java实现SM3】