IDEA根据数据表自动生成实体类

第一次根据需求建了库,写实体类的时候一条条写太过麻烦,于是上网查找了一些资料一劳永逸一下。之前看到过别人使用自动生成的工具,不知道是Navicat自带的还是其他的工具,这次我使用的是idea的工具进行操作,记录一下操作步骤以便后续使用也分享一下。

简单的流程介绍

  1. 首先使用IDEA的Database链接数据库
  2. 修改Generate POJOs.groovy文件
  3. 选择指定的包下生成实体类

具体操作

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/,并在此基础上进行了些许修改,主要修改为:
  1. 使用了Lombok的@Data注解来处理get/set等方法,简化了原代码
  2. 修改使用@TableName注解来设置对应表名
  3. 去除了@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自动生成实体类相关推荐

  1. IDEA中根据数据库自动生成实体类,并自定义所生成的实体类中的注解 @Table @Id @...

    使用IDEA项目添加Hibernate扩展,生成实体类并配置实体类中的注解 一.使用Hibernate自动生成实体类 1.在项目上右键,选择Add Framework Support找到 Hibern ...

  2. 实体类dao接口mysql_利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件...

    解决问题: 可利用MyBatis生成器自动生成实体类.DAO接口和Mapping映射文件. 测试环境准备: 新建一个mysql数据库,例如mungerzTest. 生成一张主键为自增ID的学生表: C ...

  3. php写实体类,自动生成实体类(方式一)

    YMP框架自v1.0开始就支持通过数据库表结构自动生成实体类代码,所以v2.0版本不但重构了实体代码生成器,而且更简单好用! #------------------------------------ ...

  4. Mybatis自动生成实体类等代码

    Mybatis自动生成实体类等代码 具体步骤 具体步骤 在本机随便找个目录存放以下文件,如图(mybatis-generator-core-1.3.5.jar 和 mysql-connector-ja ...

  5. mysql 自动生成mapper_自动生成实体类、Mapper、Mapper.xml文件

    自动生成实体类.Mapper.Mapper.xml文件 搭建Spring Boot + Mysql + MyBatis 项目 核心 配置pom.xml 创建表 配置文件 生成文件 结果 项目结构 搭建 ...

  6. java实体类没有映射文件_MyBatis自动生成实体类、DAO和XML映射文件,并去掉实体类中的getter和setter方法...

    今天花了3个多小时搞定了这个事情,写个Blog记录一下,先看一下最终生成的实体类吧. packagecom.mybatis.pojo;importlombok.AllArgsConstructor;i ...

  7. 自动生成实体类、Mapper、Mapper.xml文件

    自动生成实体类.Mapper.Mapper.xml文件 搭建Spring Boot + Mysql + MyBatis 项目 核心 配置pom.xml 创建表 配置文件 生成文件 结果 项目结构 搭建 ...

  8. mybatis逆向工程的使用,自动生成实体类与基础SQL

    目录 简介 mybatis逆向工程的使用 导入依赖 编写逆向工程配置文件 编写执行方法 查看结果 简介 来分享一个比较使用的玩意,mybatis的逆向工程,可以自动生成实体类.基础SQL映射文件.Ma ...

  9. idea 集成mybatis,利用MyBatis Generator自动生成实体类、mapper文件

    最近一个老项目集成mybatis,利用 generator自动生成实体类.mapper的时候折腾了一小时,记录一下,避免以后再折腾 很简单的三步 https://gitee.com/shunangua ...

  10. 给EF框架自动生成实体类修改名字

    给EF框架自动生成实体类名字一般以T_ 开头,不符合我们给实体类起的名字这个时候如何进行修改呢? 右击2 选择属性 将属性中的实体集名称和名称改成自己想要的样子就可以啦~ 然后点击重新生成解决方案,我 ...

最新文章

  1. python经典案例-20个Python练手经典案例,能全做对的人确实很少!
  2. 【java】java获取对象属性类型、属性名称、属性值
  3. c# 再次尝试 连接失败_和平精英ios充值失败该怎么办
  4. Blazor 基础入门
  5. 堂妹问的一道暑假作业题,难住985的家长
  6. shell脚本执行时报“bad interpreter: Text file busy“的解决方法
  7. [译文]Domain Driven Design Reference(六)—— 提炼战略设计
  8. 利用js解析php的表单数据
  9. stn专线和otn有什么区别_专线网络和家庭宽带有什么区别?
  10. ffmpeg文档8:软件缩放
  11. 一个简单的二层系统分析全程
  12. mysql异构迁移_如何利用数据异构实现多级缓存和数据迁移
  13. 数学分析练习题答案一(自己做的)
  14. BIOS的启动原理学习--加载引导程序
  15. 国际及港澳台电话国家代码表
  16. 计算机木材染色 配色技术的应用技术,计算机配色技术在木材连缸染色中的应用研究.pdf...
  17. Proxmox VE
  18. qq授权登录【网站应用】-java版本
  19. VBA颜色转换 中英互译
  20. Android 中文API合集 最终版,androi中文api合集.doc

热门文章

  1. Oracle12C SGA PGA UGA
  2. 关于计算机的英语谜语,英语谜语大全及答案100个|英语谜语(50条)
  3. unity android 性能分析,Unity Profiler 性能分析
  4. mysql一段时间过后 无法连接_MYSQL连接一段时间不操作后出现异常的解决方案
  5. C/S客户端渗透测试(一)客户端渗透环境配置
  6. 宋朝记载的超新星爆发和光速不变
  7. go break跳出两层for循环
  8. SQL exists 删除重复记录
  9. gta5 android版数据包,gta5手机版数据包和apk
  10. 【国产加密算法-java实现SM3】