Intellij IDEA 通过数据库表生成带注解的实体类Generate MyPOJOs.groovy脚本的编写
- //两段代码第一个是mybatis-plus的 第二个spring-jpa的,jpa的是我复制别人的,是本体,mybatis的是我改的
//idea连接数据方法见 https://www.cnblogs.com/yahe/p/17143089.html
//脚本使用方式参见 https://www.qyyshop.com/info/989669.html
- 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
- 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 = javaName(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) }
- }
- // 获取包所在文件夹路径
- 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 com.baomidou.mybatisplus.annotation.TableName;"
- out.println "import lombok.Data;"
- out.println "import java.io.Serializable;"
- 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 tian\n" +
- " * @Date " + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " \n" +
- " */"
- 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// ${it.commoent.toString()}"
- }
- 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 : ""
- ]
- 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 = 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;"
- }
- 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)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;"
- }
Intellij IDEA 通过数据库表生成带注解的实体类Generate MyPOJOs.groovy脚本的编写的更多相关文章
- 利用HibernateTools从数据库表生成带注解的POJO
在SSH框架中,如果先设计好了数据库,那么下一步就需要从数据库Table生成实体java类和hbm.xml配置文件.在最新的开发框架中,已经支持使用注解,从而避免了繁琐的hbm.xml配置,而且我们可 ...
- T4 模板自动生成带注释的实体类文件
T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll 生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 如果你没有 ...
- Intellij IDEA 通过数据库表逆向生成带注释的实体类文件超级详细步骤,附详细解决方案
参考:https://blog.csdn.net/qq_34371461/article/details/80571281 https://blog.csdn.net/mqchenrong/arti ...
- Eclipse中通过Hibernate Tools插件实现从数据库逆向生成Hibernate带注解的实体类
一.安装hibernate tools插件 1.在线安装 通过Eclipse的Help->Install New Software 在线安装插件,插件连接为: eclipse helios(3. ...
- idea 从数据库快速生成Spring Data JPA实体类
第一步,调出 Persistence 窗口. File—>Project Structure—>model—> + —>JPA 第二步:打开 Persistence窗口 配置 ...
- mybatis generator 使用教程(生成带注释的实体类)
引言: 最近的一个项目,由于数据库表巨多,导致需要创建N多个java实体.dao.mapper.xml映射文件,如果均使用纯手工编写,无疑需要耗费大量时间和精力.于是上网学习了mybatis gene ...
- Eclipse从数据库逆向生成Hibernate带注解的实体类
http://www.2cto.com/database/201501/372023.html
- T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll
生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 ,一定要自已新建,把T4代码复制进去,好多人因为用我现成的T4报错(原因不明) 点击添加文 ...
- 批量产生ssh2项目中hibernate带注解的pojo类的快捷方法
近几个月一直在忙于项目组的ios应用项目的开发,没有太多时间去研究web应用方面的问题了.刚好,昨天有网友问到如何批量产生hibernate带注解的pojo类的快捷方法,所谓批量就是指将当前数据库中所 ...
- 【动软.Net代码生成器】连接MySQL生成C#的POCO实体类(Model)
首先是工具的下载地址: 动软.Net代码生成器 该工具官网自带完整教程: 文档:http://www.maticsoft.com/help/ 例子:http://www.maticsoft.com/h ...
随机推荐
- Spring IoC的一些知识点
在日常开发中,接触得比较多的算是Spring生态了,Spring Ioc是Spring Framework重要的组成部分,下面整理了一些Spring Ioc的知识点. 1. 什么是IoC IoC(In ...
- Kali Win-KeX SL
内容: 概述 先决条件 用法 开始 声音支持 多屏支持 停止 概述 无缝模式下的 Win-KeX 将在 Windows 桌面的屏幕顶部启动 Kali Linux 面板. 通过面板启动的应用程序将与 M ...
- C/C++语言 MD5例子
之前研究了一下在C中进行MD5加密,由于找了很久没有找到现成的库文件,所以所幸自己去写了一下.个人感觉C的便捷性没有Python好的原因就是这里. 下面是我写的一个例子. mian.cpp: 点击查看 ...
- [编程基础] C++多线程入门4-数据共享和资源竞争
原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++ 11标准. 4 数据共享和资源 ...
- Spark框架下均值漂移算法对舆情聚类的分析
知网链接 原文链接 张京坤, 王怡怡 软件导刊 2022年21卷第6期 页码:141-146 DOI:10.11907/rjdk.211889 中图分类号:TP274 纸质出版日期:202 ...
- Flutter异常监控 - 伍 | 关于异常监控框架设计的思考
前言 最近阅读 Catcher.BugSnag.Rollbar 三个 Flutter 异常监控开源框架,文章链接如下: Flutter 异常监控 - 壹 | 从 Zone 说起 Flutter 异常监 ...
- 小白从零到AIoT之路(前言)
什么是AIoT 简单来说就是AI(人工智能)+IoT(物联网)= AIoT(人工智能物联网). AIoT融合AI技术和IoT技术,通过物联网产生.收集来自不同维度的.海量的数据存储于云端.边缘端,再通 ...
- 构建api gateway之 负载均衡
什么是负载均衡 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡.分摊到多个操作单元上进行运行 以下为几种负载均衡策略介绍 1.随机(Random) 大家很多时候说 ...
- DataX二次开发——新增HiveReader插件
一.研发背景 DataX官方开源的版本支持HDFS文件的读写,并没有支持基于JDBC的Hive数据读写,很多时候一些数据同步不太方便,比如在读取Hive之前先执行一些sql.读取一些Hive的视图数据 ...
- 虚拟DOM中给同一层级的元素设置固定且唯一的key为什么能提高性能
一.文字 key让React知道,当前新生成的React元素中的元素,是否能在之前生成的React元素中找到对应的.如果有,那么直接拿过来用就行了.假设列表头部插入一项,通过比对,React知道除了头 ...