diff --git a/README.md b/README.md index f8d3924..10f1ecf 100644 --- a/README.md +++ b/README.md @@ -6,36 +6,37 @@ SpringBootCodeGenerator ---- -基于SpringBoot2+Freemarker的代码生成器,用DDL SQL语句生成JPA/JdbcTemplate/Mybatis/BeetlSQL相关代码,支持mysql/oracle/pgsql等三大数据库。以释放双手为目的,各大模板也在陆续补充和优化。欢迎大家Issue提交模板和交流想法,也欢迎提交PullRequest! -

+√基于SpringBoot2+Freemarker的代码生成器,√以释放双手为目的,√支持mysql/oracle/pgsql三大数据库,
+√用DDL-SQL语句生成JPA/JdbcTemplate/Mybatis/MybatisPlus/BeetlSQL相关代码。

另外,感谢bejson三叔将他部署在 http://java.bejson.com/generator 上,目前是besjon专供工具(线上版本不一定是最新的,会有延迟,请谅解,谢谢)。

- + + - + - - - - - - - - - - - - + + + + + + + + + + + + - - + + @@ -61,6 +62,5 @@ SpringBootCodeGenerator - -
访问路径 http://127.0.0.1:1234/generator
在线地址 http://java.bejson.com/generator
CSDN博客 http://blog.csdn.net/moshowgame
CSDN博客 http://zhengkai.blog.csdn.net
更新日期 更新内容
201911151.添加tinyint类型转换(感谢@lixiliang&@liujiansgit的Suggestion) 2.添加一键复制功能(感谢@gaohanghang的Suggestion) 3.Mybatis的insert增加keyProperty="id"用于返回自增id(感谢@88888888888888888888的Suggestion) 4.优化date类型的支持(感谢@SteveLsf的反馈) 5.其他一些优化.
20191015修复jdbcTemplates中insert语句第一个字段丢失的问题。
201909151.添加对象getset模板 2.添加sql模板 3.启动类添加日志输出,方便项目使用(感谢@gaohanghang 的pull request)
201909151.添加对象getset模板 2.添加sql模板 3.启动类添加日志输出,方便项目使用(感谢@gaohanghang 的pull request)
20190910-2优化以及更新Maven依赖,减少打包体积。
20190910-11.修复mapper接口load方法,但是xml中方法不匹配问题 2.移除mapper中CRUD时的@param 注解,会影响xml的解析(感谢@caojiantao的反馈)。3.优化MyBatis的xml文件对Oracle的支持。(感谢@wylove1992的反馈) 4.新增对boolean的处理(感谢@violinxsc的反馈)以及优化tinyint类型生成boolean类型问题(感谢@hahaYhui的反馈)
20190909添加是否下划线转换为驼峰的选择(感谢@youngking28 的pull request)。
201905181.优化注释 2.修改 mybatis模板中 controller注解 3.修改 mybatis模板中 dao文件使用为 mapper文件 4.修改 mybatis模板中 service实现类中的一个 bug 5.修改 index.ftl文件中 mybatis模板的 dao -> mapper(感谢@unqin的pull request)
20190511优化mybatis模块的dao和xml模板,修改dao接口注解为@Repository,所有dao参数改为包装类,删除update语句最后的UpdateTime = NOW(),修改dao接口文件的方法注释使其更符合javaDoc的标准,修改insert语句增加插入行主键的返回,修改load的方法名为selectByPrimaryKey,修改xml的update语句新增动态if判空,修改xml的insert语句新增动态插入判空,更符合mybatisGenerator标准(感谢@Archer-Wen的贡献 )。
20190429新增返回封装工具类设置,优化对oracle注释comment on column的支持(感谢@liukex反馈),优化对普通和特殊storage关键字的判断(感谢@AhHeadFloating的反馈 )。
20190211提交gitignore,解决StringUtils.lowerCaseFirst潜在的NPE异常,校验修改为@RequestParam参数校验,lombok之@Data和@Slf4j优化,fix JdbcDAO模板类名显示为中文问题,WebMvcConfig整合MessageConverter,模板代码分类(感谢@liutf和@tfgzs的pull request)。
20190210实体生成规则切换为包装类型,不再采用基本数据类型,为实体类生成添加显示的默认构造方法(感谢@h2so的pull request)。
20190106修复处理number/decimal(x,x)类型的逻辑(感谢@arthaschan的反馈),修复JdbcTemplates模板两处错误(感谢@everflourish的反馈)。
20181212首页UI优化,新增MybatisPlus模块(感谢@三叔同事的建议),修复作者名和包名获取失败问题(感谢@Yanch1994的反馈)。
20181122优化正则表达式点号的处理,优化处理字段类型,对number类型增加int,long,BigDecimal的区分判断(感谢@lshz0088的指导)。
20181108修复非字段描述"KEY FK_xxxx (xxxx)"导致生成KEY字段情况(感谢@tornadoorz反馈)。
20181018支持double(x,x)的类型,以及comment里面包含一些特殊字符的处理(感谢@tanwubo的反馈)。
20190910-11.修复mapper接口load方法,但是xml中方法不匹配问题 2.移除mapper中CRUD时的@param 注解,会影响xml的解析(感谢@caojiantao的反馈)。3.优化MyBatis的xml文件对Oracle的支持。(感谢@wylove1992的反馈) 4.新增对boolean的处理(感谢@violinxsc的反馈)以及优化tinyint类型生成boolean类型问题(感谢@hahaYhui的反馈)
20190909添加是否下划线转换为驼峰的选择(感谢@youngking28 的pull request)。
201905181.优化注释 2.修改 mybatis模板中 controller注解 3.修改 mybatis模板中 dao文件使用为 mapper文件 4.修改 mybatis模板中 service实现类中的一个 bug 5.修改 index.ftl文件中 mybatis模板的 dao -> mapper(感谢@unqin的pull request)
20190511优化mybatis模块的dao和xml模板,修改dao接口注解为@Repository,所有dao参数改为包装类,删除update语句最后的UpdateTime = NOW(),修改dao接口文件的方法注释使其更符合javaDoc的标准,修改insert语句增加插入行主键的返回,修改load的方法名为selectByPrimaryKey,修改xml的update语句新增动态if判空,修改xml的insert语句新增动态插入判空,更符合mybatisGenerator标准(感谢@Archer-Wen的贡献 )。
20190429新增返回封装工具类设置,优化对oracle注释comment on column的支持(感谢@liukex反馈),优化对普通和特殊storage关键字的判断(感谢@AhHeadFloating的反馈 )。
20190211提交gitignore,解决StringUtils.lowerCaseFirst潜在的NPE异常,校验修改为@RequestParam参数校验,lombok之@Data和@Slf4j优化,fix JdbcDAO模板类名显示为中文问题,WebMvcConfig整合MessageConverter,模板代码分类(感谢@liutf和@tfgzs的pull request)。
20190210实体生成规则切换为包装类型,不再采用基本数据类型,为实体类生成添加显示的默认构造方法(感谢@h2so的pull request)。
20190106修复处理number/decimal(x,x)类型的逻辑(感谢@arthaschan的反馈),修复JdbcTemplates模板两处错误(感谢@everflourish的反馈)。
20181212首页UI优化,新增MybatisPlus模块(感谢@三叔同事的建议),修复作者名和包名获取失败问题(感谢@Yanch1994的反馈)。
20181122优化正则表达式点号的处理,优化处理字段类型,对number类型增加int,long,BigDecimal的区分判断(感谢@lshz0088的指导)。
20181108修复非字段描述"KEY FK_xxxx (xxxx)"导致生成KEY字段情况(感谢@tornadoorz反馈)。
20181018支持double(x,x)的类型,以及comment里面包含一些特殊字符的处理(感谢@tanwubo的反馈)。
20181010CDN变更,修复CDN不稳定导致网页js报错问题。
20181003新增element-ui/bootstrap生成。
20181002修复公共CDN之Layer.js404问题,导致项目无法生成。
20180927优化COMMENT提取逻辑,支持多种复杂情况的注释(感谢@raodeming的反馈)。
20180926全新BeetlSQL模块,以及一些小细节优化(感谢@三叔同事的建议)。
20180927优化COMMENT提取逻辑,支持多种复杂情况的注释(感谢@raodeming的反馈)。
20180926全新BeetlSQL模块,以及一些小细节优化(感谢@三叔同事的建议)。
20180925优化SQL表和字段备注的推断,包括pgsql/oralce的comment on column/table情况处理等。
20180918优化SQL类型推断。优化PrimaryKey判断。修复jpacontroller中Repository拼写错误问题。
20180917全新首页,静态文件全部采用CDN。新增jdbcTemplate模块。
+ diff --git a/codegenerator1.png b/codegenerator1.png index da53f3f..ad0fdbc 100644 Binary files a/codegenerator1.png and b/codegenerator1.png differ diff --git a/codegenerator2.png b/codegenerator2.png index baef35c..9e447a9 100644 Binary files a/codegenerator2.png and b/codegenerator2.png differ diff --git a/codegenerator3.png b/codegenerator3.png index 4988787..38fa897 100644 Binary files a/codegenerator3.png and b/codegenerator3.png differ diff --git a/codegenerator4.png b/codegenerator4.png deleted file mode 100644 index b77ec46..0000000 Binary files a/codegenerator4.png and /dev/null differ diff --git a/generator-web/src/main/java/com/softdev/system/generator/controller/IndexController.java b/generator-web/src/main/java/com/softdev/system/generator/controller/IndexController.java index 6f844dd..ce0e79c 100644 --- a/generator-web/src/main/java/com/softdev/system/generator/controller/IndexController.java +++ b/generator-web/src/main/java/com/softdev/system/generator/controller/IndexController.java @@ -2,8 +2,8 @@ package com.softdev.system.generator.controller; import com.softdev.system.generator.entity.ClassInfo; import com.softdev.system.generator.entity.ReturnT; -import com.softdev.system.generator.util.CodeGeneratorTool; import com.softdev.system.generator.util.FreemarkerTool; +import com.softdev.system.generator.util.TableParseUtil; import freemarker.template.TemplateException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -40,8 +40,9 @@ public class IndexController { @RequestParam(required = false, defaultValue = "大狼狗") String authorName, @RequestParam(required = false, defaultValue = "com.softdev.system")String packageName, @RequestParam(required = false, defaultValue = "ApiReturnUtil")String returnUtil, - @RequestParam(required = false, defaultValue = "true")boolean isUnderLineToCamelCase - ) { + @RequestParam(required = false, defaultValue = "true")boolean isUnderLineToCamelCase, + @RequestParam(required = false, defaultValue = "boolean")String tinyintTransType + ) { try { @@ -51,17 +52,17 @@ public class IndexController { } // parse table - ClassInfo classInfo = CodeGeneratorTool.processTableIntoClassInfo(tableSql, isUnderLineToCamelCase); + ClassInfo classInfo = TableParseUtil.processTableIntoClassInfo(tableSql, isUnderLineToCamelCase, tinyintTransType); // code genarete - Map params = new HashMap(); + Map params = new HashMap(8); params.put("classInfo", classInfo); params.put("authorName", authorName); params.put("packageName", packageName); params.put("returnUtil", returnUtil); // result - Map result = new HashMap(); + Map result = new HashMap(32); //UI result.put("swagger-ui", freemarkerTool.processString("code-generator/ui/swagger-ui.ftl", params)); diff --git a/generator-web/src/main/java/com/softdev/system/generator/util/CodeGeneratorTool.java b/generator-web/src/main/java/com/softdev/system/generator/util/CodeGeneratorTool.java deleted file mode 100644 index 3ef76f2..0000000 --- a/generator-web/src/main/java/com/softdev/system/generator/util/CodeGeneratorTool.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.softdev.system.generator.util; - - - -import com.softdev.system.generator.entity.ClassInfo; - -import java.io.IOException; - -/** - * code generate tool - * - * @author xuxueli 2018-04-25 16:29:58 - */ -public class CodeGeneratorTool { - - /** - * process Table Into ClassInfo - * - * @param tableSql - * @return - */ - public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnderLineToCamelCase) throws IOException { - return TableParseUtil.processTableIntoClassInfo(tableSql, isUnderLineToCamelCase); - } - -} \ No newline at end of file diff --git a/generator-web/src/main/java/com/softdev/system/generator/util/FreemarkerUtil.java b/generator-web/src/main/java/com/softdev/system/generator/util/FreemarkerUtil.java index 1377f9a..d281a1e 100644 --- a/generator-web/src/main/java/com/softdev/system/generator/util/FreemarkerUtil.java +++ b/generator-web/src/main/java/com/softdev/system/generator/util/FreemarkerUtil.java @@ -4,8 +4,7 @@ import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import freemarker.template.TemplateExceptionHandler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.IOException; @@ -18,8 +17,8 @@ import java.util.Map; * * @author xuxueli 2018-05-02 19:56:00 */ +@Slf4j public class FreemarkerUtil { - private static final Logger logger = LoggerFactory.getLogger(CodeGeneratorTool.class); /** * freemarker config @@ -40,7 +39,7 @@ public class FreemarkerUtil { freemarkerConfig.setLocale(Locale.CHINA); freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); } catch (IOException e) { - logger.error(e.getMessage(), e); + log.error(e.getMessage(), e); } } diff --git a/generator-web/src/main/java/com/softdev/system/generator/util/TableParseUtil.java b/generator-web/src/main/java/com/softdev/system/generator/util/TableParseUtil.java index b796a70..cd1fb15 100644 --- a/generator-web/src/main/java/com/softdev/system/generator/util/TableParseUtil.java +++ b/generator-web/src/main/java/com/softdev/system/generator/util/TableParseUtil.java @@ -24,7 +24,8 @@ public class TableParseUtil { * @param tableSql * @return */ - public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnderLineToCamelCase) throws IOException { + public static ClassInfo processTableIntoClassInfo(String tableSql, boolean isUnderLineToCamelCase,String tinyintTransType) + throws IOException { if (tableSql==null || tableSql.trim().length()==0) { throw new CodeGenerateException("Table structure can not be empty."); } @@ -41,7 +42,9 @@ public class TableParseUtil { } //新增处理create table if not exists members情况 - if (tableName.contains("if not exists")) tableName=tableName.replaceAll("if not exists",""); + if (tableName.contains("if not exists")) { + tableName=tableName.replaceAll("if not exists",""); + } if (tableName.contains("`")) { tableName = tableName.substring(tableName.indexOf("`")+1, tableName.lastIndexOf("`")); @@ -101,20 +104,22 @@ public class TableParseUtil { String fieldListTmp = tableSql.substring(tableSql.indexOf("(")+1, tableSql.lastIndexOf(")")); // 匹配 comment,替换备注里的小逗号, 防止不小心被当成切割符号切割 - Matcher matcher = Pattern.compile("comment `(.*?)\\`").matcher(fieldListTmp); // "\\{(.*?)\\}" - while(matcher.find()){ + String commentPattenStr1="comment `(.*?)\\`"; + Matcher matcher1 = Pattern.compile(commentPattenStr1).matcher(fieldListTmp); + while(matcher1.find()){ - String commentTmp = matcher.group(); + String commentTmp = matcher1.group(); //2018-9-27 zhengk 不替换,只处理,支持COMMENT评论里面多种注释 //commentTmp = commentTmp.replaceAll("\\ comment `|\\`", " "); // "\\{|\\}" if (commentTmp.contains(",")) { String commentTmpFinal = commentTmp.replaceAll(",", ","); - fieldListTmp = fieldListTmp.replace(matcher.group(), commentTmpFinal); + fieldListTmp = fieldListTmp.replace(matcher1.group(), commentTmpFinal); } } //2018-10-18 zhengkai 新增支持double(10, 2)等类型中有英文逗号的特殊情况 - Matcher matcher2 = Pattern.compile("\\`(.*?)\\`").matcher(fieldListTmp); // "\\{(.*?)\\}" + String commentPattenStr2="\\`(.*?)\\`"; + Matcher matcher2 = Pattern.compile(commentPattenStr2).matcher(fieldListTmp); while(matcher2.find()){ String commentTmp2 = matcher2.group(); if (commentTmp2.contains(",")) { @@ -123,7 +128,8 @@ public class TableParseUtil { } } //2018-10-18 zhengkai 新增支持double(10, 2)等类型中有英文逗号的特殊情况 - Matcher matcher3 = Pattern.compile("\\((.*?)\\)").matcher(fieldListTmp); // "\\{(.*?)\\}" + String commentPattenStr3="\\((.*?)\\)"; + Matcher matcher3 = Pattern.compile(commentPattenStr3).matcher(fieldListTmp); while(matcher3.find()){ String commentTmp3 = matcher3.group(); if (commentTmp3.contains(",")) { @@ -148,7 +154,6 @@ public class TableParseUtil { &&!columnLine.contains("pctincrease") &&!columnLine.contains("buffer_pool")&&!columnLine.contains("tablespace") &&!(columnLine.contains("primary")&&i>3)); - if (specialFlag){ //如果是oracle的number(x,x),可能出现最后分割残留的,x),这里做排除处理 if(columnLine.length()<5) {continue;} @@ -157,9 +162,8 @@ public class TableParseUtil { columnLine=columnLine.replaceAll("`"," ").replaceAll("\""," ").replaceAll("'","").replaceAll(" "," ").trim(); //如果遇到username varchar(65) default '' not null,这种情况,判断第一个空格是否比第一个引号前 columnName = columnLine.substring(0, columnLine.indexOf(" ")); - // field Name -// 2019-09-08 yj 添加是否下划线转换为驼峰的判断 + // 2019-09-08 yj 添加是否下划线转换为驼峰的判断 String fieldName; if(isUnderLineToCamelCase){ fieldName = StringUtils.lowerCaseFirst(StringUtils.underlineToCamelCase(columnName)); @@ -184,7 +188,7 @@ public class TableParseUtil { fieldClass = Float.class.getSimpleName(); } else if (columnLine.contains("double")) { fieldClass = Double.class.getSimpleName(); - } else if (columnLine.contains("datetime") || columnLine.contains("timestamp")) { + } else if (columnLine.contains("time") || columnLine.contains("date") || columnLine.contains("datetime") || columnLine.contains("timestamp")) { fieldClass = Date.class.getSimpleName(); } else if (columnLine.contains("varchar") || columnLine.contains(" text")|| columnLine.contains("char") || columnLine.contains("clob")||columnLine.contains("blob")||columnLine.contains("json")) { @@ -221,9 +225,12 @@ public class TableParseUtil { }else{ fieldClass = BigDecimal.class.getSimpleName(); } - } else if (columnLine.contains("boolean")|| columnLine.contains("tinyint") ) { + } else if (columnLine.contains("boolean")) { //20190910 MOSHOW.K.ZHENG 新增对boolean的处理(感谢@violinxsc的反馈)以及修复tinyint类型字段无法生成boolean类型问题(感谢@hahaYhui的反馈) fieldClass = Boolean.class.getSimpleName(); + } else if (columnLine.contains("tinyint") ) { + //20191115 MOSHOW.K.ZHENG 支持对tinyint的特殊处理 + fieldClass=tinyintTransType; } else { fieldClass = String.class.getSimpleName(); } diff --git a/generator-web/src/main/resources/templates/code-generator/mybatis/mybatis.ftl b/generator-web/src/main/resources/templates/code-generator/mybatis/mybatis.ftl index c3312e0..4765b68 100644 --- a/generator-web/src/main/resources/templates/code-generator/mybatis/mybatis.ftl +++ b/generator-web/src/main/resources/templates/code-generator/mybatis/mybatis.ftl @@ -19,7 +19,7 @@ - + INSERT INTO ${classInfo.tableName} <#if classInfo.fieldList?exists && classInfo.fieldList?size gt 0> diff --git a/generator-web/src/main/resources/templates/common/common-import.ftl b/generator-web/src/main/resources/templates/common/common-import.ftl index cb10e00..c307aae 100644 --- a/generator-web/src/main/resources/templates/common/common-import.ftl +++ b/generator-web/src/main/resources/templates/common/common-import.ftl @@ -8,13 +8,13 @@ - + - + - + - + @@ -28,33 +28,43 @@ <#macro commonScript> - - + - + - - - - - + + + + + <#macro commonFooter > - +
+ + + + +<#macro viewerCounter> +var _hmt = _hmt || []; +(function() { + //百度统计一下 + var hm = document.createElement("script"); + hm.src = "https://hm.baidu.com/hm.js?97fd5ca1a4298ac8349c7e0de9029a0f"; + var s = document.getElementsByTagName("script")[0]; + s.parentNode.insertBefore(hm, s); +})(); \ No newline at end of file diff --git a/generator-web/src/main/resources/templates/index.ftl b/generator-web/src/main/resources/templates/index.ftl index 4389580..4195e2e 100644 --- a/generator-web/src/main/resources/templates/index.ftl +++ b/generator-web/src/main/resources/templates/index.ftl @@ -4,14 +4,17 @@ SQL转Java JPA、MYBATIS实现类代码生成平台 + <#import "common/common-import.ftl" as netCommon> <@netCommon.commonStyle /> - <@netCommon.commonScript /> + <#----> @@ -110,7 +118,7 @@ BeJSON在线工具站 @@ -121,13 +129,20 @@

Spring Boot Code Generator!

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

+
作者名称
+
+ 返回封装 +
+
包名路径
@@ -135,11 +150,17 @@
- 返回封装 + tinyint转换类型
- +
- 是否下划线转换为驼峰 + 是否转换下划线为驼峰
- -
- -
- -
- - + <@netCommon.commonFooter />