From 65b0584c45f182f57f53edcaf898442f13a31c80 Mon Sep 17 00:00:00 2001 From: "MOSHOW.K.ZHENG" Date: Tue, 26 Nov 2019 21:56:46 +0800 Subject: [PATCH 1/7] Update index.ftl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复缺失的字段 --- generator-web/src/main/resources/templates/index.ftl | 1 + 1 file changed, 1 insertion(+) diff --git a/generator-web/src/main/resources/templates/index.ftl b/generator-web/src/main/resources/templates/index.ftl index 3433d28f..1eb4abfa 100644 --- a/generator-web/src/main/resources/templates/index.ftl +++ b/generator-web/src/main/resources/templates/index.ftl @@ -57,6 +57,7 @@ "returnUtil":$("#returnUtil").val(), "authorName":$("#authorName").val(), "dataType":$("#dataType").val(), + "tinyintTransType":$("#tinyintTransType").val(), "nameCaseType":$("#nameCaseType").val() }, dataType: "json", From a68989be669798af78aa9aeaaefdaab3a483ba3e Mon Sep 17 00:00:00 2001 From: "MOSHOW.K.ZHENG" Date: Tue, 26 Nov 2019 22:45:23 +0800 Subject: [PATCH 2/7] =?UTF-8?q?1.springboot2=E5=86=85=E7=BD=AEtomcat?= =?UTF-8?q?=E6=9B=B4=E6=8D=A2=E4=B8=BA=E6=80=A7=E8=83=BD=E6=9B=B4=E5=BC=BA?= =?UTF-8?q?=E5=A4=A7=E7=9A=84undertow=202.=E4=BF=AE=E5=A4=8DtinyintTransTy?= =?UTF-8?q?pe=E5=8F=82=E6=95=B0=E4=B8=A2=E5=A4=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.springboot2内置tomcat更换为性能更强大的undertow 2.修复tinyintTransType参数丢失问题 --- README.md | 1 + codegenerator4.png | Bin 0 -> 150503 bytes generator-web/pom.xml | 15 +++++----- .../generator/controller/IndexController.java | 2 ++ .../system/generator/util/TableParseUtil.java | 2 -- .../src/main/resources/application.yml | 28 +++++++++++------- pom.xml | 22 ++++++++++---- 7 files changed, 45 insertions(+), 25 deletions(-) create mode 100644 codegenerator4.png diff --git a/README.md b/README.md index e745f5f0..c2841c14 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ |更新日期|更新内容| |-|-| +|20191126|1.springboot2内置tomcat更换为性能更强大的undertow 2.修复tinyintTransType参数丢失问题 | |20191124|1.java代码结构优化. 2.新增简单的json生成模式 3.新增简单的正则表达式匹配模式(感谢@ydq的贡献) 4.新增对复制String代码中的乱SQL代码的支持 5.优化对JSON的父子节点/处理,JSONObject和JSONArray节点处理,子节点缺失'{'头处理| |20191123|1.移除频繁出错和被过滤的layer,改为jquery-toast. 2.Util功能优化,新增json和xml.| |20191116|优化对primary关键字的处理(感谢@liujiansgit的反馈). | diff --git a/codegenerator4.png b/codegenerator4.png new file mode 100644 index 0000000000000000000000000000000000000000..e1d23e414daa9210fe258bc4b224c2b488489089 GIT binary patch literal 150503 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�qoI(h9fcS?Wb8|#Y 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 +cuacE~U@3j+p0 zodd}=`qQd}#H!1K9?9{+@Y9xkg^)^R_Vob~U^UqJM0?AT`X)XBJs>jH-QzQAW^q2e z(|&TKc?C;fAMsldkC&n@^0;ajq!bYcDN3Ow6U}xT^atRwe?FiS$q&D}D`r3K1Oh#YXWR*O9&|ew3f42t@y!sfWQRS`qszf!l*l~ zF&s=AvCZqSySZ+{a&5VD07PtQGBbna(Jwnw=GNv` zkM+j^pH$eN2A=mv!PB~ZV_tkbvF&xs1x4QyL+i`JWBtW?4uYipzuC15TTRA$M< zm+_Z}U~F)lLNSO|`c;kQL22c9$ru#KhNbBsGwi<}&UO}?o#-Qx3};URa&$DZ@G`=> zd6>#2g$mUe{5g$;#PjVUq$!=Li8ms;n57~#CdiP{MfRZFMC`UqcY@-)!`+_d8N|Xi z(|xx>k3`F2ATC?NZQ#I;i{y<;qSjP7&O#Zk;LaesqjtVve5c>Udi~Y3`!gAbOfphLlC^gzO zUYYK}8M-dgsCTDk_DhI-;6M z%$I0NZ%ZM#;l;MjDBtobc+vDLZkk7m#7uz>FVPh&aTe~w6;4Z&JOJq={2F1&s@hox zOO|&m8FGpFDT+pGiaG~(7wK@BmV%zKWdRq#W>Cq zJH*)VEtZy)T*mo`aj{MxE6ZDn80>X)T3J^k(!`^GTv9^c*R77gPM>|Y0ia&(w1@D_5r)5N&*okN>U#R5$1vx8y!_;YbZ#ow|PU91|Jr5FT%G|@zBeVmlbYu;i~zjw+RdJ zsanX%=jYm@EV=@eZ5`pvbq|nO=x1TA<}-C0GBFDaosr1AAlB}xhHIRj)n#$@z1TI| zsk4)+gbo@fZi}bjxv1_1OD(uR_E1ktzxKhT|7~SzN^MrXaI;%`%{nWGtT9Zopqa8 z0kI|hb$*UDKGc0pJ~ecd-8(YLzO}@7F}C)KzInn!sHBR7yWsge#?w$iiN7K^5^ta+ zciKwpGkmbcJ#GOA*aP+FdZ~1x&X4K89J*WK>8|}5CsPTY-!5s5^+kGI&f_0z2{~>R zkR!Xs0Jh*ByC_S>=?Ex|4i9lFlL&EZH4Y=%r7@!EgN(d6)#yFXtKPdl->#g2l$PG; zfI1LteD0Z1)qsPN#`)-bgEm3ALY-ITmL-a@`E$6c1fYV$K~|eaR*StM*bKyyZbuDC zVKeHTbUqd~vMKO;-G9zSA{}cA@4D(f)6-6aB;C3D@enb#zgt)Rln~leMB{4hU?PkH z@$#Egojs?q?V~f2QJorlXA*2n>pMCEN?t&tpMV0r2IV<@AYg1ic&P!V)oxvX@1@YL z6tP?krcv$l8MVoKn!$B&Mo^kK$^k6-f_}p{l2L^;Yl!f5o!6S~5&2<#&3t0+Y6jhS z(SNIu-;4dK(@-v*J4sRl2dCaBG$T-sdybDbcP z$ylu`qyLUGKc)<(YXk!Pkd{youM;&2`d^k71MmO< literal 0 HcmV?d00001 diff --git a/generator-web/pom.xml b/generator-web/pom.xml index 3ca5e97d..ceaa594b 100644 --- a/generator-web/pom.xml +++ b/generator-web/pom.xml @@ -38,10 +38,10 @@ spring-boot-starter-data-jpa --> - + @@ -65,7 +65,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 + 3.8.1 true javac @@ -87,25 +87,24 @@ org.apache.maven.plugins maven-resources-plugin - 3.0.1 + 3.1.0 true - + org.springframework.boot spring-boot-maven-plugin - 2.0.4.RELEASE diff --git a/generator-web/src/main/java/com/softdev/system/generator/controller/IndexController.java b/generator-web/src/main/java/com/softdev/system/generator/controller/IndexController.java index 4df4b894..31c73812 100644 --- a/generator-web/src/main/java/com/softdev/system/generator/controller/IndexController.java +++ b/generator-web/src/main/java/com/softdev/system/generator/controller/IndexController.java @@ -62,6 +62,8 @@ public ReturnT> codeGenerate( ParamInfo paramInfo ) { params.put("packageName", paramInfo.getPackageName()); params.put("returnUtil", paramInfo.getReturnUtil()); + log.info("generator table:"+(classInfo==null?"":classInfo.getTableName())); + // generate the code 需要加新的模板请在里面改 Map result = generatorService.getResultByParams(params); diff --git a/generator-web/src/main/java/com/softdev/system/generator/util/TableParseUtil.java b/generator-web/src/main/java/com/softdev/system/generator/util/TableParseUtil.java index 843bf3eb..31c1c28d 100644 --- a/generator-web/src/main/java/com/softdev/system/generator/util/TableParseUtil.java +++ b/generator-web/src/main/java/com/softdev/system/generator/util/TableParseUtil.java @@ -42,9 +42,7 @@ public static ClassInfo processTableIntoClassInfo(ParamInfo paramInfo) //deal with special character tableSql = tableSql.trim().replaceAll("'","`").replaceAll("\"","`").replaceAll(",",",").toLowerCase(); //deal with java string copy \n" - System.out.println(tableSql); tableSql = tableSql.trim().replaceAll("n`","").replaceAll("\\+","").replaceAll("``","`").replaceAll("\\\\",""); - System.out.println(tableSql); // table Name String tableName = null; if (tableSql.contains("TABLE") && tableSql.contains("(")) { diff --git a/generator-web/src/main/resources/application.yml b/generator-web/src/main/resources/application.yml index c54490d9..b8563c87 100644 --- a/generator-web/src/main/resources/application.yml +++ b/generator-web/src/main/resources/application.yml @@ -2,17 +2,25 @@ server: port: 1234 servlet: context-path: /generator -tomcat: - remote-ip-header: x-forward-for - uri-encoding: UTF-8 - max-threads: 10 - background-processor-delay: 30 - basedir: ${user.home}/tomcat/ +#tomcat: +# remote-ip-header: x-forward-for +# uri-encoding: UTF-8 +# max-threads: 10 +# background-processor-delay: 30 +# basedir: ${user.home}/tomcat/ + undertow: + # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程 + # 不要设置过大,如果过大,启动项目会报错:打开文件数过多 + io-threads: 4 + # 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程 + # 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8 + worker-threads: 64 + # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理 + # 每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可 + buffer-size: 1024 + # 是否分配的直接内存(NIO直接分配的堆外内存) + direct-buffers: true spring: - cloud: - nacos: - discovery: - server-addr: 127.0.0.1:8848 banner: charset: UTF-8 http: diff --git a/pom.xml b/pom.xml index a4e4264a..c2207831 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,18 @@ org.springframework.boot spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-undertow @@ -67,7 +79,7 @@ cn.hutool hutool-all - 4.6.1 + 5.0.6 @@ -134,7 +146,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 + 3.8.1 true javac @@ -156,13 +168,13 @@ org.apache.maven.plugins maven-resources-plugin - 3.0.1 + 3.1.0 true - + org.springframework.boot spring-boot-maven-plugin From f45b1bfa8a406886236c0fa5c7d269962e6ed832 Mon Sep 17 00:00:00 2001 From: "MOSHOW.K.ZHENG" Date: Tue, 26 Nov 2019 22:56:20 +0800 Subject: [PATCH 3/7] add release jar download url&img add release jar download url&img --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c2841c14..c2df2f96 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ |-|-| |在线地址|http://java.bejson.com/generator| |CSDN博客|http://zhengkai.blog.csdn.net| - +|最新Jar包|https://github.com/moshowgame/SpringBootCodeGenerator/releases| 感谢bejson三叔将他部署在[BEJSON](www.bejson.com)上,目前是besjon专供工具(线上版本不一定是最新的,会有延迟,请谅解,谢谢). @@ -75,5 +75,6 @@ + From 02c43a8a9e06a82c7fde1500f80b495413a69ebd Mon Sep 17 00:00:00 2001 From: "MOSHOW.K.ZHENG" Date: Tue, 26 Nov 2019 22:58:24 +0800 Subject: [PATCH 4/7] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c2df2f96..a062e690 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ |在线地址|http://java.bejson.com/generator| |CSDN博客|http://zhengkai.blog.csdn.net| |最新Jar包|https://github.com/moshowgame/SpringBootCodeGenerator/releases| + 感谢bejson三叔将他部署在[BEJSON](www.bejson.com)上,目前是besjon专供工具(线上版本不一定是最新的,会有延迟,请谅解,谢谢). From a84a4c1087aee33226e7114b462164778fdd096d Mon Sep 17 00:00:00 2001 From: "MOSHOW.K.ZHENG" Date: Thu, 28 Nov 2019 22:19:53 +0800 Subject: [PATCH 5/7] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8D=E6=94=AF=E6=8C=81strin?= =?UTF-8?q?g-copy=E5=AF=BC=E8=87=B4=E7=9A=84=E4=BB=A5n=E7=BB=93=E5=B0=BE?= =?UTF-8?q?=E7=9A=84=E5=AD=97=E6=AF=8D=E4=B8=8D=E6=98=BE=E7=A4=BA=E9=97=AE?= =?UTF-8?q?=E9=A2=98=202.jpa-entity=E6=96=B0=E5=A2=9Eswagger@ApiModel@ApiM?= =?UTF-8?q?odelProperty=E6=B3=A8=E8=A7=A3=E5=92=8CSQL=E5=AD=97=E6=AE=B5@Co?= =?UTF-8?q?lumn=E6=B3=A8=E8=A7=A3(=E6=84=9F=E8=B0=A2@yjq907=E7=9A=84?= =?UTF-8?q?=E5=BB=BA=E8=AE=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 163 ++-- .../generator/controller/IndexController.java | 164 ++-- .../system/generator/util/TableParseUtil.java | 844 +++++++++--------- .../templates/code-generator/jpa/entity.ftl | 15 +- .../src/main/resources/templates/index.ftl | 662 +++++++------- 5 files changed, 930 insertions(+), 918 deletions(-) diff --git a/README.md b/README.md index a062e690..9b2f8565 100644 --- a/README.md +++ b/README.md @@ -1,81 +1,82 @@ -# SpringBootCodeGenerator -![image](https://img.shields.io/badge/SpringBoot2-%E2%98%85%E2%98%85%E2%98%85%E2%98%85%E2%98%85-brightgreen.svg) -![image](https://img.shields.io/badge/Freemarker-%E2%98%85%E2%98%85%E2%98%85%E2%98%85%E2%98%85-brightgreen.svg) -![image](https://img.shields.io/badge/CodeGenerator-%E2%98%85%E2%98%85%E2%98%85%E2%98%85%E2%98%85-brightgreen.svg) -[![Build Status](https://travis-ci.org/moshowgame/SpringBootCodeGenerator.svg?branch=master)](https://travis-ci.org/moshowgame/SpringBootCodeGenerator) - - -# Description -- √ 基于SpringBoot2+Freemarker+Bootstrap -- √ 以释放双手为目的 -- √ 支持mysql/oracle/pgsql三大数据库 -- √ 用DDL-SQL语句生成JPA/JdbcTemplate/Mybatis/MybatisPlus/BeetlSQL相关代码. - - -# Url - -|访问路径|http://localhost:1234/generator| -|-|-| -|在线地址|http://java.bejson.com/generator| -|CSDN博客|http://zhengkai.blog.csdn.net| -|最新Jar包|https://github.com/moshowgame/SpringBootCodeGenerator/releases| - -感谢bejson三叔将他部署在[BEJSON](www.bejson.com)上,目前是besjon专供工具(线上版本不一定是最新的,会有延迟,请谅解,谢谢). - - -# Update - -|更新日期|更新内容| -|-|-| -|20191126|1.springboot2内置tomcat更换为性能更强大的undertow 2.修复tinyintTransType参数丢失问题 | -|20191124|1.java代码结构优化. 2.新增简单的json生成模式 3.新增简单的正则表达式匹配模式(感谢@ydq的贡献) 4.新增对复制String代码中的乱SQL代码的支持 5.优化对JSON的父子节点/处理,JSONObject和JSONArray节点处理,子节点缺失'{'头处理| -|20191123|1.移除频繁出错和被过滤的layer,改为jquery-toast. 2.Util功能优化,新增json和xml.| -|20191116|优化对primary关键字的处理(感谢@liujiansgit的反馈). | -|20191115|1.添加tinyint类型转换(感谢@lixiliang&@liujiansgit的Suggestion) 2.添加一键复制功能(感谢@gaohanghang的Suggestion) 3.Mybatis的insert增加keyProperty="id"用于返回自增id(感谢@88888888888888888888的Suggestion) 4.优化date类型的支持(感谢@SteveLsf的反馈) 5.其他一些优化. | -|20191015|修复jdbcTemplates中insert语句第一个字段丢失的问题. | -|20190915|1.添加对象getset模板 2.添加sql模板 3.启动类添加日志输出,方便项目使用(感谢@gaohanghang 的pull request) | -|20190910-2|优化以及更新Maven依赖,减少打包体积. | -|20190910-1|1.修复mapper接口load方法,但是xml中方法不匹配问题 2.移除mapper中CRUD时的@param 注解,会影响xml的解析(感谢@caojiantao的反馈).3.优化MyBatis的xml文件对Oracle的支持.(感谢@wylove1992的反馈) 4.新增对boolean的处理(感谢@violinxsc的反馈)以及优化tinyint类型生成boolean类型问题(感谢@hahaYhui的反馈) | -|20190909|添加是否下划线转换为驼峰的选择(感谢@youngking28 的pull request).| -|20190518|1.优化注释 2.修改 mybatis模板中 controller注解 3.修改 mybatis模板中 dao文件使用为 mapper文件 4.修改 mybatis模板中 service实现类中的一个 bug 5.修改 index.ftl文件中 mybatis模板的 dao -> mapper(感谢@unqin的pull request)| -|20190511|优化mybatis模块的dao和xml模板,修改dao接口注解为@Repository,所有dao参数改为包装类,删除update语句最后的UpdateTime = NOW(),修改dao接口文件的方法注释使其更符合javaDoc的标准,修改insert语句增加插入行主键的返回,修改load的方法名为selectByPrimaryKey,修改xml的update语句新增动态if判空,修改xml的insert语句新增动态插入判空,更符合mybatisGenerator标准(感谢@Archer-Wen的贡献 ).| -|20190429|新增返回封装工具类设置,优化对oracle注释comment on column的支持(感谢@liukex反馈),优化对普通和特殊storage关键字的判断(感谢@AhHeadFloating的反馈 ).| -|20190211|提交gitignore,解决StringUtils.lowerCaseFirst潜在的NPE异常,校验修改为@RequestParam参数校验,lombok之@Data和@Slf4j优化,fix JdbcDAO模板类名显示为中文问题,WebMvcConfig整合MessageConverter,模板代码分类(感谢@liutf和@tfgzs的pull request).| -|20190210|实体生成规则切换为包装类型,不再采用基本数据类型,为实体类生成添加显示的默认构造方法(感谢@h2so的pull request).| -|20190106|修复处理number/decimal(x,x)类型的逻辑(感谢@arthaschan的反馈),修复JdbcTemplates模板两处错误(感谢@everflourish的反馈).| -|20181212|首页UI优化,新增MybatisPlus模块(感谢@三叔同事的建议),修复作者名和包名获取失败问题(感谢@Yanch1994的反馈).| -|20181122|优化正则表达式点号的处理,优化处理字段类型,对number类型增加int,long,BigDecimal的区分判断(感谢@lshz0088的指导).| -|20181108|修复非字段描述"KEY FK_xxxx (xxxx)"导致生成KEY字段情况(感谢@tornadoorz反馈).| -|20181018|支持double(x,x)的类型,以及comment里面包含一些特殊字符的处理(感谢@tanwubo的反馈).| -|20181010|CDN变更,修复CDN不稳定导致网页js报错问题.| -|20181003|新增element-ui/bootstrap生成.| -|20181002|修复公共CDN之Layer.js404问题,导致项目无法生成.| -|20180927|优化COMMENT提取逻辑,支持多种复杂情况的注释(感谢@raodeming的反馈).| -|20180926|全新BeetlSQL模块,以及一些小细节优化(感谢@三叔同事的建议).| -|20180925|优化SQL表和字段备注的推断,包括pgsql/oralce的comment on column/table情况处理等.| -|20180918|优化SQL类型推断.优化PrimaryKey判断.修复jpacontroller中Repository拼写错误问题.| -|20180917|全新首页,静态文件全部采用CDN.新增jdbcTemplate模块.| -|20180916|1.优化oracle支持,优化DDL语句中"或者'或者空格的支持. 2.补充char/clob/blob/json等类型,如果类型未知,默认为String.| -|20180915|新增Swagger-UI模板.修复一些命名和导入问题.JPA的Entity默认第一个字段为Id,如果不是请手工修改.| -|20180913|修复字段没有描述以及类型为DATE型导致的问题.新增JPA的Controller模板.| -|20180831|初始化项目.新增JPA系列Entity+Repository模板.| - -# FieldName -|字段名|说明| -|-|-| -|packageName|自定义的包名| -|authorName|自定义的作者名| -|returnUtil|自定义的返回Util| -|tableName|sql中的表名| -|className|java类名| -|classComment|sql表备注/java类备注| -|fieldName|字段名| -|fieldComment|字段备注| - - - - - - - - +# SpringBootCodeGenerator +![image](https://img.shields.io/badge/SpringBoot2-%E2%98%85%E2%98%85%E2%98%85%E2%98%85%E2%98%85-brightgreen.svg) +![image](https://img.shields.io/badge/Freemarker-%E2%98%85%E2%98%85%E2%98%85%E2%98%85%E2%98%85-brightgreen.svg) +![image](https://img.shields.io/badge/CodeGenerator-%E2%98%85%E2%98%85%E2%98%85%E2%98%85%E2%98%85-brightgreen.svg) +[![Build Status](https://travis-ci.org/moshowgame/SpringBootCodeGenerator.svg?branch=master)](https://travis-ci.org/moshowgame/SpringBootCodeGenerator) + + +# Description +- √ 基于SpringBoot2+Freemarker+Bootstrap +- √ 以释放双手为目的 +- √ 支持mysql/oracle/pgsql三大数据库 +- √ 用DDL-SQL语句生成JPA/JdbcTemplate/Mybatis/MybatisPlus/BeetlSQL相关代码. + + +# Url + +|访问路径|http://localhost:1234/generator| +|-|-| +|在线地址|http://java.bejson.com/generator| +|CSDN博客|http://zhengkai.blog.csdn.net| +|最新Jar包|https://github.com/moshowgame/SpringBootCodeGenerator/releases| + +感谢bejson三叔将他部署在[BEJSON](www.bejson.com)上,目前是besjon专供工具(线上版本不一定是最新的,会有延迟,请谅解,谢谢). + + +# Update + +|更新日期|更新内容| +|-|-| +|20191128|1.修复支持string-copy导致的以n结尾的字母不显示问题 2.jpa-entity新增swagger@ApiModel@ApiModelProperty注解和SQL字段@Column注解(感谢@yjq907的建议) | +|20191126|1.springboot2内置tomcat更换为性能更强大的undertow 2.修复tinyintTransType参数丢失问题 | +|20191124|1.java代码结构优化. 2.新增简单的json生成模式 3.新增简单的正则表达式匹配模式(感谢@ydq的贡献) 4.新增对复制String代码中的乱SQL代码的支持 5.优化对JSON的父子节点/处理,JSONObject和JSONArray节点处理,子节点缺失'{'头处理| +|20191123|1.移除频繁出错和被过滤的layer,改为jquery-toast. 2.Util功能优化,新增json和xml.| +|20191116|优化对primary关键字的处理(感谢@liujiansgit的反馈). | +|20191115|1.添加tinyint类型转换(感谢@lixiliang&@liujiansgit的Suggestion) 2.添加一键复制功能(感谢@gaohanghang的Suggestion) 3.Mybatis的insert增加keyProperty="id"用于返回自增id(感谢@88888888888888888888的Suggestion) 4.优化date类型的支持(感谢@SteveLsf的反馈) 5.其他一些优化. | +|20191015|修复jdbcTemplates中insert语句第一个字段丢失的问题. | +|20190915|1.添加对象getset模板 2.添加sql模板 3.启动类添加日志输出,方便项目使用(感谢@gaohanghang 的pull request) | +|20190910-2|优化以及更新Maven依赖,减少打包体积. | +|20190910-1|1.修复mapper接口load方法,但是xml中方法不匹配问题 2.移除mapper中CRUD时的@param 注解,会影响xml的解析(感谢@caojiantao的反馈).3.优化MyBatis的xml文件对Oracle的支持.(感谢@wylove1992的反馈) 4.新增对boolean的处理(感谢@violinxsc的反馈)以及优化tinyint类型生成boolean类型问题(感谢@hahaYhui的反馈) | +|20190909|添加是否下划线转换为驼峰的选择(感谢@youngking28 的pull request).| +|20190518|1.优化注释 2.修改 mybatis模板中 controller注解 3.修改 mybatis模板中 dao文件使用为 mapper文件 4.修改 mybatis模板中 service实现类中的一个 bug 5.修改 index.ftl文件中 mybatis模板的 dao -> mapper(感谢@unqin的pull request)| +|20190511|优化mybatis模块的dao和xml模板,修改dao接口注解为@Repository,所有dao参数改为包装类,删除update语句最后的UpdateTime = NOW(),修改dao接口文件的方法注释使其更符合javaDoc的标准,修改insert语句增加插入行主键的返回,修改load的方法名为selectByPrimaryKey,修改xml的update语句新增动态if判空,修改xml的insert语句新增动态插入判空,更符合mybatisGenerator标准(感谢@Archer-Wen的贡献 ).| +|20190429|新增返回封装工具类设置,优化对oracle注释comment on column的支持(感谢@liukex反馈),优化对普通和特殊storage关键字的判断(感谢@AhHeadFloating的反馈 ).| +|20190211|提交gitignore,解决StringUtils.lowerCaseFirst潜在的NPE异常,校验修改为@RequestParam参数校验,lombok之@Data和@Slf4j优化,fix JdbcDAO模板类名显示为中文问题,WebMvcConfig整合MessageConverter,模板代码分类(感谢@liutf和@tfgzs的pull request).| +|20190210|实体生成规则切换为包装类型,不再采用基本数据类型,为实体类生成添加显示的默认构造方法(感谢@h2so的pull request).| +|20190106|修复处理number/decimal(x,x)类型的逻辑(感谢@arthaschan的反馈),修复JdbcTemplates模板两处错误(感谢@everflourish的反馈).| +|20181212|首页UI优化,新增MybatisPlus模块(感谢@三叔同事的建议),修复作者名和包名获取失败问题(感谢@Yanch1994的反馈).| +|20181122|优化正则表达式点号的处理,优化处理字段类型,对number类型增加int,long,BigDecimal的区分判断(感谢@lshz0088的指导).| +|20181108|修复非字段描述"KEY FK_xxxx (xxxx)"导致生成KEY字段情况(感谢@tornadoorz反馈).| +|20181018|支持double(x,x)的类型,以及comment里面包含一些特殊字符的处理(感谢@tanwubo的反馈).| +|20181010|CDN变更,修复CDN不稳定导致网页js报错问题.| +|20181003|新增element-ui/bootstrap生成.| +|20181002|修复公共CDN之Layer.js404问题,导致项目无法生成.| +|20180927|优化COMMENT提取逻辑,支持多种复杂情况的注释(感谢@raodeming的反馈).| +|20180926|全新BeetlSQL模块,以及一些小细节优化(感谢@三叔同事的建议).| +|20180925|优化SQL表和字段备注的推断,包括pgsql/oralce的comment on column/table情况处理等.| +|20180918|优化SQL类型推断.优化PrimaryKey判断.修复jpacontroller中Repository拼写错误问题.| +|20180917|全新首页,静态文件全部采用CDN.新增jdbcTemplate模块.| +|20180916|1.优化oracle支持,优化DDL语句中"或者'或者空格的支持. 2.补充char/clob/blob/json等类型,如果类型未知,默认为String.| +|20180915|新增Swagger-UI模板.修复一些命名和导入问题.JPA的Entity默认第一个字段为Id,如果不是请手工修改.| +|20180913|修复字段没有描述以及类型为DATE型导致的问题.新增JPA的Controller模板.| +|20180831|初始化项目.新增JPA系列Entity+Repository模板.| + +# FieldName +|字段名|说明| +|-|-| +|packageName|自定义的包名| +|authorName|自定义的作者名| +|returnUtil|自定义的返回Util| +|tableName|sql中的表名| +|className|java类名| +|classComment|sql表备注/java类备注| +|fieldName|字段名| +|fieldComment|字段备注| + + + + + + + + diff --git a/generator-web/src/main/java/com/softdev/system/generator/controller/IndexController.java b/generator-web/src/main/java/com/softdev/system/generator/controller/IndexController.java index 31c73812..4d37f206 100644 --- a/generator-web/src/main/java/com/softdev/system/generator/controller/IndexController.java +++ b/generator-web/src/main/java/com/softdev/system/generator/controller/IndexController.java @@ -1,81 +1,83 @@ -package com.softdev.system.generator.controller; - -import com.softdev.system.generator.entity.ClassInfo; -import com.softdev.system.generator.entity.ParamInfo; -import com.softdev.system.generator.entity.ReturnT; -import com.softdev.system.generator.service.GeneratorService; -import com.softdev.system.generator.util.CodeGenerateException; -import com.softdev.system.generator.util.FreemarkerTool; -import com.softdev.system.generator.util.TableParseUtil; -import freemarker.template.TemplateException; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -/** - * spring boot code generator - * @author zhengk/moshow - */ -@Controller -@Slf4j -public class IndexController { - - @Autowired - private GeneratorService generatorService; - - @GetMapping("/") - public String index() { - return "index"; - } - - @PostMapping("/genCode") - @ResponseBody - public ReturnT> codeGenerate( ParamInfo paramInfo ) { - - try { - - if (StringUtils.isBlank(paramInfo.getTableSql())) { - return new ReturnT<>(ReturnT.FAIL_CODE, "表结构信息不可为空"); - } - - // parse table - ClassInfo classInfo = null; - switch (paramInfo.getDataType()){ - //parse json - case "json":classInfo = TableParseUtil.processJsonToClassInfo(paramInfo);break; - //parse sql by regex - case "sql-regex":classInfo = TableParseUtil.processTableToClassInfoByRegex(paramInfo);break; - //default parse sql by java - default : classInfo = TableParseUtil.processTableIntoClassInfo(paramInfo);break; - } - - // process the param - Map params = new HashMap(8); - params.put("classInfo", classInfo); - params.put("authorName", paramInfo.getAuthorName()); - params.put("packageName", paramInfo.getPackageName()); - params.put("returnUtil", paramInfo.getReturnUtil()); - - log.info("generator table:"+(classInfo==null?"":classInfo.getTableName())); - - // generate the code 需要加新的模板请在里面改 - Map result = generatorService.getResultByParams(params); - - return new ReturnT<>(result); - } catch (IOException | TemplateException e) { - log.error(e.getMessage(), e); - return new ReturnT<>(ReturnT.FAIL_CODE, e.getMessage()); - } catch (CodeGenerateException e) { - log.error(e.getMessage(), e); - return new ReturnT<>(ReturnT.FAIL_CODE, e.getMessage()); - } - - } - -} +package com.softdev.system.generator.controller; + +import com.softdev.system.generator.entity.ClassInfo; +import com.softdev.system.generator.entity.ParamInfo; +import com.softdev.system.generator.entity.ReturnT; +import com.softdev.system.generator.service.GeneratorService; +import com.softdev.system.generator.util.CodeGenerateException; +import com.softdev.system.generator.util.TableParseUtil; +import freemarker.template.TemplateException; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * spring boot code generator + * @author zhengk/moshow + */ +@Controller +@Slf4j +public class IndexController { + + @Autowired + private GeneratorService generatorService; + + @GetMapping("/") + public String index() { + return "index"; + } + + @PostMapping("/genCode") + @ResponseBody + public ReturnT> codeGenerate( ParamInfo paramInfo ) { + + try { + + if (StringUtils.isBlank(paramInfo.getTableSql())) { + return new ReturnT<>(ReturnT.FAIL_CODE, "表结构信息不可为空"); + } + + // parse table + ClassInfo classInfo = null; + switch (paramInfo.getDataType()){ + //parse json + case "json":classInfo = TableParseUtil.processJsonToClassInfo(paramInfo);break; + //parse sql by regex + case "sql-regex":classInfo = TableParseUtil.processTableToClassInfoByRegex(paramInfo);break; + //default parse sql by java + default : classInfo = TableParseUtil.processTableIntoClassInfo(paramInfo);break; + } + + // process the param + Map params = new HashMap(8); + params.put("classInfo", classInfo); + params.put("authorName", paramInfo.getAuthorName()); + params.put("packageName", paramInfo.getPackageName()); + params.put("returnUtil", paramInfo.getReturnUtil()); + + log.info("generator table:"+(classInfo==null?"":classInfo.getTableName()) + +",field size:"+((classInfo==null||classInfo.getFieldList()==null)?"":classInfo.getFieldList().size())); + + // generate the code 需要加新的模板请在里面改 + Map result = generatorService.getResultByParams(params); + + return new ReturnT<>(result); + } catch (IOException | TemplateException e) { + log.error(e.getMessage(), e); + return new ReturnT<>(ReturnT.FAIL_CODE, e.getMessage()); + } catch (CodeGenerateException e) { + log.error(e.getMessage(), e); + return new ReturnT<>(ReturnT.FAIL_CODE, e.getMessage()); + } + + } + +} diff --git a/generator-web/src/main/java/com/softdev/system/generator/util/TableParseUtil.java b/generator-web/src/main/java/com/softdev/system/generator/util/TableParseUtil.java index 31c1c28d..f8658283 100644 --- a/generator-web/src/main/java/com/softdev/system/generator/util/TableParseUtil.java +++ b/generator-web/src/main/java/com/softdev/system/generator/util/TableParseUtil.java @@ -1,423 +1,421 @@ -package com.softdev.system.generator.util; - - -import cn.hutool.core.util.XmlUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.softdev.system.generator.entity.ClassInfo; -import com.softdev.system.generator.entity.FieldInfo; -import com.softdev.system.generator.entity.ParamInfo; -import org.w3c.dom.Document; - -import java.io.IOException; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @author zhengkai.blog.csdn.net - */ -public class TableParseUtil { - - /** - * 解析建表SQL生成代码(model-dao-xml) - * - * @param paramInfo - * @return - */ - public static ClassInfo processTableIntoClassInfo(ParamInfo paramInfo) - throws IOException { - //process the param - String tableSql=paramInfo.getTableSql(); - String nameCaseType=paramInfo.getNameCaseType(); - String tinyintTransType=paramInfo.getTinyintTransType(); - - if (tableSql==null || tableSql.trim().length()==0) { - throw new CodeGenerateException("Table structure can not be empty."); - } - //deal with special character - tableSql = tableSql.trim().replaceAll("'","`").replaceAll("\"","`").replaceAll(",",",").toLowerCase(); - //deal with java string copy \n" - tableSql = tableSql.trim().replaceAll("n`","").replaceAll("\\+","").replaceAll("``","`").replaceAll("\\\\",""); - // table Name - String tableName = null; - if (tableSql.contains("TABLE") && tableSql.contains("(")) { - tableName = tableSql.substring(tableSql.indexOf("TABLE")+5, tableSql.indexOf("(")); - } else if (tableSql.contains("table") && tableSql.contains("(")) { - tableName = tableSql.substring(tableSql.indexOf("table")+5, tableSql.indexOf("(")); - } else { - throw new CodeGenerateException("Table structure anomaly."); - } - - //新增处理create table if not exists members情况 - if (tableName.contains("if not exists")) { - tableName=tableName.replaceAll("if not exists",""); - } - - if (tableName.contains("`")) { - tableName = tableName.substring(tableName.indexOf("`")+1, tableName.lastIndexOf("`")); - }else{ - //空格开头的,需要替换掉\n\t空格 - tableName=tableName.replaceAll(" ","").replaceAll("\n","").replaceAll("\t",""); - } - //优化对byeas`.`ct_bd_customerdiscount这种命名的支持 - if(tableName.contains("`.`")){ - tableName=tableName.substring(tableName.indexOf("`.`")+3); - }else if(tableName.contains(".")){ - //优化对likeu.members这种命名的支持 - tableName=tableName.substring(tableName.indexOf(".")+1); - } - // class Name - String className = StringUtils.upperCaseFirst(StringUtils.underlineToCamelCase(tableName)); - if (className.contains("_")) { - className = className.replaceAll("_", ""); - } - - // class Comment - String classComment = null; - //mysql是comment=,pgsql/oracle是comment on table, - if (tableSql.contains("comment=")) { - String classCommentTmp = tableSql.substring(tableSql.lastIndexOf("comment=")+8).replaceAll("`","").trim(); - if (classCommentTmp.indexOf(" ")!=classCommentTmp.lastIndexOf(" ")) { - classCommentTmp = classCommentTmp.substring(classCommentTmp.indexOf(" ")+1, classCommentTmp.lastIndexOf(" ")); - } - if (classCommentTmp!=null && classCommentTmp.trim().length()>0) { - classComment = classCommentTmp; - }else{ - //修复表备注为空问题 - classComment = className; - } - }else if(tableSql.contains("comment on table")) { - //COMMENT ON TABLE CT_BAS_FEETYPE IS 'CT_BAS_FEETYPE'; - String classCommentTmp = tableSql.substring(tableSql.lastIndexOf("comment on table")+17).trim(); - //证明这是一个常规的COMMENT ON TABLE xxx IS 'xxxx' - if (classCommentTmp.contains("`")) { - classCommentTmp = classCommentTmp.substring(classCommentTmp.indexOf("`")+1); - classCommentTmp = classCommentTmp.substring(0,classCommentTmp.indexOf("`")); - classComment = classCommentTmp; - }else{ - //非常规的没法分析 - classComment = tableName; - } - }else{ - //修复表备注为空问题 - classComment = tableName; - } - //如果备注跟;混在一起,需要替换掉 - classComment=classComment.replaceAll(";",""); - // field List - List fieldList = new ArrayList(); - - // 正常( ) 内的一定是字段相关的定义。 - String fieldListTmp = tableSql.substring(tableSql.indexOf("(")+1, tableSql.lastIndexOf(")")); - - // 匹配 comment,替换备注里的小逗号, 防止不小心被当成切割符号切割 - String commentPattenStr1="comment `(.*?)\\`"; - Matcher matcher1 = Pattern.compile(commentPattenStr1).matcher(fieldListTmp); - while(matcher1.find()){ - - String commentTmp = matcher1.group(); - //2018-9-27 zhengk 不替换,只处理,支持COMMENT评论里面多种注释 - //commentTmp = commentTmp.replaceAll("\\ comment `|\\`", " "); // "\\{|\\}" - - if (commentTmp.contains(",")) { - String commentTmpFinal = commentTmp.replaceAll(",", ","); - fieldListTmp = fieldListTmp.replace(matcher1.group(), commentTmpFinal); - } - } - //2018-10-18 zhengkai 新增支持double(10, 2)等类型中有英文逗号的特殊情况 - String commentPattenStr2="\\`(.*?)\\`"; - Matcher matcher2 = Pattern.compile(commentPattenStr2).matcher(fieldListTmp); - while(matcher2.find()){ - String commentTmp2 = matcher2.group(); - if (commentTmp2.contains(",")) { - String commentTmpFinal = commentTmp2.replaceAll(",", ",").replaceAll("\\(", "(").replaceAll("\\)", ")"); - fieldListTmp = fieldListTmp.replace(matcher2.group(), commentTmpFinal); - } - } - //2018-10-18 zhengkai 新增支持double(10, 2)等类型中有英文逗号的特殊情况 - String commentPattenStr3="\\((.*?)\\)"; - Matcher matcher3 = Pattern.compile(commentPattenStr3).matcher(fieldListTmp); - while(matcher3.find()){ - String commentTmp3 = matcher3.group(); - if (commentTmp3.contains(",")) { - String commentTmpFinal = commentTmp3.replaceAll(",", ","); - fieldListTmp = fieldListTmp.replace(matcher3.group(), commentTmpFinal); - } - } - String[] fieldLineList = fieldListTmp.split(","); - if (fieldLineList.length > 0) { - int i=0; - //i为了解决primary key关键字出现的地方,出现在前3行,一般和id有关 - for (String columnLine :fieldLineList) { - i++; - columnLine = columnLine.replaceAll("\n","").replaceAll("\t","").trim(); - // `userid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', - // 2018-9-18 zhengk 修改为contains,提升匹配率和匹配不按照规矩出牌的语句 - // 2018-11-8 zhengkai 修复tornadoorz反馈的KEY FK_permission_id (permission_id),KEY FK_role_id (role_id)情况 - // 2019-2-22 zhengkai 要在条件中使用复杂的表达式 - // 2019-4-29 zhengkai 优化对普通和特殊storage关键字的判断(感谢@AhHeadFloating的反馈 ) - boolean specialFlag=(!columnLine.contains("key ")&&!columnLine.contains("constraint")&&!columnLine.contains("using")&&!columnLine.contains("unique") - &&!(columnLine.contains("primary ")&&columnLine.indexOf("storage")+3>columnLine.indexOf("(")) - &&!columnLine.contains("pctincrease") - &&!columnLine.contains("buffer_pool")&&!columnLine.contains("tablespace") - &&!(columnLine.contains("primary ")&&i>3)); - if (specialFlag){ - //如果是oracle的number(x,x),可能出现最后分割残留的,x),这里做排除处理 - if(columnLine.length()<5) {continue;} - //2018-9-16 zhengkai 支持'符号以及空格的oracle语句// userid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', - String columnName = ""; - columnLine=columnLine.replaceAll("`"," ").replaceAll("\""," ").replaceAll("'","").replaceAll(" "," ").trim(); - //如果遇到username varchar(65) default '' not null,这种情况,判断第一个空格是否比第一个引号前 - columnName = columnLine.substring(0, columnLine.indexOf(" ")); - // field Name - // 2019-09-08 yj 添加是否下划线转换为驼峰的判断 - String fieldName=null; - if(ParamInfo.NAME_CASE_TYPE.CAMEL_CASE.equals(nameCaseType)){ - fieldName = StringUtils.lowerCaseFirst(StringUtils.underlineToCamelCase(columnName)); - if (fieldName.contains("_")) { - fieldName = fieldName.replaceAll("_", ""); - } - }else if(ParamInfo.NAME_CASE_TYPE.UNDER_SCORE_CASE.equals(nameCaseType)){ - fieldName = StringUtils.lowerCaseFirst(columnName); - }else if(ParamInfo.NAME_CASE_TYPE.UPPER_UNDER_SCORE_CASE.equals(nameCaseType)){ - fieldName = StringUtils.lowerCaseFirst(columnName.toUpperCase()); - }else{ - fieldName=columnName; - } - - // field class - columnLine = columnLine.substring(columnLine.indexOf("`")+1).trim(); - // int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', - String fieldClass = Object.class.getSimpleName(); - //2018-9-16 zhengk 补充char/clob/blob/json等类型,如果类型未知,默认为String - //2018-11-22 lshz0088 处理字段类型的时候,不严谨columnLine.contains(" int") 类似这种的,可在前后适当加一些空格之类的加以区分,否则当我的字段包含这些字符的时候,产生类型判断问题。 - if (columnLine.contains(" int") || columnLine.contains("smallint")) { - fieldClass = Integer.class.getSimpleName(); - } else if (columnLine.contains("bigint")) { - fieldClass = Long.class.getSimpleName(); - } else if (columnLine.contains("float")) { - fieldClass = Float.class.getSimpleName(); - } else if (columnLine.contains("double")) { - fieldClass = Double.class.getSimpleName(); - } else if (columnLine.contains("time") || columnLine.contains("date") || columnLine.contains("datetime") || columnLine.contains("timestamp")) { - fieldClass = Date.class.getSimpleName(); - } else if (columnLine.contains("varchar") || columnLine.contains(" text")|| columnLine.contains("char") - || columnLine.contains("clob")||columnLine.contains("blob")||columnLine.contains("json")) { - fieldClass = String.class.getSimpleName(); - } else if (columnLine.contains("decimal")||columnLine.contains(" number")) { - //2018-11-22 lshz0088 建议对number类型增加int,long,BigDecimal的区分判断 - //如果startKh大于等于0,则表示有设置取值范围 - int startKh=columnLine.indexOf("("); - if(startKh>=0){ - int endKh=columnLine.indexOf(")",startKh); - String[] fanwei=columnLine.substring(startKh+1,endKh).split(","); - //2019-1-5 zhengk 修复@arthaschan反馈的超出范围错误 - //System.out.println("fanwei"+ JSON.toJSONString(fanwei)); - // //number(20,6) fanwei["20","6"] - // //number(0,6) fanwei["0","6"] - // //number(20,0) fanwei["20","0"] - // //number(20) fanwei["20"] - //如果括号里是1位或者2位且第二位为0,则进行特殊处理。只有有小数位,都设置为BigDecimal。 - if((fanwei.length>1&&"0".equals(fanwei[1]))||fanwei.length==1){ - int length=Integer.parseInt(fanwei[0]); - if(fanwei.length>1) { - length=Integer.valueOf(fanwei[1]); - } - //数字范围9位及一下用Integer,大的用Long - if(length<=9){ - fieldClass = Integer.class.getSimpleName(); - }else{ - fieldClass = Long.class.getSimpleName(); - } - }else{ - //有小数位数一律使用BigDecimal - fieldClass = BigDecimal.class.getSimpleName(); - } - }else{ - fieldClass = BigDecimal.class.getSimpleName(); - } - } else if (columnLine.contains("boolean")) { - //20190910 MOSHOW.K.ZHENG 新增对boolean的处理(感谢@violinxsc的反馈)以及修复tinyint类型字段无法生成boolean类型问题(感谢@hahaYhui的反馈) - fieldClass = Boolean.class.getSimpleName(); - } else if (columnLine.contains("tinyint") ) { - //20191115 MOSHOW.K.ZHENG 支持对tinyint的特殊处理 - fieldClass=tinyintTransType; - } else { - fieldClass = String.class.getSimpleName(); - } - - // field comment,MySQL的一般位于field行,而pgsql和oralce多位于后面。 - String fieldComment = null; - if(tableSql.contains("comment on column")&&(tableSql.contains("."+columnName+" is ")||tableSql.contains(".`"+columnName+"` is"))){ - //新增对pgsql/oracle的字段备注支持 - //COMMENT ON COLUMN public.check_info.check_name IS '检查者名称'; - //2018-11-22 lshz0088 正则表达式的点号前面应该加上两个反斜杠,否则会认为是任意字符 - //2019-4-29 zhengkai 优化对oracle注释comment on column的支持(@liukex) - tableSql=tableSql.replaceAll(".`"+columnName+"` is","."+columnName+" is"); - Matcher columnCommentMatcher = Pattern.compile("\\."+columnName+" is `").matcher(tableSql); - fieldComment=columnName; - while(columnCommentMatcher.find()){ - String columnCommentTmp = columnCommentMatcher.group(); - System.out.println(columnCommentTmp); - fieldComment = tableSql.substring(tableSql.indexOf(columnCommentTmp)+columnCommentTmp.length()).trim(); - fieldComment = fieldComment.substring(0,fieldComment.indexOf("`")).trim(); - } - }else if (columnLine.contains("comment")) { - String commentTmp = columnLine.substring(columnLine.indexOf("comment")+7).trim(); - // '用户ID', - if (commentTmp.contains("`") || commentTmp.indexOf("`")!=commentTmp.lastIndexOf("`")) { - commentTmp = commentTmp.substring(commentTmp.indexOf("`")+1, commentTmp.lastIndexOf("`")); - } - //解决最后一句是评论,无主键且连着)的问题:album_id int(3) default '1' null comment '相册id:0 代表头像 1代表照片墙') - if(commentTmp.contains(")")){ - commentTmp = commentTmp.substring(0, commentTmp.lastIndexOf(")")+1); - } - fieldComment = commentTmp; - }else{ - //修复comment不存在导致报错的问题 - fieldComment = columnName; - } - - FieldInfo fieldInfo = new FieldInfo(); - fieldInfo.setColumnName(columnName); - fieldInfo.setFieldName(fieldName); - fieldInfo.setFieldClass(fieldClass); - fieldInfo.setFieldComment(fieldComment); - - fieldList.add(fieldInfo); - } - } - } - - if (fieldList.size() < 1) { - throw new CodeGenerateException("表结构分析失败,请检查语句或者提交issue给我"); - } - - ClassInfo codeJavaInfo = new ClassInfo(); - codeJavaInfo.setTableName(tableName); - codeJavaInfo.setClassName(className); - codeJavaInfo.setClassComment(classComment); - codeJavaInfo.setFieldList(fieldList); - - return codeJavaInfo; - } - /** - * parse JSON - * @param paramInfo - * @return - */ - public static ClassInfo processJsonToClassInfo(ParamInfo paramInfo){ - ClassInfo codeJavaInfo = new ClassInfo(); - codeJavaInfo.setTableName("JsonDto"); - codeJavaInfo.setClassName("JsonDto"); - codeJavaInfo.setClassComment("JsonDto"); - - //support children json if forget to add '{' in front of json - if(paramInfo.getTableSql().trim().startsWith("\"")){ - paramInfo.setTableSql("{"+paramInfo.getTableSql()); - } - if(JSON.isValid(paramInfo.getTableSql())){ - if(paramInfo.getTableSql().trim().startsWith("{")){ - JSONObject jsonObject = JSONObject.parseObject(paramInfo.getTableSql().trim()); - //parse FieldList by JSONObject - codeJavaInfo.setFieldList(processJsonObjectToFieldList(jsonObject)); - }else if(paramInfo.getTableSql().trim().startsWith("[")){ - JSONArray jsonArray=JSONArray.parseArray(paramInfo.getTableSql().trim()); - //parse FieldList by JSONObject - codeJavaInfo.setFieldList(processJsonObjectToFieldList(jsonArray.getJSONObject(0))); - } - } - - return codeJavaInfo; - } - /** - * parse SQL by regex - * @author https://github.com/ydq - * @param paramInfo - * @return - */ - public static ClassInfo processTableToClassInfoByRegex(ParamInfo paramInfo){ - // field List - List fieldList = new ArrayList(); - //return classInfo - ClassInfo codeJavaInfo = new ClassInfo(); - - //匹配整个ddl,将ddl分为表名,列sql部分,表注释 - String DDL_PATTEN_STR="\\s*create\\s+table\\s+(?\\S+)[^\\(]*\\((?[\\s\\S]+)\\)[^\\)]+?(comment\\s*(=|on\\s+table)\\s*'(?.*?)'\\s*;?)?$"; - - Pattern DDL_PATTERN = Pattern.compile(DDL_PATTEN_STR, Pattern.CASE_INSENSITIVE); - - //匹配列sql部分,分别解析每一列的列名 类型 和列注释 - String COL_PATTERN_STR="\\s*(?\\S+)\\s+(?\\w+)\\s*(?:\\([\\s\\d,]+\\))?((?!comment).)*(comment\\s*'(?.*?)')?\\s*(,|$)"; - - Pattern COL_PATTERN = Pattern.compile(COL_PATTERN_STR, Pattern.CASE_INSENSITIVE); - - Matcher matcher = DDL_PATTERN.matcher(paramInfo.getTableSql().trim()); - if (matcher.find()){ - String tableName = matcher.group("tableName"); - String tableComment = matcher.group("tableComment"); - codeJavaInfo.setTableName(tableName.replaceAll("'","")); - codeJavaInfo.setClassName(tableName.replaceAll("'","")); - codeJavaInfo.setClassComment(tableComment.replaceAll("'","")); - String columnsSQL = matcher.group("columnsSQL"); - if (columnsSQL != null && columnsSQL.length() > 0){ - Matcher colMatcher = COL_PATTERN.matcher(columnsSQL); - while (colMatcher.find()){ - String fieldName = colMatcher.group("fieldName"); - String fieldType = colMatcher.group("fieldType"); - String fieldComment = colMatcher.group("fieldComment"); - if (!"key".equalsIgnoreCase(fieldType)){ - FieldInfo fieldInfo = new FieldInfo(); - fieldInfo.setFieldName(fieldName.replaceAll("'","")); - fieldInfo.setColumnName(fieldName.replaceAll("'","")); - fieldInfo.setFieldClass(fieldType.replaceAll("'","")); - fieldInfo.setFieldComment(fieldComment.replaceAll("'","")); - fieldList.add(fieldInfo); - } - } - } - codeJavaInfo.setFieldList(fieldList); - } - return codeJavaInfo; - } - public static List processJsonObjectToFieldList(JSONObject jsonObject){ - // field List - List fieldList = new ArrayList(); - jsonObject.keySet().stream().forEach(jsonField->{ - FieldInfo fieldInfo = new FieldInfo(); - fieldInfo.setFieldName(jsonField); - fieldInfo.setColumnName(jsonField); - fieldInfo.setFieldClass(String.class.getSimpleName()); - fieldInfo.setFieldComment("father:"+jsonField); - fieldList.add(fieldInfo); - if(jsonObject.get(jsonField) instanceof JSONArray){ - jsonObject.getJSONArray(jsonField).stream().forEach(arrayObject->{ - FieldInfo fieldInfo2 = new FieldInfo(); - fieldInfo2.setFieldName(arrayObject.toString()); - fieldInfo2.setColumnName(arrayObject.toString()); - fieldInfo2.setFieldClass(String.class.getSimpleName()); - fieldInfo2.setFieldComment("children:"+arrayObject.toString()); - fieldList.add(fieldInfo2); - }); - }else if(jsonObject.get(jsonField) instanceof JSONObject){ - jsonObject.getJSONObject(jsonField).keySet().stream().forEach(arrayObject->{ - FieldInfo fieldInfo2 = new FieldInfo(); - fieldInfo2.setFieldName(arrayObject.toString()); - fieldInfo2.setColumnName(arrayObject.toString()); - fieldInfo2.setFieldClass(String.class.getSimpleName()); - fieldInfo2.setFieldComment("children:"+arrayObject.toString()); - fieldList.add(fieldInfo2); - }); - } - }); - if(fieldList.size()<1){ - throw new CodeGenerateException("JSON解析失败"); - } - return fieldList; - } -} +package com.softdev.system.generator.util; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.softdev.system.generator.entity.ClassInfo; +import com.softdev.system.generator.entity.FieldInfo; +import com.softdev.system.generator.entity.ParamInfo; + +import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author zhengkai.blog.csdn.net + */ +public class TableParseUtil { + + /** + * 解析建表SQL生成代码(model-dao-xml) + * + * @param paramInfo + * @return + */ + public static ClassInfo processTableIntoClassInfo(ParamInfo paramInfo) + throws IOException { + //process the param + String tableSql=paramInfo.getTableSql(); + String nameCaseType=paramInfo.getNameCaseType(); + String tinyintTransType=paramInfo.getTinyintTransType(); + + if (tableSql==null || tableSql.trim().length()==0) { + throw new CodeGenerateException("Table structure can not be empty."); + } + //deal with special character + tableSql = tableSql.trim().replaceAll("'","`").replaceAll("\"","`").replaceAll(",",",").toLowerCase(); + //deal with java string copy \n" + tableSql = tableSql.trim().replaceAll("\\\\n`","").replaceAll("\\+","").replaceAll("``","`").replaceAll("\\\\",""); + // table Name + String tableName = null; + if (tableSql.contains("TABLE") && tableSql.contains("(")) { + tableName = tableSql.substring(tableSql.indexOf("TABLE")+5, tableSql.indexOf("(")); + } else if (tableSql.contains("table") && tableSql.contains("(")) { + tableName = tableSql.substring(tableSql.indexOf("table")+5, tableSql.indexOf("(")); + } else { + throw new CodeGenerateException("Table structure anomaly."); + } + + //新增处理create table if not exists members情况 + if (tableName.contains("if not exists")) { + tableName=tableName.replaceAll("if not exists",""); + } + + if (tableName.contains("`")) { + tableName = tableName.substring(tableName.indexOf("`")+1, tableName.lastIndexOf("`")); + }else{ + //空格开头的,需要替换掉\n\t空格 + tableName=tableName.replaceAll(" ","").replaceAll("\n","").replaceAll("\t",""); + } + //优化对byeas`.`ct_bd_customerdiscount这种命名的支持 + if(tableName.contains("`.`")){ + tableName=tableName.substring(tableName.indexOf("`.`")+3); + }else if(tableName.contains(".")){ + //优化对likeu.members这种命名的支持 + tableName=tableName.substring(tableName.indexOf(".")+1); + } + // class Name + String className = StringUtils.upperCaseFirst(StringUtils.underlineToCamelCase(tableName)); + if (className.contains("_")) { + className = className.replaceAll("_", ""); + } + + // class Comment + String classComment = null; + //mysql是comment=,pgsql/oracle是comment on table, + if (tableSql.contains("comment=")) { + String classCommentTmp = tableSql.substring(tableSql.lastIndexOf("comment=")+8).replaceAll("`","").trim(); + if (classCommentTmp.indexOf(" ")!=classCommentTmp.lastIndexOf(" ")) { + classCommentTmp = classCommentTmp.substring(classCommentTmp.indexOf(" ")+1, classCommentTmp.lastIndexOf(" ")); + } + if (classCommentTmp!=null && classCommentTmp.trim().length()>0) { + classComment = classCommentTmp; + }else{ + //修复表备注为空问题 + classComment = className; + } + }else if(tableSql.contains("comment on table")) { + //COMMENT ON TABLE CT_BAS_FEETYPE IS 'CT_BAS_FEETYPE'; + String classCommentTmp = tableSql.substring(tableSql.lastIndexOf("comment on table")+17).trim(); + //证明这是一个常规的COMMENT ON TABLE xxx IS 'xxxx' + if (classCommentTmp.contains("`")) { + classCommentTmp = classCommentTmp.substring(classCommentTmp.indexOf("`")+1); + classCommentTmp = classCommentTmp.substring(0,classCommentTmp.indexOf("`")); + classComment = classCommentTmp; + }else{ + //非常规的没法分析 + classComment = tableName; + } + }else{ + //修复表备注为空问题 + classComment = tableName; + } + //如果备注跟;混在一起,需要替换掉 + classComment=classComment.replaceAll(";",""); + // field List + List fieldList = new ArrayList(); + + // 正常( ) 内的一定是字段相关的定义。 + String fieldListTmp = tableSql.substring(tableSql.indexOf("(")+1, tableSql.lastIndexOf(")")); + + // 匹配 comment,替换备注里的小逗号, 防止不小心被当成切割符号切割 + String commentPattenStr1="comment `(.*?)\\`"; + Matcher matcher1 = Pattern.compile(commentPattenStr1).matcher(fieldListTmp); + while(matcher1.find()){ + + String commentTmp = matcher1.group(); + //2018-9-27 zhengk 不替换,只处理,支持COMMENT评论里面多种注释 + //commentTmp = commentTmp.replaceAll("\\ comment `|\\`", " "); // "\\{|\\}" + + if (commentTmp.contains(",")) { + String commentTmpFinal = commentTmp.replaceAll(",", ","); + fieldListTmp = fieldListTmp.replace(matcher1.group(), commentTmpFinal); + } + } + //2018-10-18 zhengkai 新增支持double(10, 2)等类型中有英文逗号的特殊情况 + String commentPattenStr2="\\`(.*?)\\`"; + Matcher matcher2 = Pattern.compile(commentPattenStr2).matcher(fieldListTmp); + while(matcher2.find()){ + String commentTmp2 = matcher2.group(); + if (commentTmp2.contains(",")) { + String commentTmpFinal = commentTmp2.replaceAll(",", ",").replaceAll("\\(", "(").replaceAll("\\)", ")"); + fieldListTmp = fieldListTmp.replace(matcher2.group(), commentTmpFinal); + } + } + //2018-10-18 zhengkai 新增支持double(10, 2)等类型中有英文逗号的特殊情况 + String commentPattenStr3="\\((.*?)\\)"; + Matcher matcher3 = Pattern.compile(commentPattenStr3).matcher(fieldListTmp); + while(matcher3.find()){ + String commentTmp3 = matcher3.group(); + if (commentTmp3.contains(",")) { + String commentTmpFinal = commentTmp3.replaceAll(",", ","); + fieldListTmp = fieldListTmp.replace(matcher3.group(), commentTmpFinal); + } + } + String[] fieldLineList = fieldListTmp.split(","); + if (fieldLineList.length > 0) { + int i=0; + //i为了解决primary key关键字出现的地方,出现在前3行,一般和id有关 + for (String columnLine :fieldLineList) { + i++; + columnLine = columnLine.replaceAll("\n","").replaceAll("\t","").trim(); + // `userid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', + // 2018-9-18 zhengk 修改为contains,提升匹配率和匹配不按照规矩出牌的语句 + // 2018-11-8 zhengkai 修复tornadoorz反馈的KEY FK_permission_id (permission_id),KEY FK_role_id (role_id)情况 + // 2019-2-22 zhengkai 要在条件中使用复杂的表达式 + // 2019-4-29 zhengkai 优化对普通和特殊storage关键字的判断(感谢@AhHeadFloating的反馈 ) + boolean specialFlag=(!columnLine.contains("key ")&&!columnLine.contains("constraint")&&!columnLine.contains("using")&&!columnLine.contains("unique") + &&!(columnLine.contains("primary ")&&columnLine.indexOf("storage")+3>columnLine.indexOf("(")) + &&!columnLine.contains("pctincrease") + &&!columnLine.contains("buffer_pool")&&!columnLine.contains("tablespace") + &&!(columnLine.contains("primary ")&&i>3)); + if (specialFlag){ + //如果是oracle的number(x,x),可能出现最后分割残留的,x),这里做排除处理 + if(columnLine.length()<5) {continue;} + //2018-9-16 zhengkai 支持'符号以及空格的oracle语句// userid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', + String columnName = ""; + columnLine=columnLine.replaceAll("`"," ").replaceAll("\""," ").replaceAll("'","").replaceAll(" "," ").trim(); + //如果遇到username varchar(65) default '' not null,这种情况,判断第一个空格是否比第一个引号前 + columnName = columnLine.substring(0, columnLine.indexOf(" ")); + // field Name + // 2019-09-08 yj 添加是否下划线转换为驼峰的判断 + String fieldName=null; + if(ParamInfo.NAME_CASE_TYPE.CAMEL_CASE.equals(nameCaseType)){ + fieldName = StringUtils.lowerCaseFirst(StringUtils.underlineToCamelCase(columnName)); + if (fieldName.contains("_")) { + fieldName = fieldName.replaceAll("_", ""); + } + }else if(ParamInfo.NAME_CASE_TYPE.UNDER_SCORE_CASE.equals(nameCaseType)){ + fieldName = StringUtils.lowerCaseFirst(columnName); + }else if(ParamInfo.NAME_CASE_TYPE.UPPER_UNDER_SCORE_CASE.equals(nameCaseType)){ + fieldName = StringUtils.lowerCaseFirst(columnName.toUpperCase()); + }else{ + fieldName=columnName; + } + + // field class + columnLine = columnLine.substring(columnLine.indexOf("`")+1).trim(); + // int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', + String fieldClass = Object.class.getSimpleName(); + //2018-9-16 zhengk 补充char/clob/blob/json等类型,如果类型未知,默认为String + //2018-11-22 lshz0088 处理字段类型的时候,不严谨columnLine.contains(" int") 类似这种的,可在前后适当加一些空格之类的加以区分,否则当我的字段包含这些字符的时候,产生类型判断问题。 + if (columnLine.contains(" int") || columnLine.contains("smallint")) { + fieldClass = Integer.class.getSimpleName(); + } else if (columnLine.contains("bigint")) { + fieldClass = Long.class.getSimpleName(); + } else if (columnLine.contains("float")) { + fieldClass = Float.class.getSimpleName(); + } else if (columnLine.contains("double")) { + fieldClass = Double.class.getSimpleName(); + } else if (columnLine.contains("time") || columnLine.contains("date") || columnLine.contains("datetime") || columnLine.contains("timestamp")) { + fieldClass = Date.class.getSimpleName(); + } else if (columnLine.contains("varchar") || columnLine.contains(" text")|| columnLine.contains("char") + || columnLine.contains("clob")||columnLine.contains("blob")||columnLine.contains("json")) { + fieldClass = String.class.getSimpleName(); + } else if (columnLine.contains("decimal")||columnLine.contains(" number")) { + //2018-11-22 lshz0088 建议对number类型增加int,long,BigDecimal的区分判断 + //如果startKh大于等于0,则表示有设置取值范围 + int startKh=columnLine.indexOf("("); + if(startKh>=0){ + int endKh=columnLine.indexOf(")",startKh); + String[] fanwei=columnLine.substring(startKh+1,endKh).split(","); + //2019-1-5 zhengk 修复@arthaschan反馈的超出范围错误 + //System.out.println("fanwei"+ JSON.toJSONString(fanwei)); + // //number(20,6) fanwei["20","6"] + // //number(0,6) fanwei["0","6"] + // //number(20,0) fanwei["20","0"] + // //number(20) fanwei["20"] + //如果括号里是1位或者2位且第二位为0,则进行特殊处理。只有有小数位,都设置为BigDecimal。 + if((fanwei.length>1&&"0".equals(fanwei[1]))||fanwei.length==1){ + int length=Integer.parseInt(fanwei[0]); + if(fanwei.length>1) { + length=Integer.valueOf(fanwei[1]); + } + //数字范围9位及一下用Integer,大的用Long + if(length<=9){ + fieldClass = Integer.class.getSimpleName(); + }else{ + fieldClass = Long.class.getSimpleName(); + } + }else{ + //有小数位数一律使用BigDecimal + fieldClass = BigDecimal.class.getSimpleName(); + } + }else{ + fieldClass = BigDecimal.class.getSimpleName(); + } + } else if (columnLine.contains("boolean")) { + //20190910 MOSHOW.K.ZHENG 新增对boolean的处理(感谢@violinxsc的反馈)以及修复tinyint类型字段无法生成boolean类型问题(感谢@hahaYhui的反馈) + fieldClass = Boolean.class.getSimpleName(); + } else if (columnLine.contains("tinyint") ) { + //20191115 MOSHOW.K.ZHENG 支持对tinyint的特殊处理 + fieldClass=tinyintTransType; + } else { + fieldClass = String.class.getSimpleName(); + } + + // field comment,MySQL的一般位于field行,而pgsql和oralce多位于后面。 + String fieldComment = null; + if(tableSql.contains("comment on column")&&(tableSql.contains("."+columnName+" is ")||tableSql.contains(".`"+columnName+"` is"))){ + //新增对pgsql/oracle的字段备注支持 + //COMMENT ON COLUMN public.check_info.check_name IS '检查者名称'; + //2018-11-22 lshz0088 正则表达式的点号前面应该加上两个反斜杠,否则会认为是任意字符 + //2019-4-29 zhengkai 优化对oracle注释comment on column的支持(@liukex) + tableSql=tableSql.replaceAll(".`"+columnName+"` is","."+columnName+" is"); + Matcher columnCommentMatcher = Pattern.compile("\\."+columnName+" is `").matcher(tableSql); + fieldComment=columnName; + while(columnCommentMatcher.find()){ + String columnCommentTmp = columnCommentMatcher.group(); + System.out.println(columnCommentTmp); + fieldComment = tableSql.substring(tableSql.indexOf(columnCommentTmp)+columnCommentTmp.length()).trim(); + fieldComment = fieldComment.substring(0,fieldComment.indexOf("`")).trim(); + } + }else if (columnLine.contains("comment")) { + String commentTmp = columnLine.substring(columnLine.indexOf("comment")+7).trim(); + // '用户ID', + if (commentTmp.contains("`") || commentTmp.indexOf("`")!=commentTmp.lastIndexOf("`")) { + commentTmp = commentTmp.substring(commentTmp.indexOf("`")+1, commentTmp.lastIndexOf("`")); + } + //解决最后一句是评论,无主键且连着)的问题:album_id int(3) default '1' null comment '相册id:0 代表头像 1代表照片墙') + if(commentTmp.contains(")")){ + commentTmp = commentTmp.substring(0, commentTmp.lastIndexOf(")")+1); + } + fieldComment = commentTmp; + }else{ + //修复comment不存在导致报错的问题 + fieldComment = columnName; + } + + FieldInfo fieldInfo = new FieldInfo(); + fieldInfo.setColumnName(columnName); + fieldInfo.setFieldName(fieldName); + fieldInfo.setFieldClass(fieldClass); + fieldInfo.setFieldComment(fieldComment); + + fieldList.add(fieldInfo); + } + } + } + + if (fieldList.size() < 1) { + throw new CodeGenerateException("表结构分析失败,请检查语句或者提交issue给我"); + } + + ClassInfo codeJavaInfo = new ClassInfo(); + codeJavaInfo.setTableName(tableName); + codeJavaInfo.setClassName(className); + codeJavaInfo.setClassComment(classComment); + codeJavaInfo.setFieldList(fieldList); + + return codeJavaInfo; + } + /** + * parse JSON + * @param paramInfo + * @return + */ + public static ClassInfo processJsonToClassInfo(ParamInfo paramInfo){ + ClassInfo codeJavaInfo = new ClassInfo(); + codeJavaInfo.setTableName("JsonDto"); + codeJavaInfo.setClassName("JsonDto"); + codeJavaInfo.setClassComment("JsonDto"); + + //support children json if forget to add '{' in front of json + if(paramInfo.getTableSql().trim().startsWith("\"")){ + paramInfo.setTableSql("{"+paramInfo.getTableSql()); + } + if(JSON.isValid(paramInfo.getTableSql())){ + if(paramInfo.getTableSql().trim().startsWith("{")){ + JSONObject jsonObject = JSONObject.parseObject(paramInfo.getTableSql().trim()); + //parse FieldList by JSONObject + codeJavaInfo.setFieldList(processJsonObjectToFieldList(jsonObject)); + }else if(paramInfo.getTableSql().trim().startsWith("[")){ + JSONArray jsonArray=JSONArray.parseArray(paramInfo.getTableSql().trim()); + //parse FieldList by JSONObject + codeJavaInfo.setFieldList(processJsonObjectToFieldList(jsonArray.getJSONObject(0))); + } + } + + return codeJavaInfo; + } + /** + * parse SQL by regex + * @author https://github.com/ydq + * @param paramInfo + * @return + */ + public static ClassInfo processTableToClassInfoByRegex(ParamInfo paramInfo){ + // field List + List fieldList = new ArrayList(); + //return classInfo + ClassInfo codeJavaInfo = new ClassInfo(); + + //匹配整个ddl,将ddl分为表名,列sql部分,表注释 + String DDL_PATTEN_STR="\\s*create\\s+table\\s+(?\\S+)[^\\(]*\\((?[\\s\\S]+)\\)[^\\)]+?(comment\\s*(=|on\\s+table)\\s*'(?.*?)'\\s*;?)?$"; + + Pattern DDL_PATTERN = Pattern.compile(DDL_PATTEN_STR, Pattern.CASE_INSENSITIVE); + + //匹配列sql部分,分别解析每一列的列名 类型 和列注释 + String COL_PATTERN_STR="\\s*(?\\S+)\\s+(?\\w+)\\s*(?:\\([\\s\\d,]+\\))?((?!comment).)*(comment\\s*'(?.*?)')?\\s*(,|$)"; + + Pattern COL_PATTERN = Pattern.compile(COL_PATTERN_STR, Pattern.CASE_INSENSITIVE); + + Matcher matcher = DDL_PATTERN.matcher(paramInfo.getTableSql().trim()); + if (matcher.find()){ + String tableName = matcher.group("tableName"); + String tableComment = matcher.group("tableComment"); + codeJavaInfo.setTableName(tableName.replaceAll("'","")); + codeJavaInfo.setClassName(tableName.replaceAll("'","")); + codeJavaInfo.setClassComment(tableComment.replaceAll("'","")); + String columnsSQL = matcher.group("columnsSQL"); + if (columnsSQL != null && columnsSQL.length() > 0){ + Matcher colMatcher = COL_PATTERN.matcher(columnsSQL); + while (colMatcher.find()){ + String fieldName = colMatcher.group("fieldName"); + String fieldType = colMatcher.group("fieldType"); + String fieldComment = colMatcher.group("fieldComment"); + if (!"key".equalsIgnoreCase(fieldType)){ + FieldInfo fieldInfo = new FieldInfo(); + fieldInfo.setFieldName(fieldName.replaceAll("'","")); + fieldInfo.setColumnName(fieldName.replaceAll("'","")); + fieldInfo.setFieldClass(fieldType.replaceAll("'","")); + fieldInfo.setFieldComment(fieldComment.replaceAll("'","")); + fieldList.add(fieldInfo); + } + } + } + codeJavaInfo.setFieldList(fieldList); + } + return codeJavaInfo; + } + public static List processJsonObjectToFieldList(JSONObject jsonObject){ + // field List + List fieldList = new ArrayList(); + jsonObject.keySet().stream().forEach(jsonField->{ + FieldInfo fieldInfo = new FieldInfo(); + fieldInfo.setFieldName(jsonField); + fieldInfo.setColumnName(jsonField); + fieldInfo.setFieldClass(String.class.getSimpleName()); + fieldInfo.setFieldComment("father:"+jsonField); + fieldList.add(fieldInfo); + if(jsonObject.get(jsonField) instanceof JSONArray){ + jsonObject.getJSONArray(jsonField).stream().forEach(arrayObject->{ + FieldInfo fieldInfo2 = new FieldInfo(); + fieldInfo2.setFieldName(arrayObject.toString()); + fieldInfo2.setColumnName(arrayObject.toString()); + fieldInfo2.setFieldClass(String.class.getSimpleName()); + fieldInfo2.setFieldComment("children:"+arrayObject.toString()); + fieldList.add(fieldInfo2); + }); + }else if(jsonObject.get(jsonField) instanceof JSONObject){ + jsonObject.getJSONObject(jsonField).keySet().stream().forEach(arrayObject->{ + FieldInfo fieldInfo2 = new FieldInfo(); + fieldInfo2.setFieldName(arrayObject.toString()); + fieldInfo2.setColumnName(arrayObject.toString()); + fieldInfo2.setFieldClass(String.class.getSimpleName()); + fieldInfo2.setFieldComment("children:"+arrayObject.toString()); + fieldList.add(fieldInfo2); + }); + } + }); + if(fieldList.size()<1){ + throw new CodeGenerateException("JSON解析失败"); + } + return fieldList; + } +} diff --git a/generator-web/src/main/resources/templates/code-generator/jpa/entity.ftl b/generator-web/src/main/resources/templates/code-generator/jpa/entity.ftl index 7e56e15d..d2cb299c 100644 --- a/generator-web/src/main/resources/templates/code-generator/jpa/entity.ftl +++ b/generator-web/src/main/resources/templates/code-generator/jpa/entity.ftl @@ -1,8 +1,16 @@ -import java.io.Serializable; -import javax.persistence.*; +package ${packageName}.entity; + import lombok.Data; import java.util.Date; import java.util.List; +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.GeneratedValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; /** * ${classInfo.classComment} @@ -11,6 +19,7 @@ import java.util.List; @Entity @Data @Table(name="${classInfo.tableName}") +@ApiModel("${classInfo.classComment}") public class ${classInfo.className} implements Serializable { private static final long serialVersionUID = 1L; @@ -22,6 +31,8 @@ public class ${classInfo.className} implements Serializable { /** * ${fieldItem.fieldComment} */ + @ApiModelProperty("${fieldItem.fieldComment}") + @Column("${fieldItem.columnName}") private ${fieldItem.fieldClass} ${fieldItem.fieldName}; diff --git a/generator-web/src/main/resources/templates/index.ftl b/generator-web/src/main/resources/templates/index.ftl index 1eb4abfa..8612b491 100644 --- a/generator-web/src/main/resources/templates/index.ftl +++ b/generator-web/src/main/resources/templates/index.ftl @@ -1,331 +1,331 @@ - - - - - SQL转Java JPA、MYBATIS实现类代码生成平台 - - - <#import "common/common-import.ftl" as netCommon> - <@netCommon.commonStyle /> - <@netCommon.commonScript /> - - - - - - - - -
-
-

Spring Boot Code Generator!

-

- √基于SpringBoot2+Freemarker的代码生成器,√以释放双手为目的,√支持mysql/oracle/pgsql三大数据库,
- √用DDL-SQL语句生成JPA/JdbcTemplate/Mybatis/MybatisPlus/BeetlSQL相关代码。
- 欢迎大家多多提交模板和交流想法,如果发现有SQL语句不能识别,请留言,同时欢迎大家提PR点击赞赏,谢谢! -

- -
-
-
- 作者名称 -
- -
- 返回封装 -
- -
- 包名路径 -
- -
-
-
- 数据类型 -
- -
- tinyint转换类型 -
- -
- 命名转换规则 -
- -
-
-

-
- -
- - -
- -
- - - -
- -
- - -
-
- - -
-
- - -
-
- -
-
- - <@netCommon.commonFooter /> - - + + + + + SQL转Java JPA、MYBATIS实现类代码生成平台 + + + <#import "common/common-import.ftl" as netCommon> + <@netCommon.commonStyle /> + <@netCommon.commonScript /> + + + + + + + + +
+
+

Spring Boot Code Generator!

+

+ √基于SpringBoot2+Freemarker的代码生成器,√以释放双手为目的,√支持mysql/oracle/pgsql三大数据库,
+ √用DDL-SQL语句生成JPA/JdbcTemplate/Mybatis/MybatisPlus/BeetlSQL相关代码。
+ 欢迎大家多多提交模板和交流想法,如果发现有SQL语句不能识别,请留言,同时欢迎大家提PR点击赞赏,谢谢! +

+ +
+
+
+ 作者名称 +
+ +
+ 返回封装 +
+ +
+ 包名路径 +
+ +
+
+
+ 数据类型 +
+ +
+ tinyint转换类型 +
+ +
+ 命名转换规则 +
+ +
+
+

+
+ +
+ + +
+ +
+ + + +
+ +
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + <@netCommon.commonFooter /> + + From 870d95e1bfe8ab8fa111c7495d3fec0e4636789d Mon Sep 17 00:00:00 2001 From: "MOSHOW.K.ZHENG" Date: Thu, 28 Nov 2019 23:16:09 +0800 Subject: [PATCH 6/7] version --- generator-web/pom.xml | 4 ++-- generator-web/src/main/resources/static/version.json | 1 + pom.xml | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 generator-web/src/main/resources/static/version.json diff --git a/generator-web/pom.xml b/generator-web/pom.xml index ceaa594b..fcb8dc64 100644 --- a/generator-web/pom.xml +++ b/generator-web/pom.xml @@ -7,12 +7,12 @@ com.softdev.system SpringBootCodeGenerator - 0.0.1-SNAPSHOT + 2.0 com.softdev.system generator-web - 0.0.1-SNAPSHOT + 2.0 jar diff --git a/generator-web/src/main/resources/static/version.json b/generator-web/src/main/resources/static/version.json new file mode 100644 index 00000000..0a0277c0 --- /dev/null +++ b/generator-web/src/main/resources/static/version.json @@ -0,0 +1 @@ +{"version": "20191128"} \ No newline at end of file diff --git a/pom.xml b/pom.xml index c2207831..951718af 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.softdev.system SpringBootCodeGenerator - 0.0.1-SNAPSHOT + 2.0 pom From b7861ca9fc2ea542d4fc446953c8964b691d61f5 Mon Sep 17 00:00:00 2001 From: "MOSHOW.K.ZHENG" Date: Thu, 28 Nov 2019 23:26:31 +0800 Subject: [PATCH 7/7] version --- .../src/main/resources/templates/index.ftl | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/generator-web/src/main/resources/templates/index.ftl b/generator-web/src/main/resources/templates/index.ftl index 8612b491..c7234e56 100644 --- a/generator-web/src/main/resources/templates/index.ftl +++ b/generator-web/src/main/resources/templates/index.ftl @@ -108,6 +108,28 @@ } }); + function getVersion(){ + var gitVersion ; + $.ajax({ + type: 'GET', + url: "https://raw.githubusercontent.com/moshowgame/SpringBootCodeGenerator/master/generator-web/src/main/resources/static/version.json", + dataType: "json", + success: function (data) { + gitVersion = data.version; + $.ajax({ + type: 'GET', + url: base_url + "/static/version.json", + dataType: "json", + success: function (data) { + $.toast("#当前版本:"+data.version+" | github:"+gitVersion); + } + }); + } + }); + } + $('#version').on('click', function(){ + getVersion(); + }); }); @@ -131,7 +153,7 @@

√基于SpringBoot2+Freemarker的代码生成器,√以释放双手为目的,√支持mysql/oracle/pgsql三大数据库,
√用DDL-SQL语句生成JPA/JdbcTemplate/Mybatis/MybatisPlus/BeetlSQL相关代码。
- 欢迎大家多多提交模板和交流想法,如果发现有SQL语句不能识别,请留言,同时欢迎大家提PR点击赞赏,谢谢! + 如果发现有SQL语句不能识别,请留言,同时欢迎大家提PR赞赏,谢谢!查看版本