22 Commits

Author SHA1 Message Date
MOSHOW.K.ZHENG
03152e54ef 1.修复bejson安全防护策略拦截问题(感谢@liangbintao和@1808083642的反馈) 2.优化字段名含date字符串的处理(感谢@smilexzh的反馈) 3.控制台动态输出项目访问地址(感谢@gaohanghang的提交) 2019-12-29 22:51:19 +08:00
Moshow郑锴
8b37443018 Merge pull request #73 from gaohanghang/master
动态获取tomcat启动端口,控制台打印项目访问地址(PR by @gaohanghang )
2019-12-29 22:40:20 +08:00
gaohanghang
eb7760ac18 动态获取tomcat启动端口,控制台打印项目访问地址 2019-12-27 14:43:49 +08:00
gaohang
ae7815105f Merge pull request #5 from moshowgame/master
merge
2019-11-29 20:19:56 +08:00
MOSHOW.K.ZHENG
b7861ca9fc version 2019-11-28 23:26:31 +08:00
MOSHOW.K.ZHENG
870d95e1bf version 2019-11-28 23:16:09 +08:00
MOSHOW.K.ZHENG
a84a4c1087 1.修复支持string-copy导致的以n结尾的字母不显示问题 2.jpa-entity新增swagger@ApiModel@ApiModelProperty注解和SQL字段@Column注解(感谢@yjq907的建议) 2019-11-28 22:19:53 +08:00
Moshow郑锴
f746461188 Merge pull request #60 from gaohanghang/master
更新实体类模板,将 serialVersionUID 所在行的代码换行,使代码更加美观
2019-11-26 23:06:14 +08:00
MOSHOW.K.ZHENG
02c43a8a9e Update README.md 2019-11-26 22:58:24 +08:00
MOSHOW.K.ZHENG
f45b1bfa8a add release jar download url&img
add release jar download url&img
2019-11-26 22:56:20 +08:00
MOSHOW.K.ZHENG
a68989be66 1.springboot2内置tomcat更换为性能更强大的undertow 2.修复tinyintTransType参数丢失问题
1.springboot2内置tomcat更换为性能更强大的undertow 2.修复tinyintTransType参数丢失问题
2019-11-26 22:45:23 +08:00
MOSHOW.K.ZHENG
65b0584c45 Update index.ftl
修复缺失的字段
2019-11-26 21:56:46 +08:00
gaohanghang
6cfa5d2c63 更新实体类模板,将 serialVersionUID 所在行的代码换行,使代码更加美观 2019-11-25 02:16:36 +08:00
gaohang
a4736f65b5 Merge pull request #4 from moshowgame/master
merge
2019-11-25 01:51:01 +08:00
Moshow郑锴
72257e00bd Merge pull request #59 from moshowgame/201911dev
Merge from 201911dev
2019-11-24 12:10:58 +08:00
MOSHOW.K.ZHENG
1bb8881928 Update
4.新增对复制String代码中的乱SQL代码的支持 5.优化对JSON的父子节点/处理,JSONObject和JSONArray节点处理,子节点缺失'{'头处理
2019-11-24 12:08:24 +08:00
MOSHOW.K.ZHENG
dae662836b Update
1.java代码结构优化. 2.新增简单的json生成模式 3.新增简单的正则表达式匹配模式(感谢@ydq的贡献)
2019-11-24 10:25:06 +08:00
Moshow郑锴
d738c587c6 Update README.md
update to real markdown
2019-11-23 13:55:56 +08:00
MOSHOW.K.ZHENG
04b9294450 donate优化 2019-11-23 10:24:10 +08:00
MOSHOW.K.ZHENG
17707d68e8 donate优化 2019-11-23 10:23:31 +08:00
MOSHOW.K.ZHENG
1b5d79ded1 1.移除频繁出错和被过滤的layer,改为jquery-toast. 2.Util功能优化,新增json和xml. 2019-11-23 10:10:26 +08:00
gaohang
60b214bf0f Merge pull request #3 from moshowgame/master
merge
2019-11-15 00:04:39 +08:00
27 changed files with 1252 additions and 1064 deletions

150
README.md
View File

@@ -1,67 +1,83 @@
![image](https://img.shields.io/badge/SpringBoot2-%E2%98%85%E2%98%85%E2%98%85%E2%98%85%E2%98%85-brightgreen.svg) # SpringBootCodeGenerator
![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/SpringBoot2-%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) ![image](https://img.shields.io/badge/Freemarker-%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) ![image](https://img.shields.io/badge/CodeGenerator-%E2%98%85%E2%98%85%E2%98%85%E2%98%85%E2%98%85-brightgreen.svg)
<br> [![Build Status](https://travis-ci.org/moshowgame/SpringBootCodeGenerator.svg?branch=master)](https://travis-ci.org/moshowgame/SpringBootCodeGenerator)
SpringBootCodeGenerator
---- # Description
基于SpringBoot2+Freemarker的代码生成器√以释放双手为目的√支持mysql/oracle/pgsql三大数据库<br> -基于SpringBoot2+Freemarker+Bootstrap
√用DDL-SQL语句生成JPA/JdbcTemplate/Mybatis/MybatisPlus/BeetlSQL相关代码.<br><br> - √ 以释放双手为目的
另外感谢bejson三叔将他部署在 http://java.bejson.com/generator 上目前是besjon专供工具(线上版本不一定是最新的,会有延迟,请谅解,谢谢). - √ 支持mysql/oracle/pgsql三大数据库
<br><br> - √ 用DDL-SQL语句生成JPA/JdbcTemplate/Mybatis/MybatisPlus/BeetlSQL相关代码.
<table><tbody>
<tr><td>访问路径</td> <td>http://127.0.0.1:1234/generator</td></tr>
<tr><td>在线地址</td> <td>http://java.bejson.com/generator</td></tr> # Url
<tr><td>CSDN博客</td> <td>http://zhengkai.blog.csdn.net</td></tr>
<tr><td></td> <td></td></tr> |访问路径|http://localhost:1234/generator|
<tr><td>更新日期</td> <td>更新内容</td></tr> |-|-|
<tr><td>20191116<td>优化对primary关键字的处理(感谢@liujiansgit的反馈). </td></tr> |在线地址|http://java.bejson.com/generator|
<tr><td>20191115<td>1.添加tinyint类型转换(感谢@lixiliang&@liujiansgit的Suggestion) 2.添加一键复制功能(感谢@gaohanghang的Suggestion) 3.Mybatis的insert增加keyProperty="id"用于返回自增id(感谢@88888888888888888888的Suggestion) 4.优化date类型的支持(感谢@SteveLsf的反馈) 5.其他一些优化. </td></tr> |CSDN博客|http://zhengkai.blog.csdn.net|
<tr><td>20191015<td>修复jdbcTemplates中insert语句第一个字段丢失的问题. </td></tr> |最新Jar包|https://github.com/moshowgame/SpringBootCodeGenerator/releases|
<tr><td>20190915<td>1.添加对象getset模板 2.添加sql模板 3.启动类添加日志输出,方便项目使用(感谢@gaohanghang 的pull request) </td></tr>
<tr><td>20190910-2<td>优化以及更新Maven依赖减少打包体积. </td></tr> 感谢bejson三叔将他部署在[BEJSON](www.bejson.com)上目前是besjon专供工具(线上版本不一定是最新的,会有延迟,请谅解,谢谢).
<tr><td>20190910-1<td>1.修复mapper接口load方法但是xml中方法不匹配问题 2.移除mapper中CRUD时的@param 注解会影响xml的解析(感谢@caojiantao的反馈).3.优化MyBatis的xml文件对Oracle的支持.(感谢@wylove1992的反馈) 4.新增对boolean的处理(感谢@violinxsc的反馈)以及优化tinyint类型生成boolean类型问题(感谢@hahaYhui的反馈) </td></tr>
<tr><td>20190909<td>添加是否下划线转换为驼峰的选择(感谢@youngking28 的pull request).</td></tr>
<tr><td>20190518<td>1.优化注释 2.修改 mybatis模板中 controller注解 3.修改 mybatis模板中 dao文件使用为 mapper文件 4.修改 mybatis模板中 service实现类中的一个 bug 5.修改 index.ftl文件中 mybatis模板的 dao -> mapper(感谢@unqin的pull request)</td></tr> # Update
<tr><td>20190511<td>优化mybatis模块的dao和xml模板修改dao接口注解为@Repository所有dao参数改为包装类删除update语句最后的UpdateTime = NOW()修改dao接口文件的方法注释使其更符合javaDoc的标准修改insert语句增加插入行主键的返回修改load的方法名为selectByPrimaryKey修改xml的update语句新增动态if判空修改xml的insert语句新增动态插入判空更符合mybatisGenerator标准(感谢@Archer-Wen的贡献 ).</td></tr>
<tr><td>20190429<td>新增返回封装工具类设置优化对oracle注释comment on column的支持(感谢@liukex反馈)优化对普通和特殊storage关键字的判断(感谢@AhHeadFloating的反馈 ).</td></tr> |更新日期|更新内容|
<tr><td>20190211<td>提交gitignore解决StringUtils.lowerCaseFirst潜在的NPE异常校验修改为@RequestParam参数校验lombok之@Data和@Slf4j优化fix JdbcDAO模板类名显示为中文问题WebMvcConfig整合MessageConverter模板代码分类(感谢@liutf和@tfgzs的pull request).</td></tr> |-|-|
<tr><td>20190210<td>实体生成规则切换为包装类型,不再采用基本数据类型,为实体类生成添加显示的默认构造方法(感谢@h2so的pull request).</td></tr> |20191229|1.修复bejson安全防护策略拦截问题(感谢@liangbintao和@1808083642的反馈) 2.优化字段名含date字符串的处理(感谢@smilexzh的反馈) 3.控制台动态输出项目访问地址(感谢@gaohanghang的提交)|
<tr><td>20190106<td>修复处理number/decimal(x,x)类型的逻辑(感谢@arthaschan的反馈)修复JdbcTemplates模板两处错误(感谢@everflourish的反馈).</td></tr> |20191128|1.修复支持string-copy导致的以n结尾的字母不显示问题 2.jpa-entity新增swagger@ApiModel@ApiModelProperty注解和SQL字段@Column注解(感谢@yjq907的建议) |
<tr><td>20181212<td>首页UI优化新增MybatisPlus模块(感谢@三叔同事的建议),修复作者名和包名获取失败问题(感谢@Yanch1994的反馈).</td></tr> |20191126|1.springboot2内置tomcat更换为性能更强大的undertow 2.修复tinyintTransType参数丢失问题 |
<tr><td>20181122<td>优化正则表达式点号的处理优化处理字段类型对number类型增加intlongBigDecimal的区分判断(感谢@lshz0088的指导).</td></tr> |20191124|1.java代码结构优化. 2.新增简单的json生成模式 3.新增简单的正则表达式匹配模式(感谢@ydq的贡献) 4.新增对复制String代码中的乱SQL代码的支持 5.优化对JSON的父子节点/处理JSONObject和JSONArray节点处理子节点缺失'{'头处理|
<tr><td>20181108<td>修复非字段描述"KEY FK_xxxx (xxxx)"导致生成KEY字段情况(感谢@tornadoorz反馈).</td></tr> |20191123|1.移除频繁出错和被过滤的layer,改为jquery-toast. 2.Util功能优化,新增json和xml.|
<tr><td>20181018<td>支持double(x,x)的类型以及comment里面包含一些特殊字符的处理(感谢@tanwubo的反馈).</td></tr> |20191116|优化对primary关键字的处理(感谢@liujiansgit的反馈). |
<tr><td>20181010<td>CDN变更修复CDN不稳定导致网页js报错问题.</td></tr> |20191115|1.添加tinyint类型转换(感谢@lixiliang&@liujiansgit的Suggestion) 2.添加一键复制功能(感谢@gaohanghang的Suggestion) 3.Mybatis的insert增加keyProperty="id"用于返回自增id(感谢@88888888888888888888的Suggestion) 4.优化date类型的支持(感谢@SteveLsf的反馈) 5.其他一些优化. |
<tr><td>20181003<td>新增element-ui/bootstrap生成.</td></tr> |20191015|修复jdbcTemplates中insert语句第一个字段丢失的问题. |
<tr><td>20181002<td>修复公共CDN之Layer.js404问题导致项目无法生成.</td></tr> |20190915|1.添加对象getset模板 2.添加sql模板 3.启动类添加日志输出,方便项目使用(感谢@gaohanghang 的pull request) |
<tr><td>20180927<td>优化COMMENT提取逻辑支持多种复杂情况的注释(感谢@raodeming的反馈).</td></tr> |20190910-2|优化以及更新Maven依赖减少打包体积. |
<tr><td>20180926<td>全新BeetlSQL模块以及一些小细节优化(感谢@三叔同事的建议).</td></tr> |20190910-1|1.修复mapper接口load方法但是xml中方法不匹配问题 2.移除mapper中CRUD时的@param 注解会影响xml的解析(感谢@caojiantao的反馈).3.优化MyBatis的xml文件对Oracle的支持.(感谢@wylove1992的反馈) 4.新增对boolean的处理(感谢@violinxsc的反馈)以及优化tinyint类型生成boolean类型问题(感谢@hahaYhui的反馈) |
<tr><td>20180925<td>优化SQL表和字段备注的推断包括pgsql/oralce的comment on column/table情况处理等.</td></tr> |20190909|添加是否下划线转换为驼峰的选择(感谢@youngking28 的pull request).|
<tr><td>20180918<td>优化SQL类型推断.优化PrimaryKey判断.修复jpacontroller中Repository拼写错误问题.</td></tr> |20190518|1.优化注释 2.修改 mybatis模板中 controller注解 3.修改 mybatis模板中 dao文件使用为 mapper文件 4.修改 mybatis模板中 service实现类中的一个 bug 5.修改 index.ftl文件中 mybatis模板的 dao -> mapper(感谢@unqin的pull request)|
<tr><td>20180917<td>全新首页静态文件全部采用CDN.新增jdbcTemplate模块.</td></tr> |20190511|优化mybatis模块的dao和xml模板修改dao接口注解为@Repository所有dao参数改为包装类删除update语句最后的UpdateTime = NOW()修改dao接口文件的方法注释使其更符合javaDoc的标准修改insert语句增加插入行主键的返回修改load的方法名为selectByPrimaryKey修改xml的update语句新增动态if判空修改xml的insert语句新增动态插入判空更符合mybatisGenerator标准(感谢@Archer-Wen的贡献 ).|
<tr><td>20180916-2<td>优化oracle支持优化DDL语句中"或者'或者空格的支持.</td></tr> |20190429|新增返回封装工具类设置,优化oracle注释comment on column的支持(感谢@liukex反馈)优化对普通和特殊storage关键字的判断(感谢@AhHeadFloating的反馈 ).|
<tr><td>20180916-1<td>补充char/clob/blob/json等类型如果类型未知默认为String.</td></tr> |20190211|提交gitignore解决StringUtils.lowerCaseFirst潜在的NPE异常校验修改为@RequestParam参数校验lombok之@Data和@Slf4j优化fix JdbcDAO模板类名显示为中文问题WebMvcConfig整合MessageConverter模板代码分类(感谢@liutf和@tfgzs的pull request).|
<tr><td>20180915<td>新增Swagger-UI模板.修复一些命名和导入问题.JPA的Entity默认第一个字段为Id如果不是请手工修改.</td></tr> |20190210|实体生成规则切换为包装类型,不再采用基本数据类型,为实体类生成添加显示的默认构造方法(感谢@h2so的pull request).|
<tr><td>20180913<td>修复字段没有描述以及类型为DATE型导致的问题.新增JPA的Controller模板.</td></tr> |20190106|修复处理number/decimal(x,x)类型的逻辑(感谢@arthaschan的反馈)修复JdbcTemplates模板两处错误(感谢@everflourish的反馈).|
<tr><td>20180831<td>初始化项目.新增JPA系列Entity+Repository模板.</td></tr> |20181212|首页UI优化新增MybatisPlus模块(感谢@三叔同事的建议),修复作者名和包名获取失败问题(感谢@Yanch1994的反馈).|
</tbody></table> |20181122|优化正则表达式点号的处理优化处理字段类型对number类型增加intlongBigDecimal的区分判断(感谢@lshz0088的指导).|
|20181108|修复非字段描述"KEY FK_xxxx (xxxx)"导致生成KEY字段情况(感谢@tornadoorz反馈).|
<table><tbody> |20181018|支持double(x,x)的类型以及comment里面包含一些特殊字符的处理(感谢@tanwubo的反馈).|
<tr><td>字段名</td> <td>说明</td></tr> |20181010|CDN变更修复CDN不稳定导致网页js报错问题.|
<tr><td>packageName</td> <td>自定义的包名</td></tr> |20181003|新增element-ui/bootstrap生成.|
<tr><td>authorName</td> <td>自定义的作者名</td></tr> |20181002|修复公共CDN之Layer.js404问题导致项目无法生成.|
<tr><td>returnUtil</td> <td>自定义的返回Util</td></tr> |20180927|优化COMMENT提取逻辑支持多种复杂情况的注释(感谢@raodeming的反馈).|
<tr><td>tableName</td> <td>sql中的表名</td></tr> |20180926|全新BeetlSQL模块以及一些小细节优化(感谢@三叔同事的建议).|
<tr><td>className</td> <td>java类名</td></tr> |20180925|优化SQL表和字段备注的推断包括pgsql/oralce的comment on column/table情况处理等.|
<tr><td>classComment</td> <td>sql表备注/java类备注</td></tr> |20180918|优化SQL类型推断.优化PrimaryKey判断.修复jpacontroller中Repository拼写错误问题.|
<tr><td>fieldName</td> <td>字段名</td></tr> |20180917|全新首页静态文件全部采用CDN.新增jdbcTemplate模块.|
<tr><td>fieldComment</td> <td>字段备注</td></tr> |20180916|1.优化oracle支持优化DDL语句中"或者'或者空格的支持. 2.补充char/clob/blob/json等类型如果类型未知默认为String.|
</tbody></table> |20180915|新增Swagger-UI模板.修复一些命名和导入问题.JPA的Entity默认第一个字段为Id如果不是请手工修改.|
|20180913|修复字段没有描述以及类型为DATE型导致的问题.新增JPA的Controller模板.|
<img src="./codegenerator1.png"> |20180831|初始化项目.新增JPA系列Entity+Repository模板.|
<img src="./codegenerator2.png">
<img src="./codegenerator3.png"> # FieldName
<img src="./donate.jpg"> |字段名|说明|
|-|-|
|packageName|自定义的包名|
|authorName|自定义的作者名|
|returnUtil|自定义的返回Util|
|tableName|sql中的表名|
|className|java类名|
|classComment|sql表备注/java类备注|
|fieldName|字段名|
|fieldComment|字段备注|
<img src="./codegenerator1.png">
<img src="./codegenerator2.png">
<img src="./codegenerator3.png">
<img src="./codegenerator4.png">
<img src="./donate.jpg">

BIN
codegenerator4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

View File

@@ -7,12 +7,12 @@
<parent> <parent>
<groupId>com.softdev.system</groupId> <groupId>com.softdev.system</groupId>
<artifactId>SpringBootCodeGenerator</artifactId> <artifactId>SpringBootCodeGenerator</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>2.0</version>
</parent> </parent>
<groupId>com.softdev.system</groupId> <groupId>com.softdev.system</groupId>
<artifactId>generator-web</artifactId> <artifactId>generator-web</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>2.0</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties> <properties>
@@ -38,10 +38,10 @@
<artifactId>spring-boot-starter-data-jpa</artifactId> <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>--> </dependency>-->
<dependency> <!--<dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
</dependency> </dependency>-->
</dependencies> </dependencies>
@@ -65,7 +65,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version> <version>3.8.1</version>
<configuration> <configuration>
<skip>true</skip> <skip>true</skip>
<compilerId>javac</compilerId> <compilerId>javac</compilerId>
@@ -87,25 +87,24 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId> <artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version> <version>3.1.0</version>
<configuration> <configuration>
<!--<failOnMissingWebXml>false</failOnMissingWebXml>--> <!--<failOnMissingWebXml>false</failOnMissingWebXml>-->
<includeEmptyDirs>true</includeEmptyDirs> <includeEmptyDirs>true</includeEmptyDirs>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <!--<plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId> <artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version> <version>3.2.3</version>
<configuration> <configuration>
<failOnMissingWebXml>false</failOnMissingWebXml> <failOnMissingWebXml>false</failOnMissingWebXml>
<warSourceExcludes>upload/**</warSourceExcludes> <warSourceExcludes>upload/**</warSourceExcludes>
</configuration> </configuration>
</plugin> </plugin>-->
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.4.RELEASE</version>
<executions> <executions>
<execution> <execution>
<goals> <goals>

View File

@@ -5,10 +5,8 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication @SpringBootApplication
@Slf4j
public class GeneratorWebApplication { public class GeneratorWebApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(GeneratorWebApplication.class,args); SpringApplication.run(GeneratorWebApplication.class,args);
log.info("项目启动启动成功!访问地址: http://localhost:1234/generator");
} }
} }

View File

@@ -2,22 +2,19 @@ package com.softdev.system.generator.config;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import com.softdev.system.generator.entity.ReturnT;
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import com.softdev.system.generator.util.ApiReturnObject;
import com.softdev.system.generator.util.ApiReturnUtil;
@ControllerAdvice @ControllerAdvice
public class GlobalDefaultExceptionHandler { public class GlobalDefaultExceptionHandler {
@ExceptionHandler(Exception.class) @ExceptionHandler(Exception.class)
@ResponseBody @ResponseBody
public ApiReturnObject defaultExceptionHandler(HttpServletRequest req,Exception e) { public ReturnT defaultExceptionHandler(HttpServletRequest req,Exception e) {
e.printStackTrace(); e.printStackTrace();
//return new ApiReturnObject("01","server error", e.getMessage()); return new ReturnT<>(ReturnT.FAIL_CODE, e.getMessage());
return ApiReturnUtil.error("服务器异常",e.getMessage());
} }
} }

View File

@@ -0,0 +1,30 @@
package com.softdev.system.generator.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.context.WebServerInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
/**
* @Description 动态获取tomcat启动端口控制台打印项目访问地址
* @Author Gao Hang Hang
* @Date 2019-12-27 14:37
**/
@Component
@Slf4j
public class ServerConfig implements ApplicationListener<WebServerInitializedEvent> {
private int serverPort;
public int getPort() {
return this.serverPort;
}
@Override
public void onApplicationEvent(WebServerInitializedEvent event) {
this.serverPort = event.getWebServer().getPort();
//log.info("Get WebServer port {}", serverPort);
log.info("项目启动启动成功!访问地址: http://localhost:{}/generator", serverPort);
}
}

View File

@@ -1,49 +1,49 @@
package com.softdev.system.generator.config; package com.softdev.system.generator.config;
import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.nio.charset.Charset; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* 2019-2-11 liutf WebMvcConfig 整合 cors 和 SpringMvc MessageConverter * 2019-2-11 liutf WebMvcConfig 整合 cors 和 SpringMvc MessageConverter
*/ */
@Configuration @Configuration
public class WebMvcConfig implements WebMvcConfigurer { public class WebMvcConfig implements WebMvcConfigurer {
/* @Override /* @Override
public void addCorsMappings(CorsRegistry registry) { public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") registry.addMapping("/**")
.allowedOrigins("*") .allowedOrigins("*")
.allowedHeaders("x-requested-with") .allowedHeaders("x-requested-with")
.allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS", "TRACE") .allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS", "TRACE")
.maxAge(3600); .maxAge(3600);
}*/ }*/
@Override @Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//FastJsonHttpMessageConverter //FastJsonHttpMessageConverter
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
List<MediaType> fastMediaTypes = new ArrayList<>(); List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes); fastConverter.setSupportedMediaTypes(fastMediaTypes);
FastJsonConfig fastJsonConfig = new FastJsonConfig(); FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setCharset(Charset.forName("UTF-8")); fastJsonConfig.setCharset(StandardCharsets.UTF_8);
fastConverter.setFastJsonConfig(fastJsonConfig); fastConverter.setFastJsonConfig(fastJsonConfig);
//StringHttpMessageConverter //StringHttpMessageConverter
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(); StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
stringConverter.setDefaultCharset(Charset.forName("UTF-8")); stringConverter.setDefaultCharset(StandardCharsets.UTF_8);
stringConverter.setSupportedMediaTypes(fastMediaTypes); stringConverter.setSupportedMediaTypes(fastMediaTypes);
converters.add(stringConverter); converters.add(stringConverter);
converters.add(fastConverter); converters.add(fastConverter);
} }
} }

View File

@@ -1,119 +1,84 @@
package com.softdev.system.generator.controller; package com.softdev.system.generator.controller;
import com.softdev.system.generator.entity.ClassInfo; import com.softdev.system.generator.entity.ClassInfo;
import com.softdev.system.generator.entity.ReturnT; import com.softdev.system.generator.entity.ParamInfo;
import com.softdev.system.generator.util.FreemarkerTool; import com.softdev.system.generator.entity.ReturnT;
import com.softdev.system.generator.util.TableParseUtil; import com.softdev.system.generator.service.GeneratorService;
import freemarker.template.TemplateException; import com.softdev.system.generator.util.CodeGenerateException;
import lombok.extern.slf4j.Slf4j; import com.softdev.system.generator.util.TableParseUtil;
import org.apache.commons.lang3.StringUtils; import freemarker.template.TemplateException;
import org.springframework.beans.factory.annotation.Autowired; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller; import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import java.io.IOException; import org.springframework.web.bind.annotation.RequestBody;
import java.util.HashMap; import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Map;
import java.io.IOException;
/** import java.util.HashMap;
* spring boot code generator import java.util.Map;
* @author zhengk/moshow
*/ /**
@Controller * spring boot code generator
@Slf4j * @author zhengk/moshow
public class IndexController { */
@Controller
@Autowired @Slf4j
private FreemarkerTool freemarkerTool; public class IndexController {
@RequestMapping("/") @Autowired
public String index() { private GeneratorService generatorService;
return "index";
} @GetMapping("/")
public String index() {
@RequestMapping("/genCode") return "index";
@ResponseBody }
public ReturnT<Map<String, String>> codeGenerate(String tableSql,
//2019-2-10 liutf 修改为@RequestParam参数校验 @PostMapping("/genCode")
@RequestParam(required = false, defaultValue = "大狼狗") String authorName, @ResponseBody
@RequestParam(required = false, defaultValue = "com.softdev.system")String packageName, public ReturnT<Map<String, String>> codeGenerate(@RequestBody ParamInfo paramInfo ) {
@RequestParam(required = false, defaultValue = "ApiReturnUtil")String returnUtil,
@RequestParam(required = false, defaultValue = "true")boolean isUnderLineToCamelCase, try {
@RequestParam(required = false, defaultValue = "boolean")String tinyintTransType
) { if (StringUtils.isBlank(paramInfo.getTableSql())) {
return new ReturnT<>(ReturnT.FAIL_CODE, "表结构信息不可为空");
}
try {
// parse table
if (StringUtils.isBlank(tableSql)) { ClassInfo classInfo = null;
return new ReturnT<>(ReturnT.FAIL_CODE, "表结构信息不可为空"); switch (paramInfo.getDataType()){
} //parse json
case "json":classInfo = TableParseUtil.processJsonToClassInfo(paramInfo);break;
// parse table //parse sql by regex
ClassInfo classInfo = TableParseUtil.processTableIntoClassInfo(tableSql, isUnderLineToCamelCase, tinyintTransType); case "sql-regex":classInfo = TableParseUtil.processTableToClassInfoByRegex(paramInfo);break;
//default parse sql by java
// code genarete default : classInfo = TableParseUtil.processTableIntoClassInfo(paramInfo);break;
Map<String, Object> params = new HashMap<String, Object>(8); }
params.put("classInfo", classInfo);
params.put("authorName", authorName); // process the param
params.put("packageName", packageName); Map<String, Object> params = new HashMap<String, Object>(8);
params.put("returnUtil", returnUtil); params.put("classInfo", classInfo);
params.put("authorName", paramInfo.getAuthorName());
// result params.put("packageName", paramInfo.getPackageName());
Map<String, String> result = new HashMap<String, String>(32); params.put("returnUtil", paramInfo.getReturnUtil());
//UI log.info("generator table:"+(classInfo==null?"":classInfo.getTableName())
result.put("swagger-ui", freemarkerTool.processString("code-generator/ui/swagger-ui.ftl", params)); +",field size:"+((classInfo==null||classInfo.getFieldList()==null)?"":classInfo.getFieldList().size()));
result.put("element-ui", freemarkerTool.processString("code-generator/ui/element-ui.ftl", params));
result.put("bootstrap-ui", freemarkerTool.processString("code-generator/ui/bootstrap-ui.ftl", params)); // generate the code 需要加新的模板请在里面改
//mybatis old Map<String, String> result = generatorService.getResultByParams(params);
result.put("controller", freemarkerTool.processString("code-generator/mybatis/controller.ftl", params));
result.put("service", freemarkerTool.processString("code-generator/mybatis/service.ftl", params)); return new ReturnT<>(result);
result.put("service_impl", freemarkerTool.processString("code-generator/mybatis/service_impl.ftl", params)); } catch (IOException | TemplateException e) {
result.put("mapper", freemarkerTool.processString("code-generator/mybatis/mapper.ftl", params)); log.error(e.getMessage(), e);
result.put("mybatis", freemarkerTool.processString("code-generator/mybatis/mybatis.ftl", params)); return new ReturnT<>(ReturnT.FAIL_CODE, e.getMessage());
result.put("model", freemarkerTool.processString("code-generator/mybatis/model.ftl", params)); } catch (CodeGenerateException e) {
//jpa log.error(e.getMessage(), e);
result.put("entity", freemarkerTool.processString("code-generator/jpa/entity.ftl", params)); return new ReturnT<>(ReturnT.FAIL_CODE, e.getMessage());
result.put("repository", freemarkerTool.processString("code-generator/jpa/repository.ftl", params)); }
result.put("jpacontroller", freemarkerTool.processString("code-generator/jpa/jpacontroller.ftl", params));
//jdbc template }
result.put("jtdao", freemarkerTool.processString("code-generator/jdbc-template/jtdao.ftl", params));
result.put("jtdaoimpl", freemarkerTool.processString("code-generator/jdbc-template/jtdaoimpl.ftl", params)); }
//beetsql
result.put("beetlmd", freemarkerTool.processString("code-generator/beetlsql/beetlmd.ftl", params));
result.put("beetlentity", freemarkerTool.processString("code-generator/beetlsql/beetlentity.ftl", params));
result.put("beetlentitydto", freemarkerTool.processString("code-generator/beetlsql/beetlentitydto.ftl", params));
result.put("beetlcontroller", freemarkerTool.processString("code-generator/beetlsql/beetlcontroller.ftl", params));
//mybatis plus
result.put("pluscontroller", freemarkerTool.processString("code-generator/mybatis-plus/pluscontroller.ftl", params));
result.put("plusmapper", freemarkerTool.processString("code-generator/mybatis-plus/plusmapper.ftl", params));
//util
result.put("util", freemarkerTool.processString("code-generator/util/util.ftl", params));
//sql generate
result.put("select", freemarkerTool.processString("code-generator/sql/select.ftl", params));
result.put("insert", freemarkerTool.processString("code-generator/sql/insert.ftl", params));
result.put("update", freemarkerTool.processString("code-generator/sql/update.ftl", params));
result.put("delete", freemarkerTool.processString("code-generator/sql/delete.ftl", params));
// 计算,生成代码行数
int lineNum = 0;
for (Map.Entry<String, String> item: result.entrySet()) {
if (item.getValue() != null) {
lineNum += StringUtils.countMatches(item.getValue(), "\n");
}
}
log.info("生成代码行数:{}", lineNum);
//测试环境可自行开启
//log.info("生成代码数据:{}", result);
return new ReturnT<>(result);
} catch (IOException | TemplateException e) {
log.error(e.getMessage(), e);
return new ReturnT<>(ReturnT.FAIL_CODE, "表结构解析失败"+e.getMessage());
}
}
}

View File

@@ -0,0 +1,25 @@
package com.softdev.system.generator.entity;
import lombok.Data;
/**
* Post data - ParamInfo
* @author zhengkai.blog.csdn.net
*/
@Data
public class ParamInfo {
private String tableSql;
private String authorName;
private String packageName;
private String returnUtil;
private String nameCaseType;
private String tinyintTransType;
private String dataType;
@Data
public static class NAME_CASE_TYPE{
public static String CAMEL_CASE="CamelCase";
public static String UNDER_SCORE_CASE="UnderScoreCase";
public static String UPPER_UNDER_SCORE_CASE="UpperUnderScoreCase";
}
}

View File

@@ -0,0 +1,17 @@
package com.softdev.system.generator.service;
import freemarker.template.TemplateException;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.Map;
/**
* GeneratorService
* @author zhengkai.blog.csdn.net
*/
public interface GeneratorService {
public Map<String,String> getResultByParams(Map<String, Object> params) throws IOException, TemplateException;
}

View File

@@ -0,0 +1,78 @@
package com.softdev.system.generator.service;
import com.softdev.system.generator.util.FreemarkerTool;
import freemarker.template.TemplateException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* GeneratorService
* @author zhengkai.blog.csdn.net
*/
@Slf4j
@Service
public class GeneratorServiceImpl implements GeneratorService {
@Autowired
private FreemarkerTool freemarkerTool;
@Override
public Map<String, String> getResultByParams(Map<String, Object> params) throws IOException, TemplateException {
// result
Map<String, String> result = new HashMap<String, String>(32);
//UI
result.put("swagger-ui", freemarkerTool.processString("code-generator/ui/swagger-ui.ftl", params));
result.put("element-ui", freemarkerTool.processString("code-generator/ui/element-ui.ftl", params));
result.put("bootstrap-ui", freemarkerTool.processString("code-generator/ui/bootstrap-ui.ftl", params));
//mybatis old
result.put("controller", freemarkerTool.processString("code-generator/mybatis/controller.ftl", params));
result.put("service", freemarkerTool.processString("code-generator/mybatis/service.ftl", params));
result.put("service_impl", freemarkerTool.processString("code-generator/mybatis/service_impl.ftl", params));
result.put("mapper", freemarkerTool.processString("code-generator/mybatis/mapper.ftl", params));
result.put("mybatis", freemarkerTool.processString("code-generator/mybatis/mybatis.ftl", params));
result.put("model", freemarkerTool.processString("code-generator/mybatis/model.ftl", params));
//jpa
result.put("entity", freemarkerTool.processString("code-generator/jpa/entity.ftl", params));
result.put("repository", freemarkerTool.processString("code-generator/jpa/repository.ftl", params));
result.put("jpacontroller", freemarkerTool.processString("code-generator/jpa/jpacontroller.ftl", params));
//jdbc template
result.put("jtdao", freemarkerTool.processString("code-generator/jdbc-template/jtdao.ftl", params));
result.put("jtdaoimpl", freemarkerTool.processString("code-generator/jdbc-template/jtdaoimpl.ftl", params));
//beetsql
result.put("beetlmd", freemarkerTool.processString("code-generator/beetlsql/beetlmd.ftl", params));
result.put("beetlentity", freemarkerTool.processString("code-generator/beetlsql/beetlentity.ftl", params));
result.put("beetlentitydto", freemarkerTool.processString("code-generator/beetlsql/beetlentitydto.ftl", params));
result.put("beetlcontroller", freemarkerTool.processString("code-generator/beetlsql/beetlcontroller.ftl", params));
//mybatis plus
result.put("pluscontroller", freemarkerTool.processString("code-generator/mybatis-plus/pluscontroller.ftl", params));
result.put("plusmapper", freemarkerTool.processString("code-generator/mybatis-plus/plusmapper.ftl", params));
//util
result.put("util", freemarkerTool.processString("code-generator/util/util.ftl", params));
result.put("json", freemarkerTool.processString("code-generator/util/json.ftl", params));
result.put("xml", freemarkerTool.processString("code-generator/util/xml.ftl", params));
//sql generate
result.put("select", freemarkerTool.processString("code-generator/sql/select.ftl", params));
result.put("insert", freemarkerTool.processString("code-generator/sql/insert.ftl", params));
result.put("update", freemarkerTool.processString("code-generator/sql/update.ftl", params));
result.put("delete", freemarkerTool.processString("code-generator/sql/delete.ftl", params));
// 计算,生成代码行数
/*int lineNum = 0;
for (Map.Entry<String, String> item: result.entrySet()) {
if (item.getValue() != null) {
lineNum += StringUtils.countMatches(item.getValue(), "\n");
}
}
log.info("生成代码行数:{}", lineNum);*/
//测试环境可自行开启
//log.info("生成代码数据:{}", result);
return result;
}
}

View File

@@ -1,42 +0,0 @@
package com.softdev.system.generator.util;
import lombok.Data;
import java.io.Serializable;
@Data
public class ApiReturnObject implements Serializable{
private static final long serialVersionUID = 1L;
public ApiReturnObject(String errorCode, Object errorMessage, Object returnObject) {
super();
this.errorCode = errorCode;
this.errorMessage = errorMessage;
this.returnObject = returnObject;
}
public ApiReturnObject(Object errorMessage, Object returnObject) {
super();
this.errorMessage = errorMessage;
this.returnObject = returnObject;
}
String errorCode="00";
Object errorMessage;
Object returnObject;
String pageNumber;
String pageSize;
String totalElements;
String totalPages;
public ApiReturnObject(String pageNumber,String pageSize,String totalElements,String totalPages,String errorCode, Object errorMessage, Object returnObject) {
super();
this.pageNumber = pageNumber;
this.errorCode = errorCode;
this.errorMessage = errorMessage;
this.returnObject = returnObject;
this.pageSize = pageSize;
this.totalElements = totalElements;
this.totalPages = totalPages;
}
}

View File

@@ -1,50 +0,0 @@
package com.softdev.system.generator.util;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class ApiReturnUtil implements Serializable{
private static final long serialVersionUID = 1L;
public static ApiReturnObject error(Object errorMessage) {
System.out.println(errorMessage);
List<Object> object=new ArrayList<Object>();
return new ApiReturnObject("01",errorMessage,object);
}
public static ApiReturnObject error(Object errorMessage, Object returnObject) {
List<Object> object=new ArrayList<Object>();
object.add(returnObject);
return new ApiReturnObject("01",errorMessage,object);
}
public static ApiReturnObject success(Object returnObject) {
if(returnObject instanceof java.util.List){
return new ApiReturnObject("00","success",returnObject);
}else {
List<Object> object=new ArrayList<Object>();
object.add(returnObject);
return new ApiReturnObject("00","success",object);
}
}
public static ApiReturnObject success(Object errorMessage, Object returnObject) {
if(returnObject instanceof java.util.List){
return new ApiReturnObject("00",errorMessage,returnObject);
}else {
List<Object> object=new ArrayList<Object>();
object.add(returnObject);
return new ApiReturnObject("00",errorMessage,object);
}
}
public static ApiReturnObject pageManual(Integer pageNumber, Integer pageSize,Integer countNum, List returnObject) {
return new ApiReturnObject(pageNumber+"",pageSize+"",countNum+"",getTotalPages(countNum, pageSize),"00","success",returnObject);
}
public static String getTotalPages(Integer countNum, Integer pageSize) {
if((countNum%pageSize)==0) {
return ((countNum/pageSize))+"";
}else {
return ((countNum/pageSize)+1)+"";
}
}
}

View File

@@ -1,31 +0,0 @@
package com.softdev.system.generator.util;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
public class BasePath {
protected static String contextPath = null;
protected static String basePath = null;
protected static String realPath = null;
public static String getBasePath(HttpServletRequest request) {
contextPath = request.getContextPath();
basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+contextPath+"/";
return basePath;
}
public static String getRealPath(HttpServletRequest request, String path) {
ServletContext context = request.getSession().getServletContext();
realPath = context.getRealPath(path);
realPath = context.getRealPath(path)+"\\";
return realPath;
}
public static String getMyRealPath(HttpServletRequest request, String path) {
ServletContext context = request.getSession().getServletContext();
realPath = context.getRealPath(path);
realPath = context.getRealPath(path);
return realPath;
}
}

View File

@@ -1,57 +0,0 @@
package com.softdev.system.generator.util;
/**
* string tool
*
* @author xuxueli 2018-05-02 20:43:25
*/
public class StringPlusUtils {
/**
* 首字母大写
*
* @param str
* @return
*/
public static String upperCaseFirst(String str) {
return str.substring(0, 1).toUpperCase() + str.substring(1);
}
/**
* 首字母小写
*
* @param str
* @return
*/
public static String lowerCaseFirst(String str) {
return str.substring(0, 1).toLowerCase() + str.substring(1);
}
/**
* 下划线,转换为驼峰式
*
* @param underscoreName
* @return
*/
public static String underlineToCamelCase(String underscoreName) {
StringBuilder result = new StringBuilder();
if (underscoreName != null && underscoreName.trim().length() > 0) {
boolean flag = false;
for (int i = 0; i < underscoreName.length(); i++) {
char ch = underscoreName.charAt(i);
if ("_".charAt(0) == ch) {
flag = true;
} else {
if (flag) {
result.append(Character.toUpperCase(ch));
flag = false;
} else {
result.append(ch);
}
}
}
}
return result.toString();
}
}

View File

@@ -1,294 +1,421 @@
package com.softdev.system.generator.util; package com.softdev.system.generator.util;
import com.softdev.system.generator.entity.ClassInfo; import com.alibaba.fastjson.JSON;
import com.softdev.system.generator.entity.FieldInfo; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.io.IOException; import com.softdev.system.generator.entity.ClassInfo;
import java.math.BigDecimal; import com.softdev.system.generator.entity.FieldInfo;
import java.util.ArrayList; import com.softdev.system.generator.entity.ParamInfo;
import java.util.Date;
import java.util.List; import java.io.IOException;
import java.util.regex.Matcher; import java.math.BigDecimal;
import java.util.regex.Pattern; import java.util.ArrayList;
import java.util.Date;
/** import java.util.List;
* @author xuxueli 2018-05-02 21:10:45 import java.util.regex.Matcher;
* @modify zhengk/moshow 20180913 import java.util.regex.Pattern;
*/
public class TableParseUtil { /**
* @author zhengkai.blog.csdn.net
/** */
* 解析建表SQL生成代码model-dao-xml public class TableParseUtil {
*
* @param tableSql /**
* @return * 解析建表SQL生成代码model-dao-xml
*/ *
public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnderLineToCamelCase,String tinyintTransType) * @param paramInfo
throws IOException { * @return
if (tableSql==null || tableSql.trim().length()==0) { */
throw new CodeGenerateException("Table structure can not be empty."); public static ClassInfo processTableIntoClassInfo(ParamInfo paramInfo)
} throws IOException {
tableSql = tableSql.trim().replaceAll("'","`").replaceAll("\"","`").replaceAll("",",").toLowerCase(); //process the param
String tableSql=paramInfo.getTableSql();
// table Name String nameCaseType=paramInfo.getNameCaseType();
String tableName = null; String tinyintTransType=paramInfo.getTinyintTransType();
if (tableSql.contains("TABLE") && tableSql.contains("(")) {
tableName = tableSql.substring(tableSql.indexOf("TABLE")+5, tableSql.indexOf("(")); if (tableSql==null || tableSql.trim().length()==0) {
} else if (tableSql.contains("table") && tableSql.contains("(")) { throw new CodeGenerateException("Table structure can not be empty.");
tableName = tableSql.substring(tableSql.indexOf("table")+5, tableSql.indexOf("(")); }
} else { //deal with special character
throw new CodeGenerateException("Table structure anomaly."); tableSql = tableSql.trim().replaceAll("'","`").replaceAll("\"","`").replaceAll("",",").toLowerCase();
} //deal with java string copy \n"
tableSql = tableSql.trim().replaceAll("\\\\n`","").replaceAll("\\+","").replaceAll("``","`").replaceAll("\\\\","");
//新增处理create table if not exists members情况 // table Name
if (tableName.contains("if not exists")) { String tableName = null;
tableName=tableName.replaceAll("if not exists",""); if (tableSql.contains("TABLE") && tableSql.contains("(")) {
} tableName = tableSql.substring(tableSql.indexOf("TABLE")+5, tableSql.indexOf("("));
} else if (tableSql.contains("table") && tableSql.contains("(")) {
if (tableName.contains("`")) { tableName = tableSql.substring(tableSql.indexOf("table")+5, tableSql.indexOf("("));
tableName = tableName.substring(tableName.indexOf("`")+1, tableName.lastIndexOf("`")); } else {
}else{ throw new CodeGenerateException("Table structure anomaly.");
//空格开头的,需要替换掉\n\t空格 }
tableName=tableName.replaceAll(" ","").replaceAll("\n","").replaceAll("\t","");
} //新增处理create table if not exists members情况
//优化对byeas`.`ct_bd_customerdiscount这种命名的支持 if (tableName.contains("if not exists")) {
if(tableName.contains("`.`")){ tableName=tableName.replaceAll("if not exists","");
tableName=tableName.substring(tableName.indexOf("`.`")+3); }
}else if(tableName.contains(".")){
//优化对likeu.members这种命名的支持 if (tableName.contains("`")) {
tableName=tableName.substring(tableName.indexOf(".")+1); tableName = tableName.substring(tableName.indexOf("`")+1, tableName.lastIndexOf("`"));
} }else{
// class Name //空格开头的,需要替换掉\n\t空格
String className = StringUtils.upperCaseFirst(StringUtils.underlineToCamelCase(tableName)); tableName=tableName.replaceAll(" ","").replaceAll("\n","").replaceAll("\t","");
if (className.contains("_")) { }
className = className.replaceAll("_", ""); //优化对byeas`.`ct_bd_customerdiscount这种命名的支持
} if(tableName.contains("`.`")){
tableName=tableName.substring(tableName.indexOf("`.`")+3);
// class Comment }else if(tableName.contains(".")){
String classComment = null; //优化对likeu.members这种命名的支持
//mysql是comment=,pgsql/oracle是comment on table, tableName=tableName.substring(tableName.indexOf(".")+1);
if (tableSql.contains("comment=")) { }
String classCommentTmp = tableSql.substring(tableSql.lastIndexOf("comment=")+8).replaceAll("`","").trim(); // class Name
if (classCommentTmp.indexOf(" ")!=classCommentTmp.lastIndexOf(" ")) { String className = StringUtils.upperCaseFirst(StringUtils.underlineToCamelCase(tableName));
classCommentTmp = classCommentTmp.substring(classCommentTmp.indexOf(" ")+1, classCommentTmp.lastIndexOf(" ")); if (className.contains("_")) {
} className = className.replaceAll("_", "");
if (classCommentTmp!=null && classCommentTmp.trim().length()>0) { }
classComment = classCommentTmp;
}else{ // class Comment
//修复表备注为空问题 String classComment = null;
classComment = className; //mysql是comment=,pgsql/oracle是comment on table,
} if (tableSql.contains("comment=")) {
}else if(tableSql.contains("comment on table")) { String classCommentTmp = tableSql.substring(tableSql.lastIndexOf("comment=")+8).replaceAll("`","").trim();
//COMMENT ON TABLE CT_BAS_FEETYPE IS 'CT_BAS_FEETYPE'; if (classCommentTmp.indexOf(" ")!=classCommentTmp.lastIndexOf(" ")) {
String classCommentTmp = tableSql.substring(tableSql.lastIndexOf("comment on table")+17).trim(); classCommentTmp = classCommentTmp.substring(classCommentTmp.indexOf(" ")+1, classCommentTmp.lastIndexOf(" "));
//证明这是一个常规的COMMENT ON TABLE xxx IS 'xxxx' }
if (classCommentTmp.contains("`")) { if (classCommentTmp!=null && classCommentTmp.trim().length()>0) {
classCommentTmp = classCommentTmp.substring(classCommentTmp.indexOf("`")+1); classComment = classCommentTmp;
classCommentTmp = classCommentTmp.substring(0,classCommentTmp.indexOf("`")); }else{
classComment = classCommentTmp; //修复表备注为空问题
}else{ classComment = className;
//非常规的没法分析 }
classComment = tableName; }else if(tableSql.contains("comment on table")) {
} //COMMENT ON TABLE CT_BAS_FEETYPE IS 'CT_BAS_FEETYPE';
}else{ String classCommentTmp = tableSql.substring(tableSql.lastIndexOf("comment on table")+17).trim();
//修复表备注为空问题 //证明这是一个常规的COMMENT ON TABLE xxx IS 'xxxx'
classComment = tableName; if (classCommentTmp.contains("`")) {
} classCommentTmp = classCommentTmp.substring(classCommentTmp.indexOf("`")+1);
//如果备注跟;混在一起,需要替换掉 classCommentTmp = classCommentTmp.substring(0,classCommentTmp.indexOf("`"));
classComment=classComment.replaceAll(";",""); classComment = classCommentTmp;
// field List }else{
List<FieldInfo> fieldList = new ArrayList<FieldInfo>(); //非常规的没法分析
classComment = tableName;
// 正常( ) 内的一定是字段相关的定义。 }
String fieldListTmp = tableSql.substring(tableSql.indexOf("(")+1, tableSql.lastIndexOf(")")); }else{
//修复表备注为空问题
// 匹配 comment替换备注里的小逗号, 防止不小心被当成切割符号切割 classComment = tableName;
String commentPattenStr1="comment `(.*?)\\`"; }
Matcher matcher1 = Pattern.compile(commentPattenStr1).matcher(fieldListTmp); //如果备注跟;混在一起,需要替换掉
while(matcher1.find()){ classComment=classComment.replaceAll(";","");
// field List
String commentTmp = matcher1.group(); List<FieldInfo> fieldList = new ArrayList<FieldInfo>();
//2018-9-27 zhengk 不替换只处理支持COMMENT评论里面多种注释
//commentTmp = commentTmp.replaceAll("\\ comment `|\\`", " "); // "\\{|\\}" // 正常( ) 内的一定是字段相关的定义。
String fieldListTmp = tableSql.substring(tableSql.indexOf("(")+1, tableSql.lastIndexOf(")"));
if (commentTmp.contains(",")) {
String commentTmpFinal = commentTmp.replaceAll(",", ""); // 匹配 comment替换备注里的小逗号, 防止不小心被当成切割符号切割
fieldListTmp = fieldListTmp.replace(matcher1.group(), commentTmpFinal); String commentPattenStr1="comment `(.*?)\\`";
} Matcher matcher1 = Pattern.compile(commentPattenStr1).matcher(fieldListTmp);
} while(matcher1.find()){
//2018-10-18 zhengkai 新增支持double(10, 2)等类型中有英文逗号的特殊情况
String commentPattenStr2="\\`(.*?)\\`"; String commentTmp = matcher1.group();
Matcher matcher2 = Pattern.compile(commentPattenStr2).matcher(fieldListTmp); //2018-9-27 zhengk 不替换只处理支持COMMENT评论里面多种注释
while(matcher2.find()){ //commentTmp = commentTmp.replaceAll("\\ comment `|\\`", " "); // "\\{|\\}"
String commentTmp2 = matcher2.group();
if (commentTmp2.contains(",")) { if (commentTmp.contains(",")) {
String commentTmpFinal = commentTmp2.replaceAll(",", "").replaceAll("\\(", "").replaceAll("\\)", ""); String commentTmpFinal = commentTmp.replaceAll(",", "");
fieldListTmp = fieldListTmp.replace(matcher2.group(), commentTmpFinal); fieldListTmp = fieldListTmp.replace(matcher1.group(), commentTmpFinal);
} }
} }
//2018-10-18 zhengkai 新增支持double(10, 2)等类型中有英文逗号的特殊情况 //2018-10-18 zhengkai 新增支持double(10, 2)等类型中有英文逗号的特殊情况
String commentPattenStr3="\\((.*?)\\)"; String commentPattenStr2="\\`(.*?)\\`";
Matcher matcher3 = Pattern.compile(commentPattenStr3).matcher(fieldListTmp); Matcher matcher2 = Pattern.compile(commentPattenStr2).matcher(fieldListTmp);
while(matcher3.find()){ while(matcher2.find()){
String commentTmp3 = matcher3.group(); String commentTmp2 = matcher2.group();
if (commentTmp3.contains(",")) { if (commentTmp2.contains(",")) {
String commentTmpFinal = commentTmp3.replaceAll(",", ""); String commentTmpFinal = commentTmp2.replaceAll(",", "").replaceAll("\\(", "").replaceAll("\\)", "");
fieldListTmp = fieldListTmp.replace(matcher3.group(), commentTmpFinal); fieldListTmp = fieldListTmp.replace(matcher2.group(), commentTmpFinal);
} }
} }
String[] fieldLineList = fieldListTmp.split(","); //2018-10-18 zhengkai 新增支持double(10, 2)等类型中有英文逗号的特殊情况
if (fieldLineList.length > 0) { String commentPattenStr3="\\((.*?)\\)";
int i=0; Matcher matcher3 = Pattern.compile(commentPattenStr3).matcher(fieldListTmp);
//i为了解决primary key关键字出现的地方出现在前3行一般和id有关 while(matcher3.find()){
for (String columnLine :fieldLineList) { String commentTmp3 = matcher3.group();
i++; if (commentTmp3.contains(",")) {
columnLine = columnLine.replaceAll("\n","").replaceAll("\t","").trim(); String commentTmpFinal = commentTmp3.replaceAll(",", "");
// `userid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', fieldListTmp = fieldListTmp.replace(matcher3.group(), commentTmpFinal);
// 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 要在条件中使用复杂的表达式 String[] fieldLineList = fieldListTmp.split(",");
// 2019-4-29 zhengkai 优化对普通和特殊storage关键字的判断感谢@AhHeadFloating的反馈 if (fieldLineList.length > 0) {
boolean specialFlag=(!columnLine.contains("key ")&&!columnLine.contains("constraint")&&!columnLine.contains("using")&&!columnLine.contains("unique") int i=0;
&&!(columnLine.contains("primary ")&&columnLine.indexOf("storage")+3>columnLine.indexOf("(")) //i为了解决primary key关键字出现的地方出现在前3行一般和id有关
&&!columnLine.contains("pctincrease") for (String columnLine :fieldLineList) {
&&!columnLine.contains("buffer_pool")&&!columnLine.contains("tablespace") i++;
&&!(columnLine.contains("primary ")&&i>3)); columnLine = columnLine.replaceAll("\n","").replaceAll("\t","").trim();
if (specialFlag){ // `userid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
//如果是oracle的number(x,x),可能出现最后分割残留的,x),这里做排除处理 // 2018-9-18 zhengk 修改为contains提升匹配率和匹配不按照规矩出牌的语句
if(columnLine.length()<5) {continue;} // 2018-11-8 zhengkai 修复tornadoorz反馈的KEY FK_permission_id (permission_id),KEY FK_role_id (role_id)情况
//2018-9-16 zhengkai 支持'符号以及空格的oracle语句// userid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', // 2019-2-22 zhengkai 要在条件中使用复杂的表达式
String columnName = ""; // 2019-4-29 zhengkai 优化对普通和特殊storage关键字的判断感谢@AhHeadFloating的反馈
columnLine=columnLine.replaceAll("`"," ").replaceAll("\""," ").replaceAll("'","").replaceAll(" "," ").trim(); boolean specialFlag=(!columnLine.contains("key ")&&!columnLine.contains("constraint")&&!columnLine.contains("using")&&!columnLine.contains("unique")
//如果遇到username varchar(65) default '' not null,这种情况,判断第一个空格是否比第一个引号前 &&!(columnLine.contains("primary ")&&columnLine.indexOf("storage")+3>columnLine.indexOf("("))
columnName = columnLine.substring(0, columnLine.indexOf(" ")); &&!columnLine.contains("pctincrease")
// field Name &&!columnLine.contains("buffer_pool")&&!columnLine.contains("tablespace")
// 2019-09-08 yj 添加是否下划线转换为驼峰的判断 &&!(columnLine.contains("primary ")&&i>3));
String fieldName; if (specialFlag){
if(isUnderLineToCamelCase){ //如果是oracle的number(x,x),可能出现最后分割残留的,x),这里做排除处理
fieldName = StringUtils.lowerCaseFirst(StringUtils.underlineToCamelCase(columnName)); if(columnLine.length()<5) {continue;}
if (fieldName.contains("_")) { //2018-9-16 zhengkai 支持'符号以及空格的oracle语句// userid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
fieldName = fieldName.replaceAll("_", ""); String columnName = "";
} columnLine=columnLine.replaceAll("`"," ").replaceAll("\""," ").replaceAll("'","").replaceAll(" "," ").trim();
}else { //如果遇到username varchar(65) default '' not null,这种情况,判断第一个空格是否比第一个引号前
fieldName = StringUtils.lowerCaseFirst(columnName); columnName = columnLine.substring(0, columnLine.indexOf(" "));
} // field Name
// 2019-09-08 yj 添加是否下划线转换为驼峰的判断
// field class String fieldName=null;
columnLine = columnLine.substring(columnLine.indexOf("`")+1).trim(); if(ParamInfo.NAME_CASE_TYPE.CAMEL_CASE.equals(nameCaseType)){
// int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', fieldName = StringUtils.lowerCaseFirst(StringUtils.underlineToCamelCase(columnName));
String fieldClass = Object.class.getSimpleName(); if (fieldName.contains("_")) {
//2018-9-16 zhengk 补充char/clob/blob/json等类型如果类型未知默认为String fieldName = fieldName.replaceAll("_", "");
//2018-11-22 lshz0088 处理字段类型的时候不严谨columnLine.contains(" int") 类似这种的,可在前后适当加一些空格之类的加以区分,否则当我的字段包含这些字符的时候,产生类型判断问题。 }
if (columnLine.contains(" int") || columnLine.contains("smallint")) { }else if(ParamInfo.NAME_CASE_TYPE.UNDER_SCORE_CASE.equals(nameCaseType)){
fieldClass = Integer.class.getSimpleName(); fieldName = StringUtils.lowerCaseFirst(columnName);
} else if (columnLine.contains("bigint")) { }else if(ParamInfo.NAME_CASE_TYPE.UPPER_UNDER_SCORE_CASE.equals(nameCaseType)){
fieldClass = Long.class.getSimpleName(); fieldName = StringUtils.lowerCaseFirst(columnName.toUpperCase());
} else if (columnLine.contains("float")) { }else{
fieldClass = Float.class.getSimpleName(); fieldName=columnName;
} else if (columnLine.contains("double")) { }
fieldClass = Double.class.getSimpleName();
} else if (columnLine.contains("time") || columnLine.contains("date") || columnLine.contains("datetime") || columnLine.contains("timestamp")) { // field class
fieldClass = Date.class.getSimpleName(); columnLine = columnLine.substring(columnLine.indexOf("`")+1).trim();
} else if (columnLine.contains("varchar") || columnLine.contains(" text")|| columnLine.contains("char") // int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
|| columnLine.contains("clob")||columnLine.contains("blob")||columnLine.contains("json")) { String fieldClass = Object.class.getSimpleName();
fieldClass = String.class.getSimpleName(); //2018-9-16 zhengk 补充char/clob/blob/json等类型如果类型未知默认为String
} else if (columnLine.contains("decimal")||columnLine.contains(" number")) { //2018-11-22 lshz0088 处理字段类型的时候,不严谨columnLine.contains(" int") 类似这种的,可在前后适当加一些空格之类的加以区分,否则当我的字段包含这些字符的时候,产生类型判断问题。
//2018-11-22 lshz0088 建议对number类型增加intlongBigDecimal的区分判断 if (columnLine.contains(" int") || columnLine.contains("smallint")) {
//如果startKh大于等于0则表示有设置取值范围 fieldClass = Integer.class.getSimpleName();
int startKh=columnLine.indexOf("("); } else if (columnLine.contains("bigint")) {
if(startKh>=0){ fieldClass = Long.class.getSimpleName();
int endKh=columnLine.indexOf(")",startKh); } else if (columnLine.contains("float")) {
String[] fanwei=columnLine.substring(startKh+1,endKh).split(""); fieldClass = Float.class.getSimpleName();
//2019-1-5 zhengk 修复@arthaschan反馈的超出范围错误 } else if (columnLine.contains("double")) {
//System.out.println("fanwei"+ JSON.toJSONString(fanwei)); fieldClass = Double.class.getSimpleName();
// //number(20,6) fanwei["20","6"] } else if (columnLine.contains("time") || columnLine.contains(" date") || columnLine.contains("datetime") || columnLine.contains("timestamp")) {
// //number(0,6) fanwei["0","6"] fieldClass = Date.class.getSimpleName();
// //number(20,0) fanwei["20","0"] } else if (columnLine.contains("varchar") || columnLine.contains(" text")|| columnLine.contains("char")
// //number(20) fanwei["20"] || columnLine.contains("clob")||columnLine.contains("blob")||columnLine.contains("json")) {
//如果括号里是1位或者2位且第二位为0则进行特殊处理。只有有小数位都设置为BigDecimal。 fieldClass = String.class.getSimpleName();
if((fanwei.length>1&&"0".equals(fanwei[1]))||fanwei.length==1){ } else if (columnLine.contains("decimal")||columnLine.contains(" number")) {
int length=Integer.parseInt(fanwei[0]); //2018-11-22 lshz0088 建议对number类型增加intlongBigDecimal的区分判断
if(fanwei.length>1) { //如果startKh大于等于0则表示有设置取值范围
length=Integer.valueOf(fanwei[1]); int startKh=columnLine.indexOf("(");
} if(startKh>=0){
//数字范围9位及一下用Integer大的用Long int endKh=columnLine.indexOf(")",startKh);
if(length<=9){ String[] fanwei=columnLine.substring(startKh+1,endKh).split("");
fieldClass = Integer.class.getSimpleName(); //2019-1-5 zhengk 修复@arthaschan反馈的超出范围错误
}else{ //System.out.println("fanwei"+ JSON.toJSONString(fanwei));
fieldClass = Long.class.getSimpleName(); // //number(20,6) fanwei["20","6"]
} // //number(0,6) fanwei["0","6"]
}else{ // //number(20,0) fanwei["20","0"]
//有小数位数一律使用BigDecimal // //number(20) fanwei["20"]
fieldClass = BigDecimal.class.getSimpleName(); //如果括号里是1位或者2位且第二位为0则进行特殊处理。只有有小数位都设置为BigDecimal。
} if((fanwei.length>1&&"0".equals(fanwei[1]))||fanwei.length==1){
}else{ int length=Integer.parseInt(fanwei[0]);
fieldClass = BigDecimal.class.getSimpleName(); if(fanwei.length>1) {
} length=Integer.valueOf(fanwei[1]);
} else if (columnLine.contains("boolean")) { }
//20190910 MOSHOW.K.ZHENG 新增对boolean的处理感谢@violinxsc的反馈以及修复tinyint类型字段无法生成boolean类型问题感谢@hahaYhui的反馈 //数字范围9位及一下用Integer大的用Long
fieldClass = Boolean.class.getSimpleName(); if(length<=9){
} else if (columnLine.contains("tinyint") ) { fieldClass = Integer.class.getSimpleName();
//20191115 MOSHOW.K.ZHENG 支持对tinyint的特殊处理 }else{
fieldClass=tinyintTransType; fieldClass = Long.class.getSimpleName();
} else { }
fieldClass = String.class.getSimpleName(); }else{
} //有小数位数一律使用BigDecimal
fieldClass = BigDecimal.class.getSimpleName();
// field commentMySQL的一般位于field行而pgsql和oralce多位于后面。 }
String fieldComment = null; }else{
if(tableSql.contains("comment on column")&&(tableSql.contains("."+columnName+" is ")||tableSql.contains(".`"+columnName+"` is"))){ fieldClass = BigDecimal.class.getSimpleName();
//新增对pgsql/oracle的字段备注支持 }
//COMMENT ON COLUMN public.check_info.check_name IS '检查者名称'; } else if (columnLine.contains("boolean")) {
//2018-11-22 lshz0088 正则表达式的点号前面应该加上两个反斜杠,否则会认为是任意字符 //20190910 MOSHOW.K.ZHENG 新增对boolean的处理感谢@violinxsc的反馈以及修复tinyint类型字段无法生成boolean类型问题感谢@hahaYhui的反馈
//2019-4-29 zhengkai 优化对oracle注释comment on column的支持@liukex fieldClass = Boolean.class.getSimpleName();
tableSql=tableSql.replaceAll(".`"+columnName+"` is","."+columnName+" is"); } else if (columnLine.contains("tinyint") ) {
Matcher columnCommentMatcher = Pattern.compile("\\."+columnName+" is `").matcher(tableSql); //20191115 MOSHOW.K.ZHENG 支持对tinyint的特殊处理
fieldComment=columnName; fieldClass=tinyintTransType;
while(columnCommentMatcher.find()){ } else {
String columnCommentTmp = columnCommentMatcher.group(); fieldClass = String.class.getSimpleName();
System.out.println(columnCommentTmp); }
fieldComment = tableSql.substring(tableSql.indexOf(columnCommentTmp)+columnCommentTmp.length()).trim();
fieldComment = fieldComment.substring(0,fieldComment.indexOf("`")).trim(); // field commentMySQL的一般位于field行而pgsql和oralce多位于后面。
} String fieldComment = null;
}else if (columnLine.contains("comment")) { if(tableSql.contains("comment on column")&&(tableSql.contains("."+columnName+" is ")||tableSql.contains(".`"+columnName+"` is"))){
String commentTmp = columnLine.substring(columnLine.indexOf("comment")+7).trim(); //新增对pgsql/oracle的字段备注支持
// '用户ID', //COMMENT ON COLUMN public.check_info.check_name IS '检查者名称';
if (commentTmp.contains("`") || commentTmp.indexOf("`")!=commentTmp.lastIndexOf("`")) { //2018-11-22 lshz0088 正则表达式的点号前面应该加上两个反斜杠,否则会认为是任意字符
commentTmp = commentTmp.substring(commentTmp.indexOf("`")+1, commentTmp.lastIndexOf("`")); //2019-4-29 zhengkai 优化对oracle注释comment on column的支持@liukex
} tableSql=tableSql.replaceAll(".`"+columnName+"` is","."+columnName+" is");
//解决最后一句是评论,无主键且连着)的问题:album_id int(3) default '1' null comment '相册id0 代表头像 1代表照片墙') Matcher columnCommentMatcher = Pattern.compile("\\."+columnName+" is `").matcher(tableSql);
if(commentTmp.contains(")")){ fieldComment=columnName;
commentTmp = commentTmp.substring(0, commentTmp.lastIndexOf(")")+1); while(columnCommentMatcher.find()){
} String columnCommentTmp = columnCommentMatcher.group();
fieldComment = commentTmp; System.out.println(columnCommentTmp);
}else{ fieldComment = tableSql.substring(tableSql.indexOf(columnCommentTmp)+columnCommentTmp.length()).trim();
//修复comment不存在导致报错的问题 fieldComment = fieldComment.substring(0,fieldComment.indexOf("`")).trim();
fieldComment = columnName; }
} }else if (columnLine.contains("comment")) {
String commentTmp = columnLine.substring(columnLine.indexOf("comment")+7).trim();
FieldInfo fieldInfo = new FieldInfo(); // '用户ID',
fieldInfo.setColumnName(columnName); if (commentTmp.contains("`") || commentTmp.indexOf("`")!=commentTmp.lastIndexOf("`")) {
fieldInfo.setFieldName(fieldName); commentTmp = commentTmp.substring(commentTmp.indexOf("`")+1, commentTmp.lastIndexOf("`"));
fieldInfo.setFieldClass(fieldClass); }
fieldInfo.setFieldComment(fieldComment); //解决最后一句是评论,无主键且连着)的问题:album_id int(3) default '1' null comment '相册id0 代表头像 1代表照片墙')
if(commentTmp.contains(")")){
fieldList.add(fieldInfo); commentTmp = commentTmp.substring(0, commentTmp.lastIndexOf(")")+1);
} }
} fieldComment = commentTmp;
} }else{
//修复comment不存在导致报错的问题
if (fieldList.size() < 1) { fieldComment = columnName;
throw new CodeGenerateException("表结构分析失败请检查语句或者提交issue给我"); }
}
FieldInfo fieldInfo = new FieldInfo();
ClassInfo codeJavaInfo = new ClassInfo(); fieldInfo.setColumnName(columnName);
codeJavaInfo.setTableName(tableName); fieldInfo.setFieldName(fieldName);
codeJavaInfo.setClassName(className); fieldInfo.setFieldClass(fieldClass);
codeJavaInfo.setClassComment(classComment); fieldInfo.setFieldComment(fieldComment);
codeJavaInfo.setFieldList(fieldList);
fieldList.add(fieldInfo);
return codeJavaInfo; }
} }
}
}
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<FieldInfo> fieldList = new ArrayList<FieldInfo>();
//return classInfo
ClassInfo codeJavaInfo = new ClassInfo();
//匹配整个ddl将ddl分为表名列sql部分表注释
String DDL_PATTEN_STR="\\s*create\\s+table\\s+(?<tableName>\\S+)[^\\(]*\\((?<columnsSQL>[\\s\\S]+)\\)[^\\)]+?(comment\\s*(=|on\\s+table)\\s*'(?<tableComment>.*?)'\\s*;?)?$";
Pattern DDL_PATTERN = Pattern.compile(DDL_PATTEN_STR, Pattern.CASE_INSENSITIVE);
//匹配列sql部分分别解析每一列的列名 类型 和列注释
String COL_PATTERN_STR="\\s*(?<fieldName>\\S+)\\s+(?<fieldType>\\w+)\\s*(?:\\([\\s\\d,]+\\))?((?!comment).)*(comment\\s*'(?<fieldComment>.*?)')?\\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<FieldInfo> processJsonObjectToFieldList(JSONObject jsonObject){
// field List
List<FieldInfo> fieldList = new ArrayList<FieldInfo>();
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;
}
}

View File

@@ -2,17 +2,25 @@ server:
port: 1234 port: 1234
servlet: servlet:
context-path: /generator context-path: /generator
tomcat: #tomcat:
remote-ip-header: x-forward-for # remote-ip-header: x-forward-for
uri-encoding: UTF-8 # uri-encoding: UTF-8
max-threads: 10 # max-threads: 10
background-processor-delay: 30 # background-processor-delay: 30
basedir: ${user.home}/tomcat/ # 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: spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
banner: banner:
charset: UTF-8 charset: UTF-8
http: http:

View File

@@ -0,0 +1 @@
{"version": "20191229"}

View File

@@ -9,6 +9,7 @@ import java.util.List;
*/ */
@Data @Data
public class ${classInfo.className} implements Serializable { public class ${classInfo.className} implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>
@@ -23,4 +24,4 @@ public class ${classInfo.className} implements Serializable {
} }
</#if> </#if>
} }

View File

@@ -1,8 +1,16 @@
import java.io.Serializable; package ${packageName}.entity;
import javax.persistence.*;
import lombok.Data; import lombok.Data;
import java.util.Date; import java.util.Date;
import java.util.List; 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} * ${classInfo.classComment}
@@ -11,8 +19,11 @@ import java.util.List;
@Entity @Entity
@Data @Data
@Table(name="${classInfo.tableName}") @Table(name="${classInfo.tableName}")
@ApiModel("${classInfo.classComment}")
public class ${classInfo.className} implements Serializable { public class ${classInfo.className} implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@Id @Id
@GeneratedValue @GeneratedValue
<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>
@@ -20,6 +31,8 @@ public class ${classInfo.className} implements Serializable {
/** /**
* ${fieldItem.fieldComment} * ${fieldItem.fieldComment}
*/ */
@ApiModelProperty("${fieldItem.fieldComment}")
@Column("${fieldItem.columnName}")
private ${fieldItem.fieldClass} ${fieldItem.fieldName}; private ${fieldItem.fieldClass} ${fieldItem.fieldName};
</#list> </#list>
@@ -27,4 +40,4 @@ public class ${classInfo.className} implements Serializable {
} }
</#if> </#if>
} }

View File

@@ -7,6 +7,7 @@ import java.util.List;
* @author ${authorName} ${.now?string('yyyy-MM-dd')} * @author ${authorName} ${.now?string('yyyy-MM-dd')}
*/ */
public class ${classInfo.className} implements Serializable { public class ${classInfo.className} implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>
@@ -34,4 +35,4 @@ public class ${classInfo.className} implements Serializable {
</#list> </#list>
</#if> </#if>
} }

View File

@@ -0,0 +1,7 @@
<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>
{
<#list classInfo.fieldList as fieldItem>
"${fieldItem.fieldName}":""<#if fieldItem_has_next>,</#if>
</#list>
}
</#if>

View File

@@ -13,4 +13,9 @@ ${fieldItem.fieldClass} ${fieldItem.fieldName} = ${classInfo.className?uncap_fir
// ${fieldItem.fieldComment} // ${fieldItem.fieldComment}
${classInfo.className?uncap_first}.set${fieldItem.fieldName?cap_first}(); ${classInfo.className?uncap_first}.set${fieldItem.fieldName?cap_first}();
</#list> </#list>
<#list classInfo.fieldList as fieldItem>
// ${fieldItem.fieldComment}
${classInfo.className?uncap_first}.set${fieldItem.fieldName?cap_first}(${classInfo.className?uncap_first}2.get${fieldItem.fieldName?cap_first}(););
</#list>
</#if> </#if>

View File

@@ -0,0 +1,11 @@
<!--
${classInfo.classComment}对象Get Set
@author ${authorName} ${.now?string('yyyy-MM-dd')}
-->
<#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0>
<${classInfo.className}>
<#list classInfo.fieldList as fieldItem>
<${fieldItem.fieldName}></${fieldItem.fieldName}>
</#list>
</${classInfo.className}>
</#if>

View File

@@ -16,6 +16,8 @@
<link href="//cdn.staticfile.org/codemirror/5.48.4/codemirror.min.css" rel="stylesheet"> <link href="//cdn.staticfile.org/codemirror/5.48.4/codemirror.min.css" rel="stylesheet">
<link href="//cdn.bootcss.com/jquery-toast-plugin/1.3.2/jquery.toast.min.css" rel="stylesheet">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]> <!--[if lt IE 9]>
@@ -32,10 +34,10 @@
<script src="//cdn.staticfile.org/jquery/3.4.1/jquery.min.js"></script> <script src="//cdn.staticfile.org/jquery/3.4.1/jquery.min.js"></script>
<!-- Bootstrap --> <!-- Bootstrap -->
<script src="//cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script> <script src="//cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
<script src="//cdn.bootcss.com/jquery-toast-plugin/1.3.2/jquery.toast.min.js"></script>
<!-- FastClick --> <!-- FastClick -->
<script src="//cdn.staticfile.org/fastclick/1.0.6/fastclick.min.js"></script> <script src="//cdn.staticfile.org/fastclick/1.0.6/fastclick.min.js"></script>
<script src="//cdn.staticfile.org/jQuery-slimScroll/1.3.8/jquery.slimscroll.min.js"></script> <script src="//cdn.staticfile.org/jQuery-slimScroll/1.3.8/jquery.slimscroll.min.js"></script>
<script src="//cdn.staticfile.org/layer/2.3/layer.js"></script>
<script src="//cdn.staticfile.org/codemirror/5.48.4/codemirror.min.js"></script> <script src="//cdn.staticfile.org/codemirror/5.48.4/codemirror.min.js"></script>
<script src="//cdn.staticfile.org/codemirror/5.48.4/addon/display/placeholder.min.js"></script> <script src="//cdn.staticfile.org/codemirror/5.48.4/addon/display/placeholder.min.js"></script>
<script src="//cdn.staticfile.org/codemirror/5.48.4/mode/clike/clike.min.js"></script> <script src="//cdn.staticfile.org/codemirror/5.48.4/mode/clike/clike.min.js"></script>

View File

@@ -1,316 +1,371 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>SQL转Java JPA、MYBATIS实现类代码生成平台</title> <title>SQL转Java JPA、MYBATIS实现类代码生成平台</title>
<meta name="keywords" content="sql转实体类,sql转DAO,SQL转service,SQL转JPA实现,SQL转MYBATIS实现"> <meta name="keywords" content="sql转实体类,sql转DAO,SQL转service,SQL转JPA实现,SQL转MYBATIS实现">
<#import "common/common-import.ftl" as netCommon> <#import "common/common-import.ftl" as netCommon>
<@netCommon.commonStyle /> <@netCommon.commonStyle />
<@netCommon.commonScript /> <@netCommon.commonScript />
<#--<script src="${request.contextPath}/static/js/index-new.js"></script>--> <script>
<script>
<@netCommon.viewerCounter />
<@netCommon.viewerCounter />
$(function () {
$(function () { /**
/** * 初始化 table sql 3
* 初始化 table sql 3 */
*/ var ddlSqlArea = CodeMirror.fromTextArea(document.getElementById("ddlSqlArea"), {
var ddlSqlArea = CodeMirror.fromTextArea(document.getElementById("ddlSqlArea"), { lineNumbers: true,
lineNumbers: true, matchBrackets: true,
matchBrackets: true, mode: "text/x-sql",
mode: "text/x-sql", lineWrapping:false,
lineWrapping:false, readOnly:false,
readOnly:false, foldGutter: true,
foldGutter: true, //keyMap:"sublime",
gutters:["CodeMirror-linenumbers", "CodeMirror-foldgutter"] gutters:["CodeMirror-linenumbers", "CodeMirror-foldgutter"]
}); });
ddlSqlArea.setSize('auto','auto'); ddlSqlArea.setSize('auto','auto');
// controller_ide // controller_ide
var genCodeArea = CodeMirror.fromTextArea(document.getElementById("genCodeArea"), { var genCodeArea = CodeMirror.fromTextArea(document.getElementById("genCodeArea"), {
lineNumbers: true, lineNumbers: true,
matchBrackets: true, matchBrackets: true,
mode: "text/x-java", mode: "text/x-java",
lineWrapping:true, lineWrapping:true,
readOnly:true, readOnly:false,
foldGutter: true, foldGutter: true,
gutters:["CodeMirror-linenumbers", "CodeMirror-foldgutter"] //keyMap:"sublime",
}); gutters:["CodeMirror-linenumbers", "CodeMirror-foldgutter"]
genCodeArea.setSize('auto','auto'); });
genCodeArea.setSize('auto','auto');
var codeData;
var codeData;
/** // 使用var jsonObj = $("#formId").serializeObject();
* 生成代码 $.fn.serializeObject = function()
*/ {
$('#btnGenCode').click(function () { var o = {};
var a = this.serializeArray();
var tableSql = ddlSqlArea.getValue(); $.each(a, function() {
$.ajax({ if (o[this.name]) {
type: 'POST', if (!o[this.name].push) {
url: base_url + "/genCode", o[this.name] = [o[this.name]];
data: { }
"tableSql": tableSql, o[this.name].push(this.value || '');
"packageName":$("#packageName").val(), } else {
"returnUtil":$("#returnUtil").val(), o[this.name] = this.value || '';
"authorName":$("#authorName").val(), }
"isUnderLineToCamelCase":$("#isUnderLineToCamelCase").val() });
}, return o;
dataType: "json", };
success: function (data) { /**
if (data.code == 200) { * 生成代码
layer.msg("代码生成成功"); */
codeData = data.data; $('#btnGenCode').click(function () {
genCodeArea.setValue(codeData.beetlentity); var jsonData = {
genCodeArea.setSize('auto', 'auto'); "tableSql": ddlSqlArea.getValue(),
} else { "packageName":$("#packageName").val(),
layer.open({ "returnUtil":$("#returnUtil").val(),
icon: '2', "authorName":$("#authorName").val(),
content: (data.msg || '代码生成失败') "dataType":$("#dataType").val(),
}); "tinyintTransType":$("#tinyintTransType").val(),
} "nameCaseType":$("#nameCaseType").val()
} };
}); $.ajax({
}); type: 'POST',
/** url: base_url + "/genCode",
* 按钮事件组 data:(JSON.stringify(jsonData)),
*/ dataType: "json",
$('.generator').bind('click', function () { contentType: "application/json",
if (!$.isEmptyObject(codeData)) { success: function (data) {
var id = this.id; if (data.code === 200) {
genCodeArea.setValue(codeData[id]); codeData = data.data;
genCodeArea.setSize('auto', 'auto'); genCodeArea.setValue(codeData.beetlentity);
} genCodeArea.setSize('auto', 'auto');
}); $.toast("√ 代码生成成功");
/** } else {
* 捐赠 $.toast("× 代码生成失败 :"+data.msg);
*/ }
function donate(){ }
layer.open({ });
type: 1, return false;
area : ['712px' , '480px'], });
shadeClose: true, //点击遮罩关闭 /**
content: '<img src="http://upyun.bejson.com/img/zhengkai.png"></img>' * 按钮事件组
}); */
} $('.generator').bind('click', function () {
$('#donate1').on('click', function(){ if (!$.isEmptyObject(codeData)) {
donate(); var id = this.id;
}); genCodeArea.setValue(codeData[id]);
$('#donate2').on('click', function(){ genCodeArea.setSize('auto', 'auto');
donate(); }
}); });
$('#btnCopy').on('click', function(){ /**
if(!$.isEmptyObject(genCodeArea.getValue())&&!$.isEmptyObject(navigator)&&!$.isEmptyObject(navigator.clipboard)){ * 捐赠
navigator.clipboard.writeText(genCodeArea.getValue()); */
layer.msg("复制成功"); function donate(){
} if($("#donate").attr("show")=="no"){
}); $("#donate").html('<img src="http://upyun.bejson.com/img/zhengkai.png"></img>');
$("#donate").attr("show","yes");
}); }else{
</script> $("#donate").html('<p>谢谢赞赏!</p>');
</head> $("#donate").attr("show","no");
<body style="background-color: #e9ecef"> }
}
<div class="container"> $('#donate1').on('click', function(){
<nav class="navbar navbar-dark bg-primary btn-lg"> donate();
<a class="navbar-brand" href="http://www.bejson.com">BeJSON在线工具站</a> });
<ul class="nav navbar-nav"> $('#donate2').on('click', function(){
<li class="nav-item active"> donate();
<a class="nav-link" href="http://zhengkai.blog.csdn.net">大狼狗CSDN</a> });
</li> $('#btnCopy').on('click', function(){
</ul> if(!$.isEmptyObject(genCodeArea.getValue())&&!$.isEmptyObject(navigator)&&!$.isEmptyObject(navigator.clipboard)){
</nav> navigator.clipboard.writeText(genCodeArea.getValue());
</div> $.toast("√ 复制成功");
}
<!-- Main jumbotron for a primary marketing message or call to action --> });
<div class="jumbotron">
<div class="container"> function getVersion(){
<h2>Spring Boot Code Generator!</h2> var gitVersion ;
<p class="lead"> $.ajax({
√基于SpringBoot2+Freemarker的代码生成器√以释放双手为目的√支持mysql/oracle/pgsql三大数据库<br> type: 'GET',
√用DDL-SQL语句生成JPA/JdbcTemplate/Mybatis/MybatisPlus/BeetlSQL相关代码。<br> url: "https://raw.githubusercontent.com/moshowgame/SpringBootCodeGenerator/master/generator-web/src/main/resources/static/version.json",
欢迎大家多多提交模板和交流想法如果发现有SQL语句不能识别请<a href="https://github.com/moshowgame/SpringBootCodeGenerator/issues">留言</a>,同时欢迎大家提<a href="https://github.com/moshowgame/SpringBootCodeGenerator/pulls">PR</a>和<a href="#" id="donate1">点击赞赏</a>,谢谢! dataType: "json",
</p> success: function (data) {
<hr> gitVersion = data.version;
<div class="input-group mb-3"> $.ajax({
<div class="input-group-prepend"> type: 'GET',
<span class="input-group-text">作者名称</span> url: base_url + "/static/version.json",
</div> dataType: "json",
<input type="text" class="form-control" id="authorName" name="authorName" placeholder="大狼狗"> success: function (data) {
<div class="input-group-prepend"> $.toast("#当前版本:"+data.version+" | github:"+gitVersion);
<span class="input-group-text">返回封装</span> }
</div> });
<input type="text" class="form-control" id="returnUtil" name="returnUtil" placeholder="ApiReturnObject"> }
<div class="input-group-prepend"> });
<span class="input-group-text">包名路径</span> }
</div> $('#version').on('click', function(){
<input type="text" class="form-control" id="packageName" name="packageName" placeholder="com.softdev.system"> getVersion();
</div> });
<div class="input-group mb-3"> });
<div class="input-group-prepend"> </script>
<span class="input-group-text">tinyint转换类型</span> </head>
</div> <body style="background-color: #e9ecef">
<select type="text" class="form-control" id="tinyintTransType"
name="tinyintTransType"> <div class="container">
<option value="boolean">boolean</option> <nav class="navbar navbar-dark bg-primary btn-lg">
<option value="Boolean">Boolean</option> <a class="navbar-brand" href="http://www.bejson.com">BeJSON在线工具站</a>
<option value="Integer">Integer</option> <ul class="nav navbar-nav">
<option value="int">int</option> <li class="nav-item active">
</select> <a class="nav-link" href="http://zhengkai.blog.csdn.net">大狼狗CSDN</a>
<div class="input-group-prepend"> </li>
<span class="input-group-text">是否转换下划线为驼峰</span> </ul>
</div> </nav>
<select type="text" class="form-control" id="isUnderLineToCamelCase" </div>
name="isUnderLineToCamelCase">
<option value="true">转换</option> <!-- Main jumbotron for a primary marketing message or call to action -->
<option value="false">不转换</option> <div class="jumbotron">
</select> <div class="container">
</div> <h2>Spring Boot Code Generator!</h2>
<textarea id="ddlSqlArea" placeholder="请输入表结构信息..." class="form-control btn-lg" style="height: 250px;"> <p class="lead">
CREATE TABLE `userinfo` ( √基于SpringBoot2+Freemarker的代码生成器√以释放双手为目的√支持mysql/oracle/pgsql三大数据库<br>
`user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', √用DDL-SQL语句生成JPA/JdbcTemplate/Mybatis/MybatisPlus/BeetlSQL相关代码。<br>
`username` varchar(255) NOT NULL COMMENT '用户名', 如果发现有SQL语句不能识别请<a href="https://github.com/moshowgame/SpringBootCodeGenerator/issues">留言</a>,同时欢迎大家提<a href="https://github.com/moshowgame/SpringBootCodeGenerator/pulls">PR</a>和<a href="#" id="donate1">赞赏</a>,谢谢!<a id="version" href="#">查看版本</a>
`addtime` datetime NOT NULL COMMENT '创建时间', </p>
PRIMARY KEY (`user_id`) <div id="donate" class="container" show="no"></div>
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息' <hr>
</textarea><br> <div class="input-group mb-3">
<p><button class="btn btn-primary btn-lg disabled" id="btnGenCode" role="button">开始生成 »</button> <button class="btn alert-secondary" id="btnCopy">一键复制</button></p> <div class="input-group-prepend">
<hr> <span class="input-group-text">作者名称</span>
<!-- Example row of columns --> </div>
<div class="row" style="margin-top: 10px;"> <input type="text" class="form-control" id="authorName" name="authorName" value="大狼狗">
<div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups"> <div class="input-group-prepend">
<div class="input-group"> <span class="input-group-text">返回封装</span>
<div class="input-group-prepend"> </div>
<div class="btn btn-secondary disabled" id="btnGroupAddon">通用实体</div> <input type="text" class="form-control" id="returnUtil" name="returnUtil" value="ApiReturnObject">
</div> <div class="input-group-prepend">
</div> <span class="input-group-text">包名路径</span>
<div class="btn-group" role="group" aria-label="First group"> </div>
<button type="button" class="btn btn-default generator" id="model">entity(set/get)</button> <input type="text" class="form-control" id="packageName" name="packageName" value="com.softdev.system">
<button type="button" class="btn btn-default generator" id="beetlentity">entity(lombok)</button> </div>
</div> <div class="input-group mb-3">
</div> <div class="input-group-prepend">
<div class="btn-toolbar col-md-7" role="toolbar" aria-label="Toolbar with button groups"> <span class="input-group-text">数据类型</span>
<div class="input-group"> </div>
<div class="input-group-prepend"> <select type="text" class="form-control" id="dataType"
<div class="btn btn-secondary disabled" id="btnGroupAddon">Mybatis</div> name="dataType">
</div> <option value="sql">sql</option>
</div> <option value="json">json</option>
<div class="btn-group" role="group" aria-label="First group"> <option value="sql-regex">sql-regex</option>
<button type="button" class="btn btn-default generator" id="mybatis">mybatis</button> </select>
<button type="button" class="btn btn-default generator" id="mapper">mapper</button> <div class="input-group-prepend">
<button type="button" class="btn btn-default generator" id="service">service</button> <span class="input-group-text">tinyint转换类型</span>
<button type="button" class="btn btn-default generator" id="service_impl">service_impl</button> </div>
<button type="button" class="btn btn-default generator" id="controller">controller</button> <select type="text" class="form-control" id="tinyintTransType"
</div> name="tinyintTransType">
</div> <option value="boolean">boolean</option>
</div> <option value="Boolean">Boolean</option>
<!-- Example row of columns --> <option value="Integer">Integer</option>
<div class="row" style="margin-top: 10px;"> <option value="int">int</option>
<div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups"> <option value="String">String</option>
<div class="input-group"> </select>
<div class="input-group-prepend"> <div class="input-group-prepend">
<div class="btn btn-secondary disabled" id="btnGroupAddon">MybatisPlus</div> <span class="input-group-text">命名转换规则</span>
</div> </div>
</div> <select type="text" class="form-control" id="nameCaseType"
<div class="btn-group" role="group" aria-label="First group"> name="nameCaseType">
<button type="button" class="btn btn-default generator" id="plusmapper">mapper</button> <option value="CamelCase">驼峰</option>
<button type="button" class="btn btn-default generator" id="pluscontroller">controller</button> <option value="UnderScoreCase">下划线</option>
</div> <#--<option value="UpperUnderScoreCase">大写下划线</option>-->
</div> </select>
</div>
<div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups"> <textarea id="ddlSqlArea" placeholder="请输入表结构信息..." class="form-control btn-lg" style="height: 250px;">
<div class="input-group"> CREATE TABLE 'userinfo' (
<div class="input-group-prepend"> 'user_id' int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
<div class="btn btn-secondary disabled" id="btnGroupAddon">UI</div> 'username' varchar(255) NOT NULL COMMENT '用户名',
</div> 'addtime' datetime NOT NULL COMMENT '创建时间',
</div> PRIMARY KEY ('user_id')
<div class="btn-group" role="group" aria-label="First group"> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息'
<button type="button" class="btn btn-default generator" id="swagger-ui">swagger-ui</button> </textarea><br>
<button type="button" class="btn btn-default generator" id="element-ui">element-ui</button> <p><button class="btn btn-primary btn-lg disabled" id="btnGenCode" role="button" data-toggle="popover" data-content="">开始生成 »</button> <button class="btn alert-secondary" id="btnCopy">一键复制</button></p>
<button type="button" class="btn btn-default generator" id="bootstrap-ui">bootstrap-ui</button> <hr>
</div> <!-- Example row of columns -->
</div> <div class="row" style="margin-top: 10px;">
</div> <div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups">
<div class="input-group">
<div class="row" style="margin-top: 10px;"> <div class="input-group-prepend">
<div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups"> <div class="btn btn-secondary disabled setWidth" id="btnGroupAddon">通用实体</div>
<div class="input-group"> </div>
<div class="input-group-prepend"> </div>
<div class="btn btn-secondary disabled" id="btnGroupAddon">BeetlSQL</div> <div class="btn-group" role="group" aria-label="First group">
</div> <button type="button" class="btn btn-default generator" id="model">entity(set/get)</button>
</div> <button type="button" class="btn btn-default generator" id="beetlentity">entity(lombok)</button>
<div class="btn-group" role="group" aria-label="First group"> </div>
<button type="button" class="btn btn-default generator" id="beetlmd">beetlmd</button> </div>
<button type="button" class="btn btn-default generator" id="beetlcontroller">beetlcontroller</button> <div class="btn-toolbar col-md-7" role="toolbar" aria-label="Toolbar with button groups">
</div> <div class="input-group">
</div> <div class="input-group-prepend">
<div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups"> <div class="btn btn-secondary disabled setWidth" id="btnGroupAddon">Mybatis</div>
<div class="input-group"> </div>
<div class="input-group-prepend"> </div>
<div class="btn btn-secondary disabled" id="btnGroupAddon">JPA</div> <div class="btn-group" role="group" aria-label="First group">
</div> <button type="button" class="btn btn-default generator" id="mybatis">mybatis</button>
</div> <button type="button" class="btn btn-default generator" id="mapper">mapper</button>
<div class="btn-group" role="group" aria-label="First group"> <button type="button" class="btn btn-default generator" id="service">service</button>
<button type="button" class="btn btn-default generator" id="entity">jpa-entity</button> <button type="button" class="btn btn-default generator" id="service_impl">service_impl</button>
<button type="button" class="btn btn-default generator" id="repository">repository</button> <button type="button" class="btn btn-default generator" id="controller">controller</button>
<button type="button" class="btn btn-default generator" id="jpacontroller">controller</button> </div>
</div> </div>
</div> </div>
</div> <!-- Example row of columns -->
<div class="row" style="margin-top: 10px;"> <div class="row" style="margin-top: 10px;">
<div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups"> <div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups">
<div class="input-group"> <div class="input-group">
<div class="input-group-prepend"> <div class="input-group-prepend">
<div class="btn btn-secondary disabled" id="btnGroupAddon">JdbcTemplate</div> <div class="btn btn-secondary disabled setWidth" id="btnGroupAddon">MybatisPlus</div>
</div> </div>
</div> </div>
<div class="btn-group" role="group" aria-label="First group"> <div class="btn-group" role="group" aria-label="First group">
<button type="button" class="btn btn-default generator" id="jtdaoimpl">daoimpl</button> <button type="button" class="btn btn-default generator" id="plusmapper">mapper</button>
<button type="button" class="btn btn-default generator" id="jtdao">dao</button> <button type="button" class="btn btn-default generator" id="pluscontroller">controller</button>
</div> </div>
</div> </div>
<div class="btn-toolbar col-md-7" role="toolbar" aria-label="Toolbar with button groups">
<div class="input-group"> <div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups">
<div class="input-group-prepend"> <div class="input-group">
<div class="btn btn-secondary disabled" id="btnGroupAddon">SQL</div> <div class="input-group-prepend">
</div> <div class="btn btn-secondary disabled setWidth" id="btnGroupAddon">UI</div>
</div> </div>
<div class="btn-group" role="group" aria-label="First group"> </div>
<button type="button" class="btn btn-default generator" id="select">select</button> <div class="btn-group" role="group" aria-label="First group">
<button type="button" class="btn btn-default generator" id="insert">insert</button> <button type="button" class="btn btn-default generator" id="swagger-ui">swagger-ui</button>
<button type="button" class="btn btn-default generator" id="update">update</button> <button type="button" class="btn btn-default generator" id="element-ui">element-ui</button>
<button type="button" class="btn btn-default generator" id="delete">delete</button> <button type="button" class="btn btn-default generator" id="bootstrap-ui">bootstrap-ui</button>
</div> </div>
</div> </div>
</div> </div>
<div class="row" style="margin-top: 10px;">
<div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups"> <div class="row" style="margin-top: 10px;">
<div class="input-group"> <div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups">
<div class="input-group-prepend"> <div class="input-group">
<div class="btn btn-secondary disabled" id="btnGroupAddon">DTO</div> <div class="input-group-prepend">
</div> <div class="btn btn-secondary disabled setWidth" id="btnGroupAddon">BeetlSQL</div>
</div> </div>
<div class="btn-group" role="group" aria-label="First group"> </div>
<button type="button" class="btn btn-default generator" id="beetlentitydto">entitydto(lombok+swagger)</button> <div class="btn-group" role="group" aria-label="First group">
</div> <button type="button" class="btn btn-default generator" id="beetlmd">beetlmd</button>
</div> <button type="button" class="btn btn-default generator" id="beetlcontroller">beetlcontroller</button>
<div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups"> </div>
<div class="input-group"> </div>
<div class="input-group-prepend"> <div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups">
<div class="btn btn-secondary disabled" id="btnGroupAddon">Util</div> <div class="input-group">
</div> <div class="input-group-prepend">
</div> <div class="btn btn-secondary disabled setWidth" id="btnGroupAddon">JPA</div>
<div class="btn-group" role="group" aria-label="First group"> </div>
<button type="button" class="btn btn-default generator" id="util">bean get set</button> </div>
</div> <div class="btn-group" role="group" aria-label="First group">
</div> <button type="button" class="btn btn-default generator" id="entity">jpa-entity</button>
</div> <button type="button" class="btn btn-default generator" id="repository">repository</button>
<hr> <button type="button" class="btn btn-default generator" id="jpacontroller">controller</button>
<textarea id="genCodeArea" class="form-control btn-lg" ></textarea> </div>
</div> </div>
</div> </div>
<@netCommon.commonFooter /> <div class="row" style="margin-top: 10px;">
</body> <div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups">
</html> <div class="input-group">
<div class="input-group-prepend">
<div class="btn btn-secondary disabled setWidth" id="btnGroupAddon">JdbcTemplate</div>
</div>
</div>
<div class="btn-group" role="group" aria-label="First group">
<button type="button" class="btn btn-default generator" id="jtdaoimpl">daoimpl</button>
<button type="button" class="btn btn-default generator" id="jtdao">dao</button>
</div>
</div>
<div class="btn-toolbar col-md-7" role="toolbar" aria-label="Toolbar with button groups">
<div class="input-group">
<div class="input-group-prepend">
<div class="btn btn-secondary disabled setWidth" id="btnGroupAddon">SQL</div>
</div>
</div>
<div class="btn-group" role="group" aria-label="First group">
<button type="button" class="btn btn-default generator" id="select">select</button>
<button type="button" class="btn btn-default generator" id="insert">insert</button>
<button type="button" class="btn btn-default generator" id="update">update</button>
<button type="button" class="btn btn-default generator" id="delete">delete</button>
</div>
</div>
</div>
<div class="row" style="margin-top: 10px;">
<div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups">
<div class="input-group">
<div class="input-group-prepend">
<div class="btn btn-secondary disabled setWidth" id="btnGroupAddon">DTO</div>
</div>
</div>
<div class="btn-group" role="group" aria-label="First group">
<button type="button" class="btn btn-default generator" id="beetlentitydto">entitydto(lombok+swagger)</button>
</div>
</div>
<div class="btn-toolbar col-md-5" role="toolbar" aria-label="Toolbar with button groups">
<div class="input-group">
<div class="input-group-prepend">
<div class="btn btn-secondary disabled setWidth" id="btnGroupAddon">Util</div>
</div>
</div>
<div class="btn-group" role="group" aria-label="First group">
<button type="button" class="btn btn-default generator" id="util">bean get set</button>
<button type="button" class="btn btn-default generator" id="json">json</button>
<button type="button" class="btn btn-default generator" id="xml">xml</button>
</div>
</div>
</div>
<hr>
<textarea id="genCodeArea" class="form-control btn-lg" ></textarea>
</div>
</div>
<@netCommon.commonFooter />
</body>
</html>

24
pom.xml
View File

@@ -5,7 +5,7 @@
<groupId>com.softdev.system</groupId> <groupId>com.softdev.system</groupId>
<artifactId>SpringBootCodeGenerator</artifactId> <artifactId>SpringBootCodeGenerator</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>2.0</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<parent> <parent>
@@ -31,6 +31,18 @@
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
<!-- 排除Tomcat依赖 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加 Undertow依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
@@ -67,7 +79,7 @@
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
<version>4.6.1</version> <version>5.0.6</version>
</dependency> </dependency>
<!-- lombok --> <!-- lombok -->
@@ -134,7 +146,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version> <version>3.8.1</version>
<configuration> <configuration>
<skip>true</skip> <skip>true</skip>
<compilerId>javac</compilerId> <compilerId>javac</compilerId>
@@ -156,13 +168,13 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId> <artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version> <version>3.1.0</version>
<configuration> <configuration>
<!--<failOnMissingWebXml>false</failOnMissingWebXml>--> <!--<failOnMissingWebXml>false</failOnMissingWebXml>-->
<includeEmptyDirs>true</includeEmptyDirs> <includeEmptyDirs>true</includeEmptyDirs>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <!--<plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId> <artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version> <version>2.1.1</version>
@@ -170,7 +182,7 @@
<failOnMissingWebXml>false</failOnMissingWebXml> <failOnMissingWebXml>false</failOnMissingWebXml>
<warSourceExcludes>upload/**</warSourceExcludes> <warSourceExcludes>upload/**</warSourceExcludes>
</configuration> </configuration>
</plugin> </plugin>-->
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>