1. //两段代码第一个是mybatis-plus的 第二个spring-jpa的,jpa的是我复制别人的,是本体,mybatis的是我改的
    //idea连接数据方法见 https://www.cnblogs.com/yahe/p/17143089.html
    //脚本使用方式参见 https://www.qyyshop.com/info/989669.html
  1. import com.intellij.database.model.DasTable
  2. import com.intellij.database.model.ObjectKind
  3. import com.intellij.database.util.Case
  4. import com.intellij.database.util.DasUtil
  5. import java.io.*
  6. import java.text.SimpleDateFormat
  7.  
  8. packageName = ""
  9. typeMapping = [
  10. (~/(?i)tinyint|smallint|mediumint/) : "Integer",
  11. (~/(?i)int/) : "Long",
  12. (~/(?i)bool|bit/) : "Boolean",
  13. (~/(?i)float|double|decimal|real/) : "Double",
  14. (~/(?i)datetime|timestamp|date|time/) : "Date",
  15. (~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",
  16. (~/(?i)/) : "String"
  17. ]
  18.  
  19. FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
  20. SELECTION.filter { it instanceof DasTable && it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) }
  21. }
  22.  
  23. def generate(table, dir) {
  24. def className = javaName(table.getName(), true)
  25. def fields = calcFields(table)
  26. packageName = getPackageName(dir)
  27. PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "UTF-8"))
  28. printWriter.withPrintWriter { out -> generate(out, className, fields, table) }
  29.  
  30. }
  31.  
  32. // 获取包所在文件夹路径
  33. def getPackageName(dir) {
  34. return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
  35. }
  36.  
  37. def generate(out, className, fields, table) {
  38. out.println "package $packageName"
  39. out.println ""
  40. out.println "import com.baomidou.mybatisplus.annotation.TableName;"
  41. out.println "import lombok.Data;"
  42. out.println "import java.io.Serializable;"
  43.  
  44. Set types = new HashSet()
  45.  
  46. fields.each() {
  47. types.add(it.type)
  48. }
  49.  
  50. if (types.contains("Date")) {
  51. out.println "import java.util.Date;"
  52. }
  53.  
  54. if (types.contains("InputStream")) {
  55. out.println "import java.io.InputStream;"
  56. }
  57. out.println ""
  58. out.println "/**\n" +
  59. " * @Description \n" +
  60. " * @Author tian\n" +
  61. " * @Date " + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " \n" +
  62. " */"
  63. out.println ""
  64. out.println "@Data"
  65. out.println "@TableName ( \"" + table.getName() + "\" )"
  66. out.println "public class $className implements Serializable {"
  67. out.println ""
  68. out.println genSerialID()
  69. fields.each() {
  70. out.println ""
  71. // 输出注释
  72. if (isNotEmpty(it.commoent)) {
  73. out.println "\t// ${it.commoent.toString()}"
  74. }
  75.  
  76. if (it.annos != "") out.println " ${it.annos.replace("[@Id]", "")}"
  77.  
  78. // 输出成员变量
  79. out.println "\tprivate ${it.type} ${it.name};"
  80. }
  81.  
  82. // 输出get/set方法
  83. // fields.each() {
  84. // out.println ""
  85. // out.println "\tpublic ${it.type} get${it.name.capitalize()}() {"
  86. // out.println "\t\treturn this.${it.name};"
  87. // out.println "\t}"
  88. // out.println ""
  89. //
  90. // out.println "\tpublic void set${it.name.capitalize()}(${it.type} ${it.name}) {"
  91. // out.println "\t\tthis.${it.name} = ${it.name};"
  92. // out.println "\t}"
  93. // }
  94. out.println ""
  95. out.println "}"
  96. }
  97.  
  98. def calcFields(table) {
  99. DasUtil.getColumns(table).reduce([]) { fields, col ->
  100. def spec = Case.LOWER.apply(col.getDataType().getSpecification())
  101.  
  102. def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
  103. def comm = [
  104. colName : col.getName(),
  105. name : javaName(col.getName(), false),
  106. type : typeStr,
  107. commoent: col.getComment()
  108. ,annos : ""
  109. ]
  110. if ("id".equals(Case.LOWER.apply(col.getName())))
  111. comm.annos += ["@Id"]
  112. fields += [comm]
  113. }
  114. }
  115.  
  116. // 处理类名(这里是因为我的表都是以t_命名的,所以需要处理去掉生成类名时的开头的T,
  117. // 如果你不需要那么请查找用到了 javaClassName这个方法的地方修改为 javaName 即可)
  118. def javaClassName(str, capitalize) {
  119. def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
  120. .collect { Case.LOWER.apply(it).capitalize() }
  121. .join("")
  122. .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
  123. // 去除开头的T http://developer.51cto.com/art/200906/129168.htm
  124. s = s[1..s.size() - 1]
  125. capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
  126. }
  127.  
  128. def javaName(str, capitalize) {
  129. def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
  130. .collect { Case.LOWER.apply(it).capitalize() }
  131. .join("")
  132. .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
  133. capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
  134. }
  135.  
  136. def isNotEmpty(content) {
  137. return content != null && content.toString().trim().length() > 0
  138. }
  139.  
  140. static String changeStyle(String str, boolean toCamel) {
  141. if (!str || str.size() <= 1)
  142. return str
  143.  
  144. if (toCamel) {
  145. String r = str.toLowerCase().split('_').collect { cc -> Case.LOWER.apply(cc).capitalize() }.join('')
  146. return r[0].toLowerCase() + r[1..-1]
  147. } else {
  148. str = str[0].toLowerCase() + str[1..-1]
  149. return str.collect { cc -> ((char) cc).isUpperCase() ? '_' + cc.toLowerCase() : cc }.join('')
  150. }
  151. }
  152.  
  153. static String genSerialID() {
  154. return "\tprivate static final long serialVersionUID = " + Math.abs(new Random().nextLong()) + "L;"
  155. }

  

  1. import com.intellij.database.model.DasTable
  2. import com.intellij.database.model.ObjectKind
  3. import com.intellij.database.util.Case
  4. import com.intellij.database.util.DasUtil
  5. import java.io.*
  6. import java.text.SimpleDateFormat
  7.  
  8. /*
  9. * Available context bindings:
  10. * SELECTION Iterable<DasObject>
  11. * PROJECT project
  12. * FILES files helper
  13. */
  14. packageName = ""
  15. typeMapping = [
  16. (~/(?i)tinyint|smallint|mediumint/) : "Integer",
  17. (~/(?i)int/) : "Long",
  18. (~/(?i)bool|bit/) : "Boolean",
  19. (~/(?i)float|double|decimal|real/) : "Double",
  20. (~/(?i)datetime|timestamp|date|time/) : "Date",
  21. (~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",
  22. (~/(?i)/) : "String"
  23. ]
  24.  
  25. FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
  26. SELECTION.filter { it instanceof DasTable && it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) }
  27. }
  28.  
  29. def generate(table, dir) {
  30. def className = javaClassName(table.getName(), true)
  31. def fields = calcFields(table)
  32. packageName = getPackageName(dir)
  33. PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "UTF-8"))
  34. printWriter.withPrintWriter {out -> generate(out, className, fields,table)}
  35.  
  36. // new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields,table) }
  37. }
  38.  
  39. // 获取包所在文件夹路径
  40. def getPackageName(dir) {
  41. return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
  42. }
  43.  
  44. def generate(out, className, fields,table) {
  45. out.println "package $packageName"
  46. out.println ""
  47. out.println "import javax.persistence.Column;"
  48. out.println "import javax.persistence.Entity;"
  49. out.println "import javax.persistence.Table;"
  50. out.println "import java.io.Serializable;"
  51. out.println "import lombok.Getter;"
  52. out.println "import lombok.Setter;"
  53. out.println "import lombok.ToString;"
  54. Set types = new HashSet()
  55.  
  56. fields.each() {
  57. types.add(it.type)
  58. }
  59.  
  60. if (types.contains("Date")) {
  61. out.println "import java.util.Date;"
  62. }
  63.  
  64. if (types.contains("InputStream")) {
  65. out.println "import java.io.InputStream;"
  66. }
  67. out.println ""
  68. out.println "/**\n" +
  69. " * @Description \n" +
  70. " * @Author Hunter\n" +
  71. " * @Date "+ new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " \n" +
  72. " */"
  73. out.println ""
  74. out.println "@Setter"
  75. out.println "@Getter"
  76. out.println "@ToString"
  77. out.println "@Entity"
  78. out.println "@Table ( name =\""+table.getName() +"\" )"
  79. out.println "public class $className implements Serializable {"
  80. out.println ""
  81. out.println genSerialID()
  82. fields.each() {
  83. out.println ""
  84. // 输出注释
  85. if (isNotEmpty(it.commoent)) {
  86. out.println "\t/**"
  87. out.println "\t * ${it.commoent.toString()}"
  88. out.println "\t */"
  89. }
  90.  
  91. if (it.annos != "") out.println " ${it.annos.replace("[@Id]", "")}"
  92.  
  93. // 输出成员变量
  94. out.println "\tprivate ${it.type} ${it.name};"
  95. }
  96.  
  97. // 输出get/set方法
  98. // fields.each() {
  99. // out.println ""
  100. // out.println "\tpublic ${it.type} get${it.name.capitalize()}() {"
  101. // out.println "\t\treturn this.${it.name};"
  102. // out.println "\t}"
  103. // out.println ""
  104. //
  105. // out.println "\tpublic void set${it.name.capitalize()}(${it.type} ${it.name}) {"
  106. // out.println "\t\tthis.${it.name} = ${it.name};"
  107. // out.println "\t}"
  108. // }
  109. out.println ""
  110. out.println "}"
  111. }
  112.  
  113. def calcFields(table) {
  114. DasUtil.getColumns(table).reduce([]) { fields, col ->
  115. def spec = Case.LOWER.apply(col.getDataType().getSpecification())
  116.  
  117. def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
  118. def comm =[
  119. colName : col.getName(),
  120. name : javaName(col.getName(), false),
  121. type : typeStr,
  122. commoent: col.getComment(),
  123. annos: "\t@Column(name = \""+col.getName()+"\" )"]
  124. if("id".equals(Case.LOWER.apply(col.getName())))
  125. comm.annos +=["@Id"]
  126. fields += [comm]
  127. }
  128. }
  129.  
  130. // 处理类名(这里是因为我的表都是以t_命名的,所以需要处理去掉生成类名时的开头的T,
  131. // 如果你不需要那么请查找用到了 javaClassName这个方法的地方修改为 javaName 即可)
  132. def javaClassName(str, capitalize) {
  133. def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
  134. .collect { Case.LOWER.apply(it).capitalize() }
  135. .join("")
  136. .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
  137. // 去除开头的T http://developer.51cto.com/art/200906/129168.htm
  138. s = s[1..s.size() - 1]
  139. capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
  140. }
  141.  
  142. def javaName(str, capitalize) {
  143. // def s = str.split(/(?<=[^\p{IsLetter}])/).collect { Case.LOWER.apply(it).capitalize() }
  144. // .join("").replaceAll(/[^\p{javaJavaIdentifierPart}]/, "_")
  145. // capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
  146. def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
  147. .collect { Case.LOWER.apply(it).capitalize() }
  148. .join("")
  149. .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
  150. capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
  151. }
  152.  
  153. def isNotEmpty(content) {
  154. return content != null && content.toString().trim().length() > 0
  155. }
  156.  
  157. static String changeStyle(String str, boolean toCamel){
  158. if(!str || str.size() <= 1)
  159. return str
  160.  
  161. if(toCamel){
  162. String r = str.toLowerCase().split('_').collect{cc -> Case.LOWER.apply(cc).capitalize()}.join('')
  163. return r[0].toLowerCase() + r[1..-1]
  164. }else{
  165. str = str[0].toLowerCase() + str[1..-1]
  166. return str.collect{cc -> ((char)cc).isUpperCase() ? '_' + cc.toLowerCase() : cc}.join('')
  167. }
  168. }
  169.  
  170. static String genSerialID()
  171. {
  172. return "\tprivate static final long serialVersionUID = "+Math.abs(new Random().nextLong())+"L;"
  173. }

  

Intellij IDEA 通过数据库表生成带注解的实体类Generate MyPOJOs.groovy脚本的编写的更多相关文章

  1. 利用HibernateTools从数据库表生成带注解的POJO

    在SSH框架中,如果先设计好了数据库,那么下一步就需要从数据库Table生成实体java类和hbm.xml配置文件.在最新的开发框架中,已经支持使用注解,从而避免了繁琐的hbm.xml配置,而且我们可 ...

  2. T4 模板自动生成带注释的实体类文件

    T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll 生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 如果你没有 ...

  3. Intellij IDEA 通过数据库表逆向生成带注释的实体类文件超级详细步骤,附详细解决方案

    参考:https://blog.csdn.net/qq_34371461/article/details/80571281  https://blog.csdn.net/mqchenrong/arti ...

  4. Eclipse中通过Hibernate Tools插件实现从数据库逆向生成Hibernate带注解的实体类

    一.安装hibernate tools插件 1.在线安装 通过Eclipse的Help->Install New Software 在线安装插件,插件连接为: eclipse helios(3. ...

  5. idea 从数据库快速生成Spring Data JPA实体类

    第一步,调出 Persistence 窗口. File—>Project Structure—>model—> + —>JPA 第二步:打开 Persistence窗口 配置 ...

  6. mybatis generator 使用教程(生成带注释的实体类)

    引言: 最近的一个项目,由于数据库表巨多,导致需要创建N多个java实体.dao.mapper.xml映射文件,如果均使用纯手工编写,无疑需要耗费大量时间和精力.于是上网学习了mybatis gene ...

  7. Eclipse从数据库逆向生成Hibernate带注解的实体类

    http://www.2cto.com/database/201501/372023.html

  8. T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll

    生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 ,一定要自已新建,把T4代码复制进去,好多人因为用我现成的T4报错(原因不明) 点击添加文 ...

  9. 批量产生ssh2项目中hibernate带注解的pojo类的快捷方法

    近几个月一直在忙于项目组的ios应用项目的开发,没有太多时间去研究web应用方面的问题了.刚好,昨天有网友问到如何批量产生hibernate带注解的pojo类的快捷方法,所谓批量就是指将当前数据库中所 ...

  10. 【动软.Net代码生成器】连接MySQL生成C#的POCO实体类(Model)

    首先是工具的下载地址: 动软.Net代码生成器 该工具官网自带完整教程: 文档:http://www.maticsoft.com/help/ 例子:http://www.maticsoft.com/h ...

随机推荐

  1. Spring IoC的一些知识点

    在日常开发中,接触得比较多的算是Spring生态了,Spring Ioc是Spring Framework重要的组成部分,下面整理了一些Spring Ioc的知识点. 1. 什么是IoC IoC(In ...

  2. Kali Win-KeX SL

    内容: 概述 先决条件 用法 开始 声音支持 多屏支持 停止 概述 无缝模式下的 Win-KeX 将在 Windows 桌面的屏幕顶部启动 Kali Linux 面板. 通过面板启动的应用程序将与 M ...

  3. C/C++语言 MD5例子

    之前研究了一下在C中进行MD5加密,由于找了很久没有找到现成的库文件,所以所幸自己去写了一下.个人感觉C的便捷性没有Python好的原因就是这里. 下面是我写的一个例子. mian.cpp: 点击查看 ...

  4. [编程基础] C++多线程入门4-数据共享和资源竞争

    原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++ 11标准. 4 数据共享和资源 ...

  5. Spark框架下均值漂移算法对舆情聚类的分析

    知网链接 原文链接 张京坤,  王怡怡 软件导刊   2022年21卷第6期 页码:141-146 DOI:10.11907/rjdk.211889    中图分类号:TP274 纸质出版日期:202 ...

  6. Flutter异常监控 - 伍 | 关于异常监控框架设计的思考

    前言 最近阅读 Catcher.BugSnag.Rollbar 三个 Flutter 异常监控开源框架,文章链接如下: Flutter 异常监控 - 壹 | 从 Zone 说起 Flutter 异常监 ...

  7. 小白从零到AIoT之路(前言)

    什么是AIoT 简单来说就是AI(人工智能)+IoT(物联网)= AIoT(人工智能物联网). AIoT融合AI技术和IoT技术,通过物联网产生.收集来自不同维度的.海量的数据存储于云端.边缘端,再通 ...

  8. 构建api gateway之 负载均衡

    什么是负载均衡 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡.分摊到多个操作单元上进行运行 以下为几种负载均衡策略介绍 1.随机(Random) 大家很多时候说 ...

  9. DataX二次开发——新增HiveReader插件

    一.研发背景 DataX官方开源的版本支持HDFS文件的读写,并没有支持基于JDBC的Hive数据读写,很多时候一些数据同步不太方便,比如在读取Hive之前先执行一些sql.读取一些Hive的视图数据 ...

  10. 虚拟DOM中给同一层级的元素设置固定且唯一的key为什么能提高性能

    一.文字 key让React知道,当前新生成的React元素中的元素,是否能在之前生成的React元素中找到对应的.如果有,那么直接拿过来用就行了.假设列表头部插入一项,通过比对,React知道除了头 ...